Groups improvements
testing/ogGui-multibranch/pipeline/head This commit looks good
Details
|
@ -93,7 +93,7 @@
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div *ngIf="isMethod('torrent')" class="input-group">
|
<div *ngIf="isMethod('p2p')" class="input-group">
|
||||||
<mat-form-field appearance="fill" class="input-field">
|
<mat-form-field appearance="fill" class="input-field">
|
||||||
<mat-label i18n="@@p2pModeLabel">Modo P2P</mat-label>
|
<mat-label i18n="@@p2pModeLabel">Modo P2P</mat-label>
|
||||||
<mat-select [(ngModel)]="p2pMode" name="p2pMode">
|
<mat-select [(ngModel)]="p2pMode" name="p2pMode">
|
||||||
|
|
|
@ -1,9 +1,3 @@
|
||||||
.card-container {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
|
||||||
gap: 20px;
|
|
||||||
padding: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header-container {
|
.header-container {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -432,7 +426,7 @@ mat-tree mat-tree-node.disabled:hover {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 15px;
|
padding: 2px;
|
||||||
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -447,10 +441,6 @@ mat-tree mat-tree-node.disabled:hover {
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.client-details {
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.client-name {
|
.client-name {
|
||||||
display: block;
|
display: block;
|
||||||
font-size: 1.2em;
|
font-size: 1.2em;
|
||||||
|
@ -471,8 +461,8 @@ button[mat-raised-button] {
|
||||||
|
|
||||||
.clients-grid {
|
.clients-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
|
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
|
||||||
gap: 16px;
|
gap: 8px; /* Espaciado reducido entre cards */
|
||||||
}
|
}
|
||||||
|
|
||||||
.clients-list {
|
.clients-list {
|
||||||
|
@ -520,12 +510,6 @@ button[mat-raised-button] {
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.client-card {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.client-image {
|
.client-image {
|
||||||
width: 50px;
|
width: 50px;
|
||||||
height: 50px;
|
height: 50px;
|
||||||
|
@ -584,3 +568,28 @@ button[mat-raised-button] {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.client-item {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.client-card {
|
||||||
|
background: #ffffff;
|
||||||
|
border-radius: 6px;
|
||||||
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
padding: 8px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.client-image {
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
margin-top: 10px;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.client-details {
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -201,22 +201,17 @@
|
||||||
<div class="clients-grid" *ngIf="currentView === 'card'">
|
<div class="clients-grid" *ngIf="currentView === 'card'">
|
||||||
<div *ngFor="let client of selectedClients.data" class="client-item">
|
<div *ngFor="let client of selectedClients.data" class="client-item">
|
||||||
<div class="client-card">
|
<div class="client-card">
|
||||||
<img src="assets/images/client.png" alt="Client Icon" class="client-image" />
|
<img
|
||||||
|
[src]="'assets/images/ordenador_' + client.status + '.png'"
|
||||||
|
alt="Client Icon"
|
||||||
|
class="client-image" />
|
||||||
|
|
||||||
<div class="client-details">
|
<div class="client-details">
|
||||||
<span class="client-name">{{ client.name }}</span>
|
<span class="client-name">{{ client.name }}</span>
|
||||||
<span class="client-ip">{{ client.ip }}</span>
|
<span class="client-ip">{{ client.ip }}</span>
|
||||||
<div class="flex">
|
<span class="client-ip">{{ client.mac }}</span>
|
||||||
<mat-chip [ngClass]="{
|
|
||||||
'chip-og-live': client.status === 'og-live',
|
|
||||||
'chip-busy': client.status === 'busy',
|
|
||||||
'chip-windows': client.status === 'windows' || client.status === 'windows-session',
|
|
||||||
'chip-linux': client.status === 'linux' || client.status === 'linux-session',
|
|
||||||
'chip-macos': client.status === 'macos',
|
|
||||||
'chip-off': client.status === 'off'
|
|
||||||
}">
|
|
||||||
{{ client.status || 'off' }}
|
|
||||||
|
|
||||||
</mat-chip>
|
<div class="action-icons">
|
||||||
<button
|
<button
|
||||||
*ngIf="(!syncStatus || syncingClientId !== client.uuid)"
|
*ngIf="(!syncStatus || syncingClientId !== client.uuid)"
|
||||||
mat-icon-button color="primary"
|
mat-icon-button color="primary"
|
||||||
|
@ -229,28 +224,32 @@
|
||||||
mat-icon-button color="primary">
|
mat-icon-button color="primary">
|
||||||
<mat-spinner diameter="24"></mat-spinner>
|
<mat-spinner diameter="24"></mat-spinner>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
|
||||||
<button mat-raised-button color="primary" [matMenuTriggerFor]="clientMenu">Acciones</button>
|
<button mat-icon-button color="primary" (click)="onShowClientDetail($event, client)">
|
||||||
<mat-menu #clientMenu="matMenu">
|
|
||||||
<button mat-menu-item (click)="onEditClick($event, client.type, client.uuid)">
|
|
||||||
<mat-icon>edit</mat-icon>
|
|
||||||
<span>{{ 'edit' | translate }}</span>
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="onShowClientDetail($event, client)">
|
|
||||||
<mat-icon>visibility</mat-icon>
|
<mat-icon>visibility</mat-icon>
|
||||||
<span>{{ 'viewDetails' | translate }}</span>
|
|
||||||
</button>
|
</button>
|
||||||
<button mat-menu-item (click)="onDeleteClick($event, client, selectedNode)">
|
<button mat-icon-button color="primary">
|
||||||
<mat-icon>delete</mat-icon>
|
<mat-icon>more_vert</mat-icon>
|
||||||
<span>{{ 'delete' | translate }}</span>
|
|
||||||
</button>
|
</button>
|
||||||
</mat-menu>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="clients-table" *ngIf="currentView === 'list'">
|
<div class="clients-table" *ngIf="currentView === 'list'">
|
||||||
<table mat-table matSort [dataSource]="selectedClients" class="mat-elevation-z8">
|
<table mat-table matSort [dataSource]="selectedClients" class="mat-elevation-z8">
|
||||||
|
<ng-container matColumnDef="status">
|
||||||
|
<th mat-header-cell *matHeaderCellDef mat-sort-header> {{ 'status' | translate }} </th>
|
||||||
|
<td mat-cell *matCellDef="let client">
|
||||||
|
<img
|
||||||
|
[src]="'assets/images/ordenador_' + client.status + '.png'"
|
||||||
|
alt="Client Icon"
|
||||||
|
class="client-image" />
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="sync">
|
<ng-container matColumnDef="sync">
|
||||||
<th mat-header-cell *matHeaderCellDef mat-sort-header> {{ 'sync' | translate }} </th>
|
<th mat-header-cell *matHeaderCellDef mat-sort-header> {{ 'sync' | translate }} </th>
|
||||||
<td mat-cell *matCellDef="let client">
|
<td mat-cell *matCellDef="let client">
|
||||||
|
@ -282,22 +281,6 @@
|
||||||
<th mat-header-cell *matHeaderCellDef mat-sort-header> OG Live </th>
|
<th mat-header-cell *matHeaderCellDef mat-sort-header> OG Live </th>
|
||||||
<td mat-cell *matCellDef="let client"> {{ (client.ogLive?.filename || '').slice(0, 15) }}{{ (client.ogLive?.filename?.length > 15) ? '...' : '' }} </td>
|
<td mat-cell *matCellDef="let client"> {{ (client.ogLive?.filename || '').slice(0, 15) }}{{ (client.ogLive?.filename?.length > 15) ? '...' : '' }} </td>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-container matColumnDef="status">
|
|
||||||
<th mat-header-cell *matHeaderCellDef mat-sort-header> {{ 'status' | translate }} </th>
|
|
||||||
<td mat-cell *matCellDef="let client">
|
|
||||||
<mat-chip [ngClass]="{
|
|
||||||
'chip-og-live': client.status === 'og-live',
|
|
||||||
'chip-busy': client.status === 'busy',
|
|
||||||
'chip-windows': client.status === 'windows' || client.status === 'windows-session',
|
|
||||||
'chip-linux': client.status === 'linux' || client.status === 'linux-session',
|
|
||||||
'chip-macos': client.status === 'macos',
|
|
||||||
'chip-off': client.status === 'off'
|
|
||||||
}">
|
|
||||||
{{ client.status || 'off' }}
|
|
||||||
|
|
||||||
</mat-chip>
|
|
||||||
</td>
|
|
||||||
</ng-container>
|
|
||||||
|
|
||||||
<ng-container matColumnDef="maintenace">
|
<ng-container matColumnDef="maintenace">
|
||||||
<th mat-header-cell *matHeaderCellDef mat-sort-header> {{ 'maintenance' | translate }} </th>
|
<th mat-header-cell *matHeaderCellDef mat-sort-header> {{ 'maintenance' | translate }} </th>
|
||||||
|
@ -323,9 +306,6 @@
|
||||||
<button mat-icon-button [matMenuTriggerFor]="clientMenu">
|
<button mat-icon-button [matMenuTriggerFor]="clientMenu">
|
||||||
<mat-icon>more_vert</mat-icon>
|
<mat-icon>more_vert</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<mat-menu #clientMenu="matMenu">
|
<mat-menu #clientMenu="matMenu">
|
||||||
|
|
||||||
<mat-menu restoreFocus=false #commandMenu="matMenu" xPosition="before">
|
<mat-menu restoreFocus=false #commandMenu="matMenu" xPosition="before">
|
||||||
|
|
|
@ -63,7 +63,7 @@ export class GroupsComponent implements OnInit, OnDestroy {
|
||||||
syncingClientId: string | null = null;
|
syncingClientId: string | null = null;
|
||||||
private originalTreeData: TreeNode[] = [];
|
private originalTreeData: TreeNode[] = [];
|
||||||
|
|
||||||
displayedColumns: string[] = ['sync', 'name', 'oglive', 'status', 'subnet', 'pxeTemplate', 'parentName', 'actions'];
|
displayedColumns: string[] = ['status','sync', 'name', 'oglive', 'subnet', 'pxeTemplate', 'parentName', 'actions'];
|
||||||
|
|
||||||
private _sort!: MatSort;
|
private _sort!: MatSort;
|
||||||
private _paginator!: MatPaginator;
|
private _paginator!: MatPaginator;
|
||||||
|
|
|
@ -29,10 +29,9 @@ export class CreateOrganizationalUnitComponent implements OnInit {
|
||||||
{ name: 'Peer', value: 'p2p-mode-peer' },
|
{ name: 'Peer', value: 'p2p-mode-peer' },
|
||||||
{ name: 'Seeder', value: 'p2p-mode-seeder' },
|
{ name: 'Seeder', value: 'p2p-mode-seeder' },
|
||||||
];
|
];
|
||||||
multicastModeOptions: { name: string, value: string }[] = [
|
protected multicastModeOptions = [
|
||||||
{ name: 'Modo 1', value: 'mode1' },
|
{"name": 'Half duplex', "value": "half"},
|
||||||
{ name: 'Modo 2', value: 'mode2' },
|
{"name": 'Full duplex', "value": "full"},
|
||||||
{ name: 'Modo 3', value: 'mode3' },
|
|
||||||
];
|
];
|
||||||
parentUnits: any[] = [];
|
parentUnits: any[] = [];
|
||||||
hardwareProfiles: any[] = [];
|
hardwareProfiles: any[] = [];
|
||||||
|
|
|
@ -31,8 +31,8 @@ export class EditOrganizationalUnitComponent implements OnInit {
|
||||||
{"name": 'Seeder', "value": "p2p-mode-seeder"},
|
{"name": 'Seeder', "value": "p2p-mode-seeder"},
|
||||||
];
|
];
|
||||||
protected multicastModeOptions = [
|
protected multicastModeOptions = [
|
||||||
{"name": 'Half duplex', "value": "half-duplex"},
|
{"name": 'Half duplex', "value": "half"},
|
||||||
{"name": 'Full duplex', "value": "full-duplex"},
|
{"name": 'Full duplex', "value": "full"},
|
||||||
];
|
];
|
||||||
@Output() unitAdded = new EventEmitter();
|
@Output() unitAdded = new EventEmitter();
|
||||||
calendars: any;
|
calendars: any;
|
||||||
|
|
After Width: | Height: | Size: 778 B |
After Width: | Height: | Size: 762 B |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 729 B |
After Width: | Height: | Size: 746 B |
After Width: | Height: | Size: 901 B |
After Width: | Height: | Size: 778 B |
After Width: | Height: | Size: 756 B |
After Width: | Height: | Size: 733 B |
After Width: | Height: | Size: 747 B |