utn-cli 2.1.44 → 2.1.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/package.json +1 -1
  2. package/templates/backend/servicios/Nucleo/Miscelaneas.js +1 -1
  3. package/templates/frontend/src/app/Componentes/Nucleo/calendario-publico/calendario-publico.component.css +44 -4
  4. package/templates/frontend/src/app/Componentes/Nucleo/calendario-publico/calendario-publico.component.html +10 -8
  5. package/templates/frontend/src/app/Componentes/Nucleo/calendario-publico/calendario-publico.component.ts +2 -2
  6. package/templates/frontend/src/app/Componentes/Nucleo/estadisticas-del-modulo/estadisticas-del-modulo.component.css +49 -2
  7. package/templates/frontend/src/app/Componentes/Nucleo/estadisticas-del-modulo/estadisticas-del-modulo.component.html +9 -2
  8. package/templates/frontend/src/app/Componentes/Nucleo/estadisticas-del-modulo/estadisticas-del-modulo.component.ts +2 -2
  9. package/templates/frontend/src/app/Componentes/Nucleo/gestion-actividad/gestion-actividad.component.css +10 -2
  10. package/templates/frontend/src/app/Componentes/Nucleo/manual/manual.component.css +76 -7
  11. package/templates/frontend/src/app/Componentes/Nucleo/manual/manual.component.html +25 -7
  12. package/templates/frontend/src/app/Componentes/Nucleo/manual/manual.component.ts +93 -16
  13. package/templates/frontend/src/app/Componentes/Nucleo/mensaje-confirmacion/mensaje-confirmacion.component.css +71 -3
  14. package/templates/frontend/src/app/Componentes/Nucleo/mensaje-confirmacion/mensaje-confirmacion.component.html +11 -8
  15. package/templates/frontend/src/app/Componentes/Nucleo/mensaje-confirmacion/mensaje-confirmacion.ts +3 -3
  16. package/templates/frontend/src/app/Componentes/Nucleo/mensajes/mensajes.component.css +67 -0
  17. package/templates/frontend/src/app/Componentes/Nucleo/mensajes/mensajes.component.html +21 -9
  18. package/templates/frontend/src/app/Componentes/Nucleo/mensajes/mensajes.component.ts +1 -2
  19. package/templates/frontend/src/app/Componentes/Nucleo/panel-notificaciones/panel-notificaciones.component.css +209 -0
  20. package/templates/frontend/src/app/Componentes/Nucleo/panel-notificaciones/panel-notificaciones.component.html +45 -0
  21. package/templates/frontend/src/app/Componentes/Nucleo/panel-notificaciones/panel-notificaciones.component.ts +53 -0
  22. package/templates/frontend/src/app/Componentes/Nucleo/reporte-de-incidencias/reporte-de-incidencias.component.css +106 -13
  23. package/templates/frontend/src/app/Componentes/Nucleo/reporte-de-incidencias/reporte-de-incidencias.component.html +43 -32
  24. package/templates/frontend/src/app/Componentes/Nucleo/reporte-de-incidencias/reporte-de-incidencias.component.ts +4 -3
  25. package/templates/frontend/src/app/Componentes/Nucleo/reporte-de-sugerencias/reporte-de-sugerencias.component.css +76 -21
  26. package/templates/frontend/src/app/Componentes/Nucleo/reporte-de-sugerencias/reporte-de-sugerencias.component.html +23 -14
  27. package/templates/frontend/src/app/Componentes/Nucleo/reporte-de-sugerencias/reporte-de-sugerencias.component.ts +4 -3
  28. package/templates/frontend/src/app/Componentes/Nucleo/tarjeta-modulo/tarjeta-modulo.component.css +20 -10
  29. package/templates/frontend/src/app/Componentes/Nucleo/tarjeta-modulo/tarjeta-modulo.component.html +17 -8
  30. package/templates/frontend/src/app/Paginas/Nucleo/accesibilidad/accesibilidad.component.css +20 -1
  31. package/templates/frontend/src/app/Paginas/Nucleo/contenedor-componentes/contenedor-componentes.component.css +143 -48
  32. package/templates/frontend/src/app/Paginas/Nucleo/contenedor-componentes/contenedor-componentes.component.html +60 -38
  33. package/templates/frontend/src/app/Paginas/Nucleo/contenedor-componentes/contenedor-componentes.component.ts +28 -6
  34. package/templates/frontend/src/app/Paginas/Nucleo/declaracion-ia/declaracion-ia.component.css +4 -4
  35. package/templates/frontend/src/index.html +7 -0
  36. package/templates/frontend/src/styles.css +14 -1
@@ -1,35 +1,46 @@
1
- <h2 mat-dialog-title>Reporte de incidencias</h2>
1
+ <div class="dialogo-header">
2
+ <mat-icon class="dialogo-icono">bug_report</mat-icon>
3
+ <span class="dialogo-titulo">Reporte de incidencia</span>
4
+ </div>
5
+
2
6
  <mat-dialog-content>
3
- <div class="contenedor">
4
- <form [formGroup]="formulario">
5
- <div class="fila">
6
- <mat-form-field class="campo">
7
- <mat-label>Detalle del problema</mat-label>
8
- <textarea matInput formControlName="detalle" required></textarea>
9
- </mat-form-field>
10
- <mat-form-field class="campo">
11
- <mat-label>Resultado esperado</mat-label>
12
- <textarea matInput formControlName="resultado" required></textarea>
13
- </mat-form-field>
14
- <mat-form-field class="campo">
15
- <mat-label>Información de contacto</mat-label>
16
- <textarea matInput formControlName="contacto" required></textarea>
17
- </mat-form-field>
18
- </div>
19
- <div class="zona-archivo" (click)="AbrirGestorDeArchivos()" (dragover)="ArrastrarAdentro($event)"
20
- (dragleave)="ArrastrarAfuera($event)" (drop)="Soltar($event)">
21
- @if(!Archivo){
22
- <p class="texto">Arrastra y suelta un archivo aquí o <span class="texto-clic">haz clic para subirlo</span></p>
23
- }
24
- @else{
25
- <p>Archivo seleccionado: {{ Archivo.name }}</p>
26
- }
27
- <input type="file" #EntradDeArchivo hidden (change)="ArchivoSeleccionado($event)">
28
- </div>
29
- </form>
30
- </div>
7
+ <p class="dialogo-frase">Ayúdanos a mejorar el sistema.</p>
8
+ <p class="dialogo-subtitulo">Describe el problema encontrado con el mayor detalle posible.</p>
9
+ <form [formGroup]="formulario">
10
+ <mat-form-field class="campo" appearance="outline">
11
+ <mat-label>Detalle del problema</mat-label>
12
+ <textarea matInput formControlName="detalle" rows="4"
13
+ placeholder="¿Qué ocurrió?" required></textarea>
14
+ </mat-form-field>
15
+ <mat-form-field class="campo" appearance="outline">
16
+ <mat-label>Resultado esperado</mat-label>
17
+ <textarea matInput formControlName="resultado" rows="3"
18
+ placeholder="¿Qué esperabas que ocurriera?" required></textarea>
19
+ </mat-form-field>
20
+ <mat-form-field class="campo" appearance="outline">
21
+ <mat-label>Información de contacto</mat-label>
22
+ <textarea matInput formControlName="contacto" rows="2"
23
+ placeholder="Correo o extensión para dar seguimiento..." required></textarea>
24
+ </mat-form-field>
25
+ <div class="zona-archivo" (click)="AbrirGestorDeArchivos()" (dragover)="ArrastrarAdentro($event)"
26
+ (dragleave)="ArrastrarAfuera($event)" (drop)="Soltar($event)">
27
+ @if(!Archivo){
28
+ <p class="texto">Arrastra y suelta un archivo aquí o <span class="texto-clic">haz clic para subirlo</span></p>
29
+ }
30
+ @else{
31
+ <p class="texto">Archivo seleccionado: {{ Archivo.name }}</p>
32
+ }
33
+ <input type="file" #EntradDeArchivo hidden (change)="ArchivoSeleccionado($event)">
34
+ </div>
35
+ </form>
31
36
  </mat-dialog-content>
37
+
32
38
  <mat-dialog-actions>
33
- <button mat-button (click)="Cerrar()">Cerrar</button>
34
- <button mat-button (click)="Enviar()">Enviar</button>
35
- </mat-dialog-actions>
39
+ <button mat-stroked-button class="btn-cancelar" (click)="Cerrar()">Cancelar</button>
40
+ <button mat-flat-button class="btn-enviar" (click)="Enviar()" [disabled]="formulario.invalid">
41
+ <mat-icon>send</mat-icon>
42
+ Enviar
43
+ </button>
44
+ </mat-dialog-actions>
45
+
46
+ <div class="dialogo-pie"></div>
@@ -3,8 +3,9 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms';
3
3
  import { MatFormFieldModule } from '@angular/material/form-field';
4
4
  import { MatInputModule } from '@angular/material/input';
5
5
  import { ReactiveFormsModule } from '@angular/forms';
6
- import { MatDialogActions, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';
6
+ import { MatDialogActions, MatDialogContent, MatDialogRef } from '@angular/material/dialog';
7
7
  import { MatButtonModule } from '@angular/material/button';
8
+ import { MatIconModule } from '@angular/material/icon';
8
9
  import { DatosGlobalesService } from '../../../datos-globales.service';
9
10
  import { HttpClient } from '@angular/common/http';
10
11
  import { Subject } from 'rxjs';
@@ -20,7 +21,7 @@ import { takeUntil } from 'rxjs/operators';
20
21
  ReactiveFormsModule,
21
22
  MatDialogContent,
22
23
  MatButtonModule,
23
- MatDialogTitle,
24
+ MatIconModule,
24
25
  MatDialogActions
25
26
  ]
26
27
  })
@@ -55,7 +56,7 @@ export class ReporteDeIncidenciasComponent implements OnInit, OnDestroy {
55
56
  archivo)
56
57
  .pipe(takeUntil(this._destroy$))
57
58
  .subscribe({
58
- next: (data: any) => {
59
+ next: () => {
59
60
  alert('Mensaje enviado');
60
61
  },
61
62
  error: (error) => {
@@ -1,36 +1,91 @@
1
- .contenedor {
1
+ /* Header */
2
+ .dialogo-header {
2
3
  display: flex;
3
- flex-wrap: wrap;
4
+ align-items: center;
5
+ gap: 10px;
6
+ background: linear-gradient(90deg, rgba(1, 33, 105, 1) 0%, rgba(63, 97, 171, 1) 100%);
7
+ color: white;
8
+ padding: 24px 20px 16px;
9
+ margin: -8px -8px 0;
4
10
  }
5
11
 
6
- .fila {
7
- width: 100%;
12
+ .dialogo-icono {
13
+ font-size: 24px;
14
+ width: 24px;
15
+ height: 24px;
16
+ flex-shrink: 0;
8
17
  }
9
18
 
19
+ .dialogo-titulo {
20
+ font-size: 1.1rem;
21
+ font-weight: 600;
22
+ font-family: 'Roboto', sans-serif;
23
+ letter-spacing: 0.2px;
24
+ }
25
+
26
+ /* Frase destacada */
27
+ .dialogo-frase {
28
+ font-size: 1.05rem;
29
+ font-weight: 600;
30
+ color: #012169;
31
+ margin: 20px 0 6px;
32
+ font-family: 'Roboto', sans-serif;
33
+ line-height: 1.3;
34
+ }
35
+
36
+ /* Subtítulo */
37
+ .dialogo-subtitulo {
38
+ font-size: 0.875rem;
39
+ color: #5a6a7a;
40
+ margin: 0 0 20px;
41
+ font-family: 'Roboto', sans-serif;
42
+ line-height: 1.5;
43
+ }
44
+
45
+ /* Campo */
10
46
  .campo {
11
47
  width: 100%;
12
48
  }
13
49
 
14
- .zona-archivo {
15
- width: 90%;
16
- height: 10vh;
17
- margin-left: 4%;
18
- border: 2px dashed #3498db;
19
- padding: 1%;
20
- align-items: center;
50
+ /* Botones */
51
+ mat-dialog-actions {
21
52
  display: flex;
22
- cursor: pointer;
23
- transition: background 0.3s;
53
+ justify-content: flex-end;
54
+ gap: 10px;
55
+ padding: 8px 20px 16px;
24
56
  }
25
57
 
26
- .texto {
27
- width: 100%;
28
- text-align: center;
58
+ .btn-cancelar {
59
+ color: #012169;
60
+ border-color: #012169;
61
+ font-family: 'Roboto', sans-serif;
62
+ font-weight: 500;
63
+ }
64
+
65
+ .btn-enviar {
66
+ background-color: #012169;
67
+ color: white;
68
+ font-family: 'Roboto', sans-serif;
69
+ font-weight: 500;
70
+ display: flex;
71
+ align-items: center;
72
+ gap: 6px;
73
+ }
74
+
75
+ .btn-enviar mat-icon {
76
+ font-size: 18px;
77
+ width: 18px;
78
+ height: 18px;
79
+ }
80
+
81
+ .btn-enviar:disabled {
82
+ background-color: #a0b0c4;
83
+ color: white;
29
84
  }
30
85
 
31
- .texto-clic {
32
- color: #007bff;
33
- font-weight: bold;
34
- cursor: pointer;
35
- text-decoration: underline;
86
+ /* Pie */
87
+ .dialogo-pie {
88
+ height: 20px;
89
+ background: linear-gradient(90deg, rgba(1, 33, 105, 1) 0%, rgba(63, 97, 171, 1) 100%);
90
+ margin: 0 -8px;
36
91
  }
@@ -1,17 +1,26 @@
1
- <h2 mat-dialog-title>Reporte de la sugerencia</h2>
1
+ <div class="dialogo-header">
2
+ <mat-icon class="dialogo-icono">rate_review</mat-icon>
3
+ <span class="dialogo-titulo">Reporte de sugerencia</span>
4
+ </div>
5
+
2
6
  <mat-dialog-content>
3
- <div class="contenedor">
4
- <form [formGroup]="formulario">
5
- <div class="fila">
6
- <mat-form-field class="campo">
7
- <mat-label>Detalle de la sugerencia</mat-label>
8
- <textarea matInput formControlName="detalle" required></textarea>
9
- </mat-form-field>
10
- </div>
11
- </form>
12
- </div>
7
+ <p class="dialogo-frase">Tu opinión nos ayuda a mejorar.</p>
8
+ <p class="dialogo-subtitulo">Describe con detalle la sugerencia o mejora que propones.</p>
9
+ <form [formGroup]="formulario">
10
+ <mat-form-field class="campo" appearance="outline">
11
+ <mat-label>Detalle de la sugerencia</mat-label>
12
+ <textarea matInput formControlName="detalle" rows="6"
13
+ placeholder="Describe tu sugerencia o mejora..." required></textarea>
14
+ </mat-form-field>
15
+ </form>
13
16
  </mat-dialog-content>
17
+
14
18
  <mat-dialog-actions>
15
- <button mat-button (click)="Cerrar()">Cerrar</button>
16
- <button mat-button (click)="Enviar()">Enviar</button>
17
- </mat-dialog-actions>
19
+ <button mat-stroked-button class="btn-cancelar" (click)="Cerrar()">Cancelar</button>
20
+ <button mat-flat-button class="btn-enviar" (click)="Enviar()" [disabled]="formulario.invalid">
21
+ <mat-icon>send</mat-icon>
22
+ Enviar
23
+ </button>
24
+ </mat-dialog-actions>
25
+
26
+ <div class="dialogo-pie"></div>
@@ -3,8 +3,9 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms';
3
3
  import { MatFormFieldModule } from '@angular/material/form-field';
4
4
  import { MatInputModule } from '@angular/material/input';
5
5
  import { ReactiveFormsModule } from '@angular/forms';
6
- import { MatDialogActions, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';
6
+ import { MatDialogActions, MatDialogContent, MatDialogRef } from '@angular/material/dialog';
7
7
  import { MatButtonModule } from '@angular/material/button';
8
+ import { MatIconModule } from '@angular/material/icon';
8
9
  import { DatosGlobalesService } from '../../../datos-globales.service';
9
10
  import { HttpClient } from '@angular/common/http';
10
11
  import { Subject } from 'rxjs';
@@ -20,7 +21,7 @@ import { takeUntil } from 'rxjs/operators';
20
21
  ReactiveFormsModule,
21
22
  MatDialogContent,
22
23
  MatButtonModule,
23
- MatDialogTitle,
24
+ MatIconModule,
24
25
  MatDialogActions
25
26
  ]
26
27
  })
@@ -46,7 +47,7 @@ export class ReporteDeSugerenciasComponent implements OnInit, OnDestroy {
46
47
  this.http.post(this.datosGlobalesService.ObtenerURL() + 'misc/reporteDeSugerencia/' + Datos, {})
47
48
  .pipe(takeUntil(this._destroy$))
48
49
  .subscribe({
49
- next: (data: any) => {
50
+ next: () => {
50
51
  alert('Mensaje enviado');
51
52
  },
52
53
  error: (error) => {
@@ -4,26 +4,29 @@
4
4
 
5
5
  .modulo-card {
6
6
  position: relative;
7
- width: 300px;
8
- /* Reduced from 380px */
7
+ width: 100%;
9
8
  height: 220px;
10
9
  border-radius: 25px;
11
10
  overflow: hidden;
12
11
  box-shadow: 0 4px 15px rgba(0, 0, 0, 0.15);
13
- border: 1px solid #0B4FCE;
14
- /* Added border as requested */
12
+ border: 2px solid #8bb8eb;
15
13
  cursor: pointer;
16
- transition: transform 0.2s ease, box-shadow 0.2s ease;
14
+ transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
17
15
  background-color: #fff;
18
16
  display: flex;
19
17
  flex-direction: column;
20
- margin: 10px;
21
- /* Reduced to previous value */
22
18
  }
23
19
 
24
20
  .modulo-card:hover {
25
21
  transform: translateY(-5px);
26
22
  box-shadow: 0 8px 25px rgba(0, 0, 0, 0.2);
23
+ border: 2px solid #012169;
24
+ }
25
+
26
+ .modulo-card:focus-visible {
27
+ outline: 3px solid #012169;
28
+ outline-offset: 3px;
29
+ border-color: #012169;
27
30
  }
28
31
 
29
32
  .modulo-card-header {
@@ -47,7 +50,7 @@
47
50
 
48
51
  .modulo-tipo {
49
52
  color: #3e5a7a;
50
- font-size: 1.2rem;
53
+ font-size: 1rem;
51
54
  font-weight: 500;
52
55
  letter-spacing: 1px;
53
56
  margin-top: 5px;
@@ -79,6 +82,14 @@
79
82
  color: #888;
80
83
  transition: all 0.3s ease;
81
84
  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.05);
85
+ border: none;
86
+ cursor: pointer;
87
+ padding: 0;
88
+ }
89
+
90
+ .pin-container:focus-visible {
91
+ outline: 3px solid #012169;
92
+ outline-offset: 2px;
82
93
  }
83
94
 
84
95
  .pin-container.pinned {
@@ -138,8 +149,7 @@
138
149
 
139
150
  .modulo-descripcion {
140
151
  color: #1d3a5f;
141
- font-size: 1.4rem;
142
- /* Reduced from 1.6rem */
152
+ font-size: 1.15rem;
143
153
  font-weight: 700;
144
154
  line-height: 1.2;
145
155
  margin: 0;
@@ -1,16 +1,25 @@
1
- <div class="modulo-card" (click)="onClick()">
1
+ <div class="modulo-card"
2
+ role="button"
3
+ tabindex="0"
4
+ [attr.aria-label]="modulo.Descripcion"
5
+ (click)="onClick()"
6
+ (keydown.enter)="onClick()"
7
+ (keydown.space)="$event.preventDefault(); onClick()">
2
8
  <div class="modulo-card-header">
3
9
  <div class="modulo-tipo-container">
4
- <span class="modulo-tipo">{{ modulo.Tipo | uppercase }}</span>
10
+ <span class="modulo-tipo" aria-hidden="true">{{ modulo.Tipo | uppercase }}</span>
5
11
  @if(cantidad !== undefined && cantidad > 0) {
6
- <span class="modulo-cantidad-badge">{{ cantidad }}</span>
12
+ <span class="modulo-cantidad-badge" aria-hidden="true">{{ cantidad }}</span>
7
13
  }
8
14
  </div>
9
- <div class="pin-container" (click)="alternarFavorito($event)" [ngClass]="{ 'pinned': estaEnFavoritos() }">
10
- <span class="material-icons pin-icon">
11
- push_pin
12
- </span>
13
- </div>
15
+ <button type="button"
16
+ class="pin-container"
17
+ (click)="alternarFavorito($event)"
18
+ [ngClass]="{ 'pinned': estaEnFavoritos() }"
19
+ [attr.aria-label]="estaEnFavoritos() ? 'Quitar de favoritos: ' + modulo.Descripcion : 'Agregar a favoritos: ' + modulo.Descripcion"
20
+ [attr.aria-pressed]="estaEnFavoritos()">
21
+ <span class="material-icons pin-icon" aria-hidden="true">push_pin</span>
22
+ </button>
14
23
  </div>
15
24
 
16
25
  @if(modulo.Icono) {
@@ -72,7 +72,7 @@
72
72
  align-items: flex-start;
73
73
  gap: 14px;
74
74
  padding: 20px 24px;
75
- background: linear-gradient(135deg, #002f6b 0%, #1565c0 100%);
75
+ background: linear-gradient(90deg, rgba(1, 33, 105, 1) 0%, rgba(63, 97, 171, 1) 100%);
76
76
  color: white;
77
77
  border-radius: 12px;
78
78
  margin-bottom: 28px;
@@ -136,6 +136,7 @@
136
136
  color: #333;
137
137
  line-height: 1.6;
138
138
  margin: 0 0 14px 0;
139
+ text-align: justify;
139
140
  }
140
141
 
141
142
  /* Tablas */
@@ -228,6 +229,7 @@ kbd {
228
229
  @media (max-width: 768px) {
229
230
  .acc-layout {
230
231
  flex-direction: column;
232
+ padding: 16px;
231
233
  }
232
234
 
233
235
  .acc-toc {
@@ -235,5 +237,22 @@ kbd {
235
237
  position: static;
236
238
  margin-right: 0;
237
239
  margin-bottom: 20px;
240
+ text-align: center;
241
+ }
242
+
243
+ .toc-lista {
244
+ display: inline-flex;
245
+ flex-direction: column;
246
+ align-items: center;
247
+ width: 100%;
248
+ }
249
+
250
+ .toc-lista li {
251
+ width: 100%;
252
+ text-align: center;
253
+ }
254
+
255
+ .toc-enlace {
256
+ text-align: center;
238
257
  }
239
258
  }