OpenVidu Server Dashborad update to Angular 15

pull/772/head
pabloFuente 2022-12-02 12:46:12 +01:00
parent 763c7cba26
commit 36c24fab7c
11 changed files with 3657 additions and 3089 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,40 +1,39 @@
{ {
"dependencies": { "dependencies": {
"@angular/animations": "14.2.12", "@angular/animations": "15.0.2",
"@angular/cdk": "14.2.7", "@angular/cdk": "15.0.1",
"@angular/common": "14.2.12", "@angular/common": "15.0.2",
"@angular/compiler": "14.2.12", "@angular/compiler": "15.0.2",
"@angular/core": "14.2.12", "@angular/core": "15.0.2",
"@angular/flex-layout": "14.0.0-beta.41", "@angular/forms": "15.0.2",
"@angular/forms": "14.2.12", "@angular/material": "15.0.1",
"@angular/material": "14.2.7", "@angular/platform-browser": "15.0.2",
"@angular/platform-browser": "14.2.12", "@angular/platform-browser-dynamic": "15.0.2",
"@angular/platform-browser-dynamic": "14.2.12", "@angular/router": "15.0.2",
"@angular/router": "14.2.12", "core-js": "3.26.1",
"core-js": "3.21.1", "jquery": "3.6.1",
"jquery": "3.6.0",
"openvidu-browser": "2.24.0", "openvidu-browser": "2.24.0",
"rxjs": "7.5.5", "rxjs": "7.5.7",
"tslib": "2.3.1", "tslib": "2.4.1",
"zone.js": "0.11.5" "zone.js": "0.12.0"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "14.2.10", "@angular-devkit/build-angular": "15.0.2",
"@angular/cli": "14.2.10", "@angular/cli": "15.0.2",
"@angular/compiler-cli": "14.2.12", "@angular/compiler-cli": "15.0.2",
"@angular/language-service": "14.2.12", "@angular/language-service": "15.0.2",
"@types/jasmine": "3.6.6", "@types/jasmine": "4.3.0",
"@types/node": "17.0.21", "@types/node": "18.11.10",
"codelyzer": "6.0.2", "codelyzer": "6.0.2",
"jasmine-core": "4.0.1", "jasmine-core": "4.5.0",
"jasmine-spec-reporter": "7.0.0", "jasmine-spec-reporter": "7.0.0",
"karma": "6.3.17", "karma": "6.4.1",
"karma-chrome-launcher": "3.1.1", "karma-chrome-launcher": "3.1.1",
"karma-coverage-istanbul-reporter": "3.0.3", "karma-coverage-istanbul-reporter": "3.0.3",
"karma-jasmine": "4.0.1", "karma-jasmine": "5.1.0",
"karma-jasmine-html-reporter": "1.7.0", "karma-jasmine-html-reporter": "2.0.0",
"protractor": "7.0.0", "protractor": "7.0.0",
"ts-node": "10.7.0", "ts-node": "10.9.1",
"tslint": "6.1.3", "tslint": "6.1.3",
"typescript": "4.8.4" "typescript": "4.8.4"
}, },
@ -48,7 +47,7 @@
"lint": "ng lint", "lint": "ng lint",
"ng": "ng", "ng": "ng",
"postinstall": "ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points", "postinstall": "ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points",
"start": "ng serve", "start": "ng serve --host 0.0.0.0 --ssl",
"test": "ng test" "test": "ng test"
}, },
"version": "0.0.0" "version": "0.0.0"

View File

@ -1,9 +1,9 @@
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MatDialogModule } from '@angular/material/dialog';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card'; import { MatCardModule } from '@angular/material/card';
import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatDialogModule } from '@angular/material/dialog';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { MatListModule } from '@angular/material/list'; import { MatListModule } from '@angular/material/list';

View File

@ -1,5 +1,4 @@
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { FlexLayoutModule } from '@angular/flex-layout';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import { BrowserModule } from '@angular/platform-browser'; import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component'; import { AppComponent } from './app.component';
@ -34,8 +33,7 @@ import { HttpClientModule } from '@angular/common/http';
FormsModule, FormsModule,
HttpClientModule, HttpClientModule,
routing, routing,
AppMaterialModule, AppMaterialModule
FlexLayoutModule
], ],
providers: [InfoService, RestService], providers: [InfoService, RestService],
bootstrap: [AppComponent] bootstrap: [AppComponent]

View File

@ -41,4 +41,4 @@ const appRoutes: Routes = [
} }
]; ];
export const routing: ModuleWithProviders<RouterModule> = RouterModule.forRoot(appRoutes, { useHash: true, relativeLinkResolution: 'legacy' }); export const routing: ModuleWithProviders<RouterModule> = RouterModule.forRoot(appRoutes, { useHash: true });

View File

@ -1,10 +1,34 @@
#dashboard-div { #dashboard-div {
height: 100%; height: 100%;
padding: 20px; padding: 20px;
display: flex;
flex-wrap: nowrap;
box-sizing: border-box;
column-gap: 20px;
}
#server-events {
flex-basis: 60%;
}
#server-video {
flex-basis: 30%;
}
.flex-item {
flex-grow: 1;
}
mat-card-header {
padding-bottom: 16px;
}
#toggle-switch {
margin-left: 10px;
} }
#log { #log {
height: 90%; height: 100%;
} }
#log-content { #log-content {
@ -22,6 +46,10 @@ ul {
text-transform: uppercase; text-transform: uppercase;
} }
mat-card {
background: white;
}
mat-card-title button.blue { mat-card-title button.blue {
color: #ffffff; color: #ffffff;
background-color: #0088aa; background-color: #0088aa;
@ -86,12 +114,48 @@ mat-spinner {
position: relative; position: relative;
} }
#msg-chain p:last-child {
margin-bottom: 0;
}
/* >xs */
@media screen and (min-width: 600px) {
#dashboard-div {
flex-direction: row;
}
}
/* xs */
@media screen and (max-width: 599px) { @media screen and (max-width: 599px) {
mat-card-title {
font-size: 20px; #dashboard-div {
flex-direction: column;
}
#server-events {
order: 2;
}
#server-video {
order: 1;
margin-bottom: 20px;
} }
} }
/* sm */
@media screen and (min-width: 600px) and (max-width: 959px) {}
/* md */
@media screen and (min-width: 960px) and (max-width: 1279px) {}
/* lg */
@media screen and (min-width: 1280px) and (max-width: 1919px) {}
/* xl */
@media screen and (min-width: 1920px) {}
/* Pure CSS loader */ /* Pure CSS loader */
@ -132,6 +196,7 @@ mat-spinner {
0% { 0% {
-webkit-transform: rotate(0deg); -webkit-transform: rotate(0deg);
} }
100% { 100% {
-webkit-transform: rotate(360deg); -webkit-transform: rotate(360deg);
} }
@ -141,6 +206,7 @@ mat-spinner {
0% { 0% {
transform: rotate(0deg); transform: rotate(0deg);
} }
100% { 100% {
transform: rotate(360deg); transform: rotate(360deg);
} }
@ -165,6 +231,7 @@ mat-spinner {
0% { 0% {
-webkit-transform: rotate(0deg); -webkit-transform: rotate(0deg);
} }
100% { 100% {
-webkit-transform: rotate(220deg); -webkit-transform: rotate(220deg);
} }
@ -174,6 +241,7 @@ mat-spinner {
0% { 0% {
transform: rotate(0deg); transform: rotate(0deg);
} }
100% { 100% {
transform: rotate(220deg); transform: rotate(220deg);
} }
@ -200,9 +268,11 @@ mat-spinner {
0% { 0% {
-webkit-transform: rotate(-140deg); -webkit-transform: rotate(-140deg);
} }
50% { 50% {
-webkit-transform: rotate(-160deg); -webkit-transform: rotate(-160deg);
} }
100% { 100% {
-webkit-transform: rotate(140deg); -webkit-transform: rotate(140deg);
} }
@ -212,9 +282,11 @@ mat-spinner {
0% { 0% {
transform: rotate(-140deg); transform: rotate(-140deg);
} }
50% { 50% {
transform: rotate(-160deg); transform: rotate(-160deg);
} }
100% { 100% {
transform: rotate(140deg); transform: rotate(140deg);
} }

View File

@ -1,12 +1,14 @@
<div id="dashboard-div" fxLayout="row" fxLayout.xs="column" fxLayoutGap="20px" fxLayoutGap.xs="20px"> <div id="dashboard-div" fxLayout.xs="column" fxLayoutGap="20px" fxLayoutGap.xs="20px">
<div fxFlex="66%" fxFlexOrder="1" fxFlexOrder.xs="2"> <div id="server-events" class="flex-item" fxFlexOrder="1" fxFlexOrder.xs="2">
<mat-card id="log"> <mat-card id="log">
<mat-card-header>
<mat-card-title>Server events <mat-card-title>Server events
<mat-slide-toggle title="Lock Scroll" [(ngModel)]="lockScroll" style="float: right; margin-left: auto;"> <mat-slide-toggle id="toggle-switch" title="Lock Scroll" [(ngModel)]="lockScroll">
<mat-icon>lock_outline</mat-icon> <mat-icon>lock_outline</mat-icon>
</mat-slide-toggle> </mat-slide-toggle>
</mat-card-title> </mat-card-title>
</mat-card-header>
<mat-divider></mat-divider> <mat-divider></mat-divider>
<mat-card-content #scrollMe id="log-content"> <mat-card-content #scrollMe id="log-content">
<ul> <ul>
@ -18,11 +20,16 @@
</mat-card> </mat-card>
</div> </div>
<div fxFlex="33%" fxFlex.xs="auto" fxFlexOrder="2" fxFlexOrder.xs="1"> <div id="server-video" class="flex-item" fxFlexOrder="2" fxFlexOrder.xs="1">
<mat-card id="video-loop"> <mat-card id="video-loop">
<mat-card-header>
<mat-card-title>Test the connection <mat-card-title>Test the connection
<button id="test-btn" mat-raised-button [ngClass]="testStatus == 'DISCONNECTED' ? 'blue' : (testStatus == 'PLAYING' ? 'yellow' : 'disabled')" (click)="toggleTestVideo()" [disabled]="testStatus==='CONNECTING' || testStatus==='CONNECTED'">{{testButton}}</button> <button id="test-btn" mat-raised-button
[ngClass]="testStatus == 'DISCONNECTED' ? 'blue' : (testStatus == 'PLAYING' ? 'yellow' : 'disabled')"
(click)="toggleTestVideo()"
[disabled]="testStatus==='CONNECTING' || testStatus==='CONNECTED'">{{testButton}}</button>
</mat-card-title> </mat-card-title>
</mat-card-header>
<mat-divider></mat-divider> <mat-divider></mat-divider>
<mat-card-content> <mat-card-content>
<div id="mirrored-video"> <div id="mirrored-video">
@ -30,19 +37,24 @@
<div class="loader-1 center"><span></span></div> <div class="loader-1 center"><span></span></div>
</div> </div>
<div *ngIf="session" id="tick-div"> <div *ngIf="session" id="tick-div">
<div id="tooltip-tick" *ngIf="testStatus=='PLAYING'" matTooltip="The connection is successful" matTooltipPosition="below"></div> <div id="tooltip-tick" *ngIf="testStatus=='PLAYING'" matTooltip="The connection is successful"
matTooltipPosition="below"></div>
<div [ngClass]="testStatus=='PLAYING' ? 'trigger drawn' : 'trigger'"></div> <div [ngClass]="testStatus=='PLAYING' ? 'trigger drawn' : 'trigger'"></div>
<svg version="1.1" id="tick" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" <svg version="1.1" id="tick" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="-1 -1 39 39" style="enable-background:new 0 0 37 37;" xml:space="preserve"> x="0px" y="0px" viewBox="-1 -1 39 39" style="enable-background:new 0 0 37 37;" xml:space="preserve">
<path class="circ path" style="fill:none;stroke:#06d362;stroke-width:4;stroke-linejoin:round;stroke-miterlimit:10;" d=" <path class="circ path"
M30.5,6.5L30.5,6.5c6.6,6.6,6.6,17.4,0,24l0,0c-6.6,6.6-17.4,6.6-24,0l0,0c-6.6-6.6-6.6-17.4,0-24l0,0C13.1-0.2,23.9-0.2,30.5,6.5z" style="fill:none;stroke:#06d362;stroke-width:4;stroke-linejoin:round;stroke-miterlimit:10;"
/> d="
<polyline class="tick path" style="fill:none;stroke:#06d362;stroke-width:4;stroke-linejoin:round;stroke-miterlimit:10;" points=" M30.5,6.5L30.5,6.5c6.6,6.6,6.6,17.4,0,24l0,0c-6.6,6.6-17.4,6.6-24,0l0,0c-6.6-6.6-6.6-17.4,0-24l0,0C13.1-0.2,23.9-0.2,30.5,6.5z" />
<polyline class="tick path"
style="fill:none;stroke:#06d362;stroke-width:4;stroke-linejoin:round;stroke-miterlimit:10;" points="
11.6,20 15.9,24.2 26.4,13.8 " /> 11.6,20 15.9,24.2 26.4,13.8 " />
</svg> </svg>
</div> </div>
</div> </div>
<div id="msg-chain"><p *ngFor="let msg of msgChain">{{msg}}</p></div> <div id="msg-chain">
<p *ngFor="let msg of msgChain">{{msg}}</p>
</div>
</mat-card-content> </mat-card-content>
</mat-card> </mat-card>
</div> </div>

View File

@ -6,6 +6,7 @@ body {
padding: 0; padding: 0;
background: #4d4d4d; background: #4d4d4d;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0.05); -webkit-tap-highlight-color: rgba(0, 0, 0, 0.05);
font-family: Roboto,Helvetica Neue,sans-serif;
} }
main { main {

View File

@ -14,7 +14,6 @@ import {
// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. // Unfortunately there's no typing for the `__karma__` variable. Just declare it as any.
declare var __karma__: any; declare var __karma__: any;
declare var require: any;
// Prevent Karma from running prematurely. // Prevent Karma from running prematurely.
__karma__.loaded = function () {}; __karma__.loaded = function () {};
@ -26,9 +25,5 @@ getTestBed().initTestEnvironment(
teardown: { destroyAfterEach: false } teardown: { destroyAfterEach: false }
} }
); );
// Then we find all the tests.
const context = require.context('./', true, /\.spec\.ts$/);
// And load the modules.
context.keys().map(context);
// Finally, start Karma to run the tests. // Finally, start Karma to run the tests.
__karma__.start(); __karma__.start();

View File

@ -2,7 +2,6 @@
"extends": "../tsconfig.json", "extends": "../tsconfig.json",
"compilerOptions": { "compilerOptions": {
"outDir": "../out-tsc/spec", "outDir": "../out-tsc/spec",
"target": "es2020",
"baseUrl": "", "baseUrl": "",
"types": [ "types": [
"jasmine", "jasmine",

View File

@ -8,13 +8,14 @@
"declaration": false, "declaration": false,
"moduleResolution": "node", "moduleResolution": "node",
"experimentalDecorators": true, "experimentalDecorators": true,
"target": "es2020", "target": "ES2022",
"typeRoots": [ "typeRoots": [
"node_modules/@types" "node_modules/@types"
], ],
"lib": [ "lib": [
"es2016", "es2016",
"dom" "dom"
] ],
"useDefineForClassFields": false
} }
} }