aboutsummaryrefslogtreecommitdiff
path: root/frontend
diff options
context:
space:
mode:
authorDanijel Anđelković <adanijel99@gmail.com>2022-05-19 21:10:54 +0200
committerDanijel Anđelković <adanijel99@gmail.com>2022-05-19 21:10:54 +0200
commit07b6cce2538240db0de979e205bf56394b771fe4 (patch)
tree27c9baf4d7daced7bd716b5fa79f0da7264c3271 /frontend
parent40e4cf81dc29d2f3a44cd56a58a5181a64295d5f (diff)
parent8ce1b7f95b1464587b4f2d9518aaa714d4f76915 (diff)
Merge branch 'redesign' of http://gitlab.pmf.kg.ac.rs/igrannonica/neuronstellar into redesign
Diffstat (limited to 'frontend')
-rw-r--r--frontend/src/app/_data/Model.ts4
-rw-r--r--frontend/src/app/_data/Predictor.ts12
-rw-r--r--frontend/src/app/_elements/_charts/box-plot/box-plot.component.ts20
-rw-r--r--frontend/src/app/_elements/_charts/pie-chart/pie-chart.component.ts4
-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.html6
-rw-r--r--frontend/src/app/_elements/column-table/column-table.component.ts44
-rw-r--r--frontend/src/app/_elements/folder/folder.component.css2
-rw-r--r--frontend/src/app/_modals/alert-dialog/alert-dialog.component.html16
-rw-r--r--frontend/src/app/_modals/alert-dialog/alert-dialog.component.ts6
-rw-r--r--frontend/src/app/_modals/encoding-dialog/encoding-dialog.component.html20
-rw-r--r--frontend/src/app/_modals/missingvalues-dialog/missingvalues-dialog.component.css4
-rw-r--r--frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.html8
-rw-r--r--frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.ts9
-rw-r--r--frontend/src/app/_pages/experiment/experiment.component.css8
-rw-r--r--frontend/src/app/_pages/experiment/experiment.component.html26
-rw-r--r--frontend/src/app/_pages/experiment/experiment.component.ts2
-rw-r--r--frontend/src/app/app-routing.module.ts3
18 files changed, 132 insertions, 64 deletions
diff --git a/frontend/src/app/_data/Model.ts b/frontend/src/app/_data/Model.ts
index 8fc36a31..f527dc7f 100644
--- a/frontend/src/app/_data/Model.ts
+++ b/frontend/src/app/_data/Model.ts
@@ -117,8 +117,8 @@ export enum ActivationFunctionOutputLayer
export enum LossFunction {
// binary classification loss functions
BinaryCrossEntropy = 'binary_crossentropy',
- SquaredHingeLoss = 'squared_hinge_loss',
- HingeLoss = 'hinge_loss',
+ SquaredHingeLoss = 'squared_hinge',
+ HingeLoss = 'hinge',
// multi-class classification loss functions
CategoricalCrossEntropy = 'categorical_crossentropy',
SparseCategoricalCrossEntropy = 'sparse_categorical_crossentropy',
diff --git a/frontend/src/app/_data/Predictor.ts b/frontend/src/app/_data/Predictor.ts
index c839a635..8de4cd17 100644
--- a/frontend/src/app/_data/Predictor.ts
+++ b/frontend/src/app/_data/Predictor.ts
@@ -13,8 +13,16 @@ export default class Predictor extends FolderFile {
public experimentId: string = "",
public modelId: string = "",
public h5FileId: string = "",
- public metrics: Metric[] = [],
- public finalMetrics: Metric[] = []
+ public metricsLoss:number[]=[],
+ public metricsValLoss:number []=[],
+ public metricsAcc:number[]=[],
+ public metricsValAcc: number[]=[],
+ public metricsMae :number []=[],
+ public metricsValMae :number []=[],
+ public metricsMse : number[]=[],
+ public metricsValMse : number[]=[],
+ //public metrics: Metric[] = [],
+ //public finalMetrics: Metric[] = []
) {
super(name, dateCreated, dateCreated);
}
diff --git a/frontend/src/app/_elements/_charts/box-plot/box-plot.component.ts b/frontend/src/app/_elements/_charts/box-plot/box-plot.component.ts
index bf5e3fd6..07976da3 100644
--- a/frontend/src/app/_elements/_charts/box-plot/box-plot.component.ts
+++ b/frontend/src/app/_elements/_charts/box-plot/box-plot.component.ts
@@ -28,10 +28,28 @@ export class BoxPlotComponent implements AfterViewInit {
updateChart(min: number, max: number, q1: number, q3: number, median: number) {
if (this.myChart) {
this.boxplotData.datasets[0].data = [[min, q1, median, q3, max]]
- this.myChart.update();
+ this.myChart?.update();
}
+ /*this.boxplotData.datasets = [{
+ data: [[min, q1, median, q3, max]],
+ }]*/
+
};
+ /*
+ updatePieChart(uniqueValues: string[], uniqueValuesPercent: number[]){
+ //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('boxplot') chartRef!: ElementRef;
constructor() {
//this.updateChart();
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 cba5252a..9264e41c 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
@@ -58,10 +58,6 @@ export class PieChartComponent implements AfterViewInit {
data: data
,
options: {
- /*title: {
- display: true,
- text: 'Predicted world population (millions) in 2050'
- }*/
plugins:{
legend: {
display: false
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 f7f07e62..311773f7 100644
--- a/frontend/src/app/_elements/column-table/column-table.component.css
+++ b/frontend/src/app/_elements/column-table/column-table.component.css
@@ -22,7 +22,7 @@ table.fixed td {
table.fixed th {
overflow: hidden;
- max-width: 120px;
+ max-width: 250px;
min-width: 120px;
vertical-align: middle;
background-color: var(--ns-primary-50);
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 31c32dfd..e6a781be 100644
--- a/frontend/src/app/_elements/column-table/column-table.component.html
+++ b/frontend/src/app/_elements/column-table/column-table.component.html
@@ -35,7 +35,7 @@
</thead>
<tbody>
<tr *ngFor="let row of tableData; let i = index">
- <th>#{{i}}</th>
+ <th>#{{((this.begin/10)+1)*10-10+i+1}}</th>
<td *ngFor="let col of row; let j = index" [ngClass]="{'text-disabled' : !columnsChecked[j]}">
<div class="text-overflow">
{{col}}
@@ -200,7 +200,7 @@
</mat-menu>
</div>
<div *ngIf="colInfo.numNulls == 0" class="text-left">
- Nema null vrednosti.
+ Nema nedostajućih vrednosti.
</div>
</td>
</tr>
@@ -217,7 +217,7 @@
<div class="ns-col rounded">
<mat-form-field appearance="fill" class="align-items-center justify-content-center pt-3 w-100">
<mat-label>Izlazna kolona</mat-label>
- <mat-select [(value)]="experiment.outputColumn" (selectionChange)="changeProblemType()">
+ <mat-select [(value)]="experiment.outputColumn" (selectionChange)="outputColumnChanged()">
<mat-option *ngFor="let inputColumn of experiment.inputColumns" [value]="inputColumn">{{inputColumn}}</mat-option>
<mat-option *ngIf="experiment.inputColumns.length == 0" value="-">-</mat-option>
</mat-select>
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 ad78feaf..694b1a83 100644
--- a/frontend/src/app/_elements/column-table/column-table.component.ts
+++ b/frontend/src/app/_elements/column-table/column-table.component.ts
@@ -131,6 +131,7 @@ export class ColumnTableComponent implements AfterViewInit {
}
else {
this.dataset = dataset;
+ this.experimentChanged.emit();
this.columnsChecked = [];
this.dataset.columnInfo.forEach(column => {
if (this.experiment.inputColumns.find(x => x == column.columnName) != undefined)
@@ -157,9 +158,6 @@ export class ColumnTableComponent implements AfterViewInit {
this.resetPagging();
this.loadData();
this.loaded = true;
-
- this.updateCharts();
- this.updatePieChart();
}
loadData(){
@@ -249,6 +247,19 @@ export class ColumnTableComponent implements AfterViewInit {
}
}
+ outputColumnChanged() {
+ let outputColReplacer = this.experiment.nullValuesReplacers.find(x => x.column == this.experiment.outputColumn);
+ let index = this.experiment.nullValuesReplacers.findIndex(x => x.column == this.experiment.outputColumn);
+ if (outputColReplacer != undefined) {
+ outputColReplacer.option = NullValueOptions.DeleteRows;
+
+ let numOfRowsToDelete = (this.dataset!.columnInfo.filter(x => x.columnName == this.experiment.outputColumn)[0]).numNulls;
+ this.nullValOption[index] = "Obriši redove (" + numOfRowsToDelete + ")";
+ }
+
+ this.changeProblemType();
+ }
+
changeProblemType() {
if (this.experiment != undefined && this.dataset != undefined) {
let i = this.dataset.columnInfo.findIndex(x => x.columnName == this.experiment!.outputColumn);
@@ -300,14 +311,26 @@ export class ColumnTableComponent implements AfterViewInit {
if (selectedMissingValuesOption == NullValueOptions.DeleteColumns) {
this.experiment.nullValues = NullValueOptions.DeleteColumns;
+
+ let outputColReplacer = this.experiment.nullValuesReplacers.find(x => x.column == this.experiment.outputColumn);
+
this.experiment.nullValuesReplacers = [];
for (let i = 0; i < this.experiment.inputColumns.length; i++) {
- this.experiment.nullValuesReplacers.push({ //ovo zakomentarisano
- column: this.experiment.inputColumns[i],
- option: NullValueOptions.DeleteColumns,
- value: ""
- });
- this.nullValOption[i] = "Obriši kolonu";
+ if (this.experiment.inputColumns[i] != this.experiment.outputColumn) {
+ this.experiment.nullValuesReplacers.push({ //ovo zakomentarisano
+ column: this.experiment.inputColumns[i],
+ option: NullValueOptions.DeleteColumns,
+ value: ""
+ });
+ this.nullValOption[i] = "Obriši kolonu";
+ }
+ else {
+ if (outputColReplacer != undefined) {
+ this.experiment.nullValuesReplacers.push(outputColReplacer);
+ let numOfRowsToDelete = (this.dataset.columnInfo.filter(x => x.columnName == this.experiment!.inputColumns[i])[0]).numNulls;
+ this.nullValOption[i] = (outputColReplacer.option == NullValueOptions.DeleteRows) ? "Obriši redove (" + numOfRowsToDelete + ")" : "Popuni sa " + outputColReplacer.value + "";
+ }
+ }
}
//obrisi kolone koje sadrze nedostajuce vrednosti iz input kolona
/*for (let i = 0; i < this.dataset.columnInfo.length; i++) {
@@ -336,7 +359,8 @@ export class ColumnTableComponent implements AfterViewInit {
}
openMissingValuesDialog() {
const dialogRef = this.dialog.open(MissingvaluesDialogComponent, {
- width: '500px'
+ width: '500px',
+ panelClass: 'custom-modalbox'
});
dialogRef.afterClosed().subscribe(selectedMissingValuesOption => {
if (selectedMissingValuesOption != undefined)
diff --git a/frontend/src/app/_elements/folder/folder.component.css b/frontend/src/app/_elements/folder/folder.component.css
index 2b7892a3..97c13299 100644
--- a/frontend/src/app/_elements/folder/folder.component.css
+++ b/frontend/src/app/_elements/folder/folder.component.css
@@ -184,7 +184,7 @@
.file-bottom-buttons {
position: absolute;
- bottom: 15px;
+ bottom: 5px;
right: 4%;
display: flex;
flex-direction: row-reverse;
diff --git a/frontend/src/app/_modals/alert-dialog/alert-dialog.component.html b/frontend/src/app/_modals/alert-dialog/alert-dialog.component.html
index 2d7e4d86..84793260 100644
--- a/frontend/src/app/_modals/alert-dialog/alert-dialog.component.html
+++ b/frontend/src/app/_modals/alert-dialog/alert-dialog.component.html
@@ -1,9 +1,9 @@
-
-
- <h2 mat-dialog-title >{{data.title}}</h2>
- <div mat-dialog-content class="mt-4 text-offwhite" >
- {{data.message}}
- </div>
- <div mat-dialog-actions class="d-flex justify-content-center mt-4">
+<h2 mat-dialog-title>{{data.title}}</h2>
+<div mat-dialog-content class="mt-4 text-offwhite">
+ <form (keydown)="withEnterKey($event)">
+ {{data.message}}
+ </form>
+</div>
+<div mat-dialog-actions class="d-flex justify-content-center mt-4">
<button mat-raised-button cdkFocusInitial (click)="onOkClick()" color="basic">OK</button>
- </div> \ No newline at end of file
+</div> \ No newline at end of file
diff --git a/frontend/src/app/_modals/alert-dialog/alert-dialog.component.ts b/frontend/src/app/_modals/alert-dialog/alert-dialog.component.ts
index e15f3c6f..7558b527 100644
--- a/frontend/src/app/_modals/alert-dialog/alert-dialog.component.ts
+++ b/frontend/src/app/_modals/alert-dialog/alert-dialog.component.ts
@@ -20,9 +20,11 @@ export class AlertDialogComponent {
//public dialog: MatDialog
) {}
+ withEnterKey(keyboardEvent: KeyboardEvent) {
+ if (keyboardEvent.code == "Enter" || keyboardEvent.code == "NumpadEnter")
+ this.onOkClick();
+ }
onOkClick(): void {
this.dialogRef.close();
}
-
-
}
diff --git a/frontend/src/app/_modals/encoding-dialog/encoding-dialog.component.html b/frontend/src/app/_modals/encoding-dialog/encoding-dialog.component.html
index 08c1f26b..fed8f8d7 100644
--- a/frontend/src/app/_modals/encoding-dialog/encoding-dialog.component.html
+++ b/frontend/src/app/_modals/encoding-dialog/encoding-dialog.component.html
@@ -1,15 +1,17 @@
<h2 mat-dialog-title class="text-center">Enkodiranje svih kolona</h2>
<div mat-dialog-content class="mt-5 mb-4">
<p>Sve izabrane kolone biće enkodirane metodom:</p>
- <form (keydown)="withEnterKey($event)">
- <mat-form-field>
- <mat-select matNativeControl [(value)]="selectedEncodingType" cdkFocusInitial>
- <mat-option *ngFor="let option of Object.keys(Encoding); let optionName of Object.values(Encoding)" [value]="option">
- {{ optionName }}
- </mat-option>
- </mat-select>
- </mat-form-field>
- </form>
+ <div class="d-flex justify-content-center">
+ <form (keydown)="withEnterKey($event)">
+ <mat-form-field>
+ <mat-select matNativeControl [(value)]="selectedEncodingType" cdkFocusInitial>
+ <mat-option *ngFor="let option of Object.keys(Encoding); let optionName of Object.values(Encoding)" [value]="option">
+ {{ optionName }}
+ </mat-option>
+ </mat-select>
+ </mat-form-field>
+ </form>
+ </div>
</div>
<div mat-dialog-actions class="justify-content-center">
<button id="btnYes" mat-stroked-button color="basic" (click)="onYesClick()">Potvrdi</button>
diff --git a/frontend/src/app/_modals/missingvalues-dialog/missingvalues-dialog.component.css b/frontend/src/app/_modals/missingvalues-dialog/missingvalues-dialog.component.css
index e99a1e1e..64d7bd21 100644
--- a/frontend/src/app/_modals/missingvalues-dialog/missingvalues-dialog.component.css
+++ b/frontend/src/app/_modals/missingvalues-dialog/missingvalues-dialog.component.css
@@ -5,4 +5,8 @@
#btnNo {
color: gray;
+}
+
+::ng-deep.mat-dialog-content {
+ overflow: visible;
} \ No newline at end of file
diff --git a/frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.html b/frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.html
index 06e74093..77e7be42 100644
--- a/frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.html
+++ b/frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.html
@@ -1,8 +1,10 @@
<h2 mat-dialog-title class="text-muted">{{data.title}}</h2>
<div mat-dialog-content class="mt-4" style="color: rgb(81, 76, 76);">
- {{data.message}}
+ <form (keydown)="withEnterKey($event)">
+ {{data.message}}
+ </form>
</div>
<div mat-dialog-actions class="d-flex justify-content-center mt-4">
- <button mat-button cdkFocusInitial (click)="onYesClick()" style="background-color: lightgray;">Da</button>
- <button mat-button cdkFocusInitial (click)="onNoClick()" style="background-color: lightgray;">Ne</button>
+ <button mat-button cdkFocusInitial (click)="onYesClick()" style="background-color: lightgray;">Da</button>
+ <button mat-button cdkFocusInitial (click)="onNoClick()" style="background-color: lightgray;">Ne</button>
</div> \ No newline at end of file
diff --git a/frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.ts b/frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.ts
index de1cdd4f..a7db1e7f 100644
--- a/frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.ts
+++ b/frontend/src/app/_modals/yes-no-dialog/yes-no-dialog.component.ts
@@ -24,10 +24,13 @@ export class YesNoDialogComponent {
onNoClick(): void {
this.dialogRef.close();
}
- onYesClick():void{
+
+ withEnterKey(keyboardEvent: KeyboardEvent) {
+ if (keyboardEvent.code == "Enter" || keyboardEvent.code == "NumpadEnter")
+ this.onYesClick();
+ }
+ onYesClick():void {
this.data.yesFunction();
this.dialogRef.close();
}
-
-
}
diff --git a/frontend/src/app/_pages/experiment/experiment.component.css b/frontend/src/app/_pages/experiment/experiment.component.css
index 2298ae48..59e004e9 100644
--- a/frontend/src/app/_pages/experiment/experiment.component.css
+++ b/frontend/src/app/_pages/experiment/experiment.component.css
@@ -48,6 +48,7 @@ mat-stepper {
flex-direction: row;
justify-content: center;
align-items: center;
+ /*margin-bottom: 100px;*/
}
.step-content-inside {
@@ -66,4 +67,11 @@ mat-stepper {
.text-overflow {
overflow-wrap: break-word;
+ width: 170px;
+ display: inline-block;
+ text-align: left;
+}
+
+.text-overflow-experiment-name {
+ overflow-wrap: break-word;
} \ No newline at end of file
diff --git a/frontend/src/app/_pages/experiment/experiment.component.html b/frontend/src/app/_pages/experiment/experiment.component.html
index 8f462f86..17a6539d 100644
--- a/frontend/src/app/_pages/experiment/experiment.component.html
+++ b/frontend/src/app/_pages/experiment/experiment.component.html
@@ -2,10 +2,10 @@
<div class="d-flex flex-colum align-items-center sidenav">
<div>
<div class="ekspName " style="width: 250px;">
- <div class="text-overflow" *ngIf="experiment.name=='exp1'" style="width: 250px;">
+ <div class="text-overflow-experiment-name" *ngIf="experiment.name=='exp1'" style="width: 250px;">
Novi Eksperiment
</div>
- <div class="text-overflow" *ngIf="experiment.name!='exp1'" style="width: 250px;">
+ <div class="text-overflow-experiment-name" *ngIf="experiment.name!='exp1'" style="width: 250px;">
{{experiment.name}}
</div>
@@ -14,37 +14,37 @@
<mat-step [completed]="this.step1">
<!--editable="false"-->
<ng-template matStepLabel>
- <span class="label" *ngIf="dataset==undefined">Izvor podataka </span>
- <span class="label addedElement" *ngIf="dataset!=undefined">{{dataset.name}}</span>
+ <span class="label text-overflow" *ngIf="dataset==undefined">Izvor podataka </span>
+ <span class="label addedElement text-overflow" *ngIf="dataset!=undefined">{{dataset.name}}</span>
</ng-template>
<ng-template matStepContent>
- <p class="text-left">Izaberite izvor podataka</p>
+ <p class="text-left text-overflow">Izaberite izvor podataka</p>
</ng-template>
</mat-step>
<mat-step [completed]="experiment._id!=''">
<ng-template matStepLabel>
- <span class="label addedElement" *ngIf="experiment._id!=''">Predvideti:{{experiment.outputColumn}}</span>
+ <span class="label addedElement text-overflow" *ngIf="experiment._id!=''">Predvideti:{{experiment.outputColumn}}</span>
<span *ngIf="!this.step1" class="align-middle"><mat-icon>lock</mat-icon></span>
- <span class="label" *ngIf="experiment._id==''">Odabir kolona </span>
+ <span class="label text-overflow" *ngIf="experiment._id==''">Odabir kolona </span>
</ng-template>
<ng-template matStepContent>
- <p class="text-left">Pripremite podatke i izaberite izlazne kolone</p>
+ <p class="text-left text-overflow">Pripremite podatke i izaberite izlazne kolone</p>
</ng-template>
</mat-step>
<mat-step [completed]="this.step3">
<ng-template matStepLabel>
<span *ngIf="experiment._id==''" class="align-middle"><mat-icon>lock</mat-icon></span>
- <span class="label addedElement" *ngIf="modelToTrain!=undefined">{{modelToTrain.name}}</span>
- <span class="label" *ngIf="modelToTrain==undefined">Treniranje</span>
+ <span class="label addedElement text-overflow" *ngIf="modelToTrain!=undefined">{{modelToTrain.name}}</span>
+ <span class="label text-overflow" *ngIf="modelToTrain==undefined">Treniranje</span>
</ng-template>
- <p class="text-left">Odaberite parametre i trenirajte model</p>
+ <p class="text-left text-overflow">Odaberite parametre i trenirajte model</p>
</mat-step>
<mat-step [completed]="this.step4">
<ng-template matStepLabel>
<span *ngIf="!this.step3" class="align-middle"><mat-icon>lock</mat-icon></span>
- <span class="label">Pregled rezultata<br> treniranja</span>
+ <span class="label text-overflow align-middle">Pregled rezultata<br> treniranja</span>
</ng-template>
- <p class="text-left">Pregledajte tok treniranja i<br> grafički prikaz rezultata</p>
+ <p class="text-left text-overflow">Pregledajte tok treniranja i<br> grafički prikaz rezultata</p>
</mat-step>
</mat-stepper>
</div>
diff --git a/frontend/src/app/_pages/experiment/experiment.component.ts b/frontend/src/app/_pages/experiment/experiment.component.ts
index 161c619a..ee269f65 100644
--- a/frontend/src/app/_pages/experiment/experiment.component.ts
+++ b/frontend/src/app/_pages/experiment/experiment.component.ts
@@ -57,7 +57,7 @@ export class ExperimentComponent implements AfterViewInit, OnInit {
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) => {
diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts
index 8c60a666..56442842 100644
--- a/frontend/src/app/app-routing.module.ts
+++ b/frontend/src/app/app-routing.module.ts
@@ -18,7 +18,8 @@ const routes: Routes = [
{ path: 'archive', component: ArchiveComponent, data: { title: 'Arhiva' } },
{ path: 'profile', component: ProfileComponent, canActivate: [AuthGuardService], data: { title: 'Profil' } },
{ path: 'playground', component: PlaygroundComponent, data: { title: 'Zabava' } },
- { path: 'test', component: TestComponent, data: { title: 'Test' } }
+ { path: 'test', component: TestComponent, data: { title: 'Test' } },
+ { path: '**', redirectTo: '' }
];
@NgModule({