Skip to content

Commit 390bfd2

Browse files
authored
Merge branch 'develop' into bugfix/#178-challenge-card-background
2 parents a464746 + f5a6eb3 commit 390bfd2

File tree

12 files changed

+260
-42
lines changed

12 files changed

+260
-42
lines changed

CHANGELOG.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,26 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
44
and this project adheres to
55
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7-
### [ita-challenges-frontend-3.27.1-RELEASE] - 2026-02-18
7+
### [ita-challenges-frontend-3.27.4-RELEASE] - 2026-02-18
88

99
### Fixed
1010
- Challenge card layout div to show the status of the challenge
1111

12+
### [ita-challenges-frontend-3.27.3-RELEASE] - 2026-02-23
13+
14+
### Changed
15+
- Display related challenge cards in a responsive grid layout (3 columns on desktop, 1 column on mobile).
16+
17+
### [ita-challenges-frontend-3.27.2-RELEASE] - 2026-02-23
18+
19+
### Fixed
20+
- Enabled closing the Challenge Filters modal via `Escape` key and backdrop click. GitHub [#761], PR [#762].
21+
22+
### [ita-challenges-frontend-3.27.1-RELEASE] - 2026-02-21
23+
24+
### Fixed
25+
- Fixed environment.ts and environment.prod.ts route for solution submission and retrieval.
26+
1227
### [ita-challenges-frontend-3.27.0-RELEASE] - 2026-02-16
1328

1429
### Added

conf/.env.CI.dev

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
MICROSERVICE_DEPLOY=ita-challenges-frontend
2-
MICROSERVICE_VERSION=3.27.1-RELEASE
2+
MICROSERVICE_VERSION=3.27.4-RELEASE

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "ita-challenges-frontend",
3-
"version": "3.27.1-RELEASE",
3+
"version": "3.27.4-RELEASE",
44
"scripts": {
55
"ng": "ng",
66
"start": "ng serve --proxy-config proxy.conf.dev.json",

src/app/modules/challenge/components/challenge-info/challenge-info.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ <h3>{{ "modules.challenge.info.related" | translate }}</h3>
178178
<!-- Display related challenges when available. By now this
179179
is a temporary mocked solution for demo purposes -->
180180
<section *ngIf="relatedChallenges && relatedChallenges.length > 0" class="info-card">
181-
<div class="d-flex flex-column gap-3">
181+
<div class="related-challenges-grid">
182182
<app-challenge-card *ngFor="let challenge of relatedChallenges"
183183
[title]="challenge.challenge_title | dynamicTranslate"
184184
[creation_date]="challenge.creation_date"

src/app/modules/challenge/components/challenge-info/challenge-info.component.scss

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@
5656
width: 80%;
5757
}
5858

59+
.related-challenges-grid {
60+
display: grid;
61+
grid-template-columns: repeat(3, minmax(0, 1fr));
62+
gap: 1rem;
63+
}
64+
5965
.side-by-side {
6066
width: 100%;
6167
max-width: 100%;
@@ -176,6 +182,10 @@ p, ul li {
176182

177183

178184
@media screen and (max-width: 768px) {
185+
.related-challenges-grid {
186+
grid-template-columns: 1fr;
187+
}
188+
179189
.details-body {
180190
flex-direction: column;
181191

src/app/modules/starter/components/challenge-filters-trigger/challenge-filters-trigger.component.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,8 @@ describe('ChallengeFiltersTriggerComponent', () => {
131131
expect(callArgs[1]).toEqual(
132132
jasmine.objectContaining({
133133
windowClass: 'challenge-filters-trigger-modal',
134-
backdrop: 'static',
135-
keyboard: false
134+
backdrop: true,
135+
keyboard: true
136136
})
137137
)
138138
})

src/app/modules/starter/components/challenge-filters-trigger/challenge-filters-trigger.component.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ type Level = NonNullable<FilterChallenge['levels']>[number]
1919
export class ChallengeFiltersTriggerComponent {
2020

2121
protected readonly SolutionStatus = SolutionStatus
22-
2322
@Input() initialFilters: FilterChallenge = { languages: [], levels: [], progress: [], tags: [] }
2423
@Output() filtersApplied = new EventEmitter<ModalFilters>()
2524
@ViewChild('modal') private readonly modalTemplate!: TemplateRef<unknown>
@@ -68,8 +67,8 @@ export class ChallengeFiltersTriggerComponent {
6867

6968
this.modalService.open(this.modalTemplate, {
7069
windowClass: 'challenge-filters-trigger-modal',
71-
backdrop: 'static',
72-
keyboard: false
70+
backdrop: true,
71+
keyboard: true
7372
})
7473

7574
setTimeout(() => {
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
{
2+
"offset": 0,
3+
"limit": 6,
4+
"count": 6,
5+
"results": [
6+
{
7+
"id_language": "09fabe32-7362-4bfb-ac05-b7bf854c6e0f",
8+
"language_name": "Javascript",
9+
"language_image": "https://res.cloudinary.com/itachallenge/image/upload/v1739361249/language_icon_Javascript_asgn04.svg"
10+
},
11+
{
12+
"id_language": "660e1b18-0c0a-4262-a28a-85de9df6ac5f",
13+
"language_name": "Java",
14+
"language_image": "https://res.cloudinary.com/itachallenge/image/upload/v1739361249/language_icon_Java_dakuat.svg"
15+
},
16+
{
17+
"id_language": "1e047ea2-b787-49e7-acea-d79e92be3909",
18+
"language_name": "PHP",
19+
"language_image": "https://res.cloudinary.com/itachallenge/image/upload/v1739361249/language_icon_PHP_gmybol.svg"
20+
},
21+
{
22+
"id_language": "409c9fe8-74de-4db3-81a1-a55280cf92ef",
23+
"language_name": "Python",
24+
"language_image": "https://res.cloudinary.com/itachallenge/image/upload/v1739361249/language_icon_Python_rphody.svg"
25+
},
26+
{
27+
"id_language": "129568b8-b09a-4589-a0bb-053dd120f0bb",
28+
"language_name": "SQL",
29+
"language_image": "https://res.cloudinary.com/itachallenge/image/upload/v1739361249/language_icon_SQL_nonewj.svg"
30+
},
31+
{
32+
"id_language": "5caa6142-a49e-4415-a8fc-439669777d1d",
33+
"language_name": "Typescript",
34+
"language_image": "https://res.cloudinary.com/itachallenge/image/upload/v1739361249/language_icon_Typescript_npnrq9.svg"
35+
}
36+
]
37+
}

src/assets/dummy/challenge-tags-response-mock.json

Lines changed: 0 additions & 31 deletions
This file was deleted.
Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
[
2+
{
3+
"offset": 0,
4+
"limit": 4,
5+
"count": 4,
6+
"results": [
7+
{
8+
"id_tag": "c8964d6d-db27-4e78-80e6-bf6e522254c0",
9+
"tag_name": "Tipos",
10+
"tag_description": "Definición de tipos para variables y funciones.",
11+
"language_id": "5caa6142-a49e-4415-a8fc-439669777d1d"
12+
},
13+
{
14+
"id_tag": "21ffd1e9-dc5b-433d-a465-6e3fcbd7c376",
15+
"tag_name": "Interfaces",
16+
"tag_description": "Contratos que definen la estructura que deben cumplir los objetos.",
17+
"language_id": "5caa6142-a49e-4415-a8fc-439669777d1d"
18+
},
19+
{
20+
"id_tag": "28fe84fc-a382-48b6-b8c3-b7954449a7f4",
21+
"tag_name": "Decoradores",
22+
"tag_description": "Anotaciones especiales para clases y propiedades.",
23+
"language_id": "5caa6142-a49e-4415-a8fc-439669777d1d"
24+
},
25+
{
26+
"id_tag": "9030fc3c-752f-4777-acd6-eedd5e17c1bc",
27+
"tag_name": "Funciones",
28+
"tag_description": "Declaración de funciones con tipado estricto.",
29+
"language_id": "5caa6142-a49e-4415-a8fc-439669777d1d"
30+
}
31+
]
32+
},
33+
{
34+
"offset": 0,
35+
"limit": 4,
36+
"count": 4,
37+
"results": [
38+
{
39+
"id_tag": "0c8ca47c-d915-486e-8ae9-803483c8ed17",
40+
"tag_name": "Callbacks",
41+
"tag_description": "Funciones que se pasan como argumento y se ejecutan después de otra función.",
42+
"language_id": "09fabe32-7362-4bfb-ac05-b7bf854c6e0f"
43+
},
44+
{
45+
"id_tag": "24dc381b-96b1-4231-8a79-ed0ac8c8e222",
46+
"tag_name": "Promises",
47+
"tag_description": "Manejo de operaciones asíncronas en forma encadenada.",
48+
"language_id": "09fabe32-7362-4bfb-ac05-b7bf854c6e0f"
49+
},
50+
{
51+
"id_tag": "0641e89b-58ee-4fa3-a8f7-3d9e9a31f174",
52+
"tag_name": "Async/Await",
53+
"tag_description": "Sintaxis moderna para trabajar con promesas de manera más legible.",
54+
"language_id": "09fabe32-7362-4bfb-ac05-b7bf854c6e0f"
55+
},
56+
{
57+
"id_tag": "45d791bd-1a44-42b5-b54e-618eda9e08e2",
58+
"tag_name": "Closures",
59+
"tag_description": "Funciones internas que recuerdan el scope de su función padre.",
60+
"language_id": "09fabe32-7362-4bfb-ac05-b7bf854c6e0f"
61+
}
62+
]
63+
},
64+
{
65+
"offset": 0,
66+
"limit": 4,
67+
"count": 4,
68+
"results": [
69+
{
70+
"id_tag": "e0f542d7-55d6-4055-94bb-aed9d78c6189",
71+
"tag_name": "POO",
72+
"tag_description": "Programación Orientada a Objetos: clases, herencia, encapsulamiento, etc.",
73+
"language_id": "660e1b18-0c0a-4262-a28a-85de9df6ac5f"
74+
},
75+
{
76+
"id_tag": "fc240e1e-a84c-485c-9abb-2f8f7b27c7c3",
77+
"tag_name": "Streams",
78+
"tag_description": "API para procesamiento de colecciones de forma funcional.",
79+
"language_id": "660e1b18-0c0a-4262-a28a-85de9df6ac5f"
80+
},
81+
{
82+
"id_tag": "693e9349-6740-44f7-a99d-8a094ef42d3a",
83+
"tag_name": "Collections",
84+
"tag_description": "Uso de List, Set y Map para manejar estructuras de datos.",
85+
"language_id": "660e1b18-0c0a-4262-a28a-85de9df6ac5f"
86+
},
87+
{
88+
"id_tag": "6458da04-f71d-478a-bd95-e0ed671d964a",
89+
"tag_name": "Lambdas",
90+
"tag_description": "Expresiones lambda para programación funcional en Java.",
91+
"language_id": "660e1b18-0c0a-4262-a28a-85de9df6ac5f"
92+
}
93+
]
94+
},
95+
{
96+
"offset": 0,
97+
"limit": 4,
98+
"count": 4,
99+
"results": [
100+
{
101+
"id_tag": "57eb69dd-d224-42fb-8cce-782898e07a50",
102+
"tag_name": "Arrays",
103+
"tag_description": "Manipulación de arrays asociativos y multidimensionales.",
104+
"language_id": "1e047ea2-b787-49e7-acea-d79e92be3909"
105+
},
106+
{
107+
"id_tag": "5d22c2af-94e7-4ed0-9b82-f09011d0e800",
108+
"tag_name": "Funciones",
109+
"tag_description": "Definición y uso de funciones propias y predefinidas.",
110+
"language_id": "1e047ea2-b787-49e7-acea-d79e92be3909"
111+
},
112+
{
113+
"id_tag": "ecec3cf5-0dca-47a1-bc92-18f9dc44044a",
114+
"tag_name": "POO",
115+
"tag_description": "Implementación de clases y objetos en PHP.",
116+
"language_id": "1e047ea2-b787-49e7-acea-d79e92be3909"
117+
},
118+
{
119+
"id_tag": "7cd2e934-424a-4d8a-8b34-70a1f17ee16d",
120+
"tag_name": "Superglobals",
121+
"tag_description": "Uso de variables globales como $_GET, $_POST, $_SESSION.",
122+
"language_id": "1e047ea2-b787-49e7-acea-d79e92be3909"
123+
}
124+
]
125+
},
126+
{
127+
"offset": 0,
128+
"limit": 4,
129+
"count": 4,
130+
"results": [
131+
{
132+
"id_tag": "f723cd89-762e-42df-a398-54246b2e7109",
133+
"tag_name": "List Comprehension",
134+
"tag_description": "Sintaxis compacta para construir listas a partir de iterables.",
135+
"language_id": "409c9fe8-74de-4db3-81a1-a55280cf92ef"
136+
},
137+
{
138+
"id_tag": "05fe1f7f-5db2-4b9c-9034-393e5dd801ed",
139+
"tag_name": "Decoradores",
140+
"tag_description": "Funciones que modifican el comportamiento de otras funciones.",
141+
"language_id": "409c9fe8-74de-4db3-81a1-a55280cf92ef"
142+
},
143+
{
144+
"id_tag": "bbf0afda-ff6a-40a1-91f6-1a092538d410",
145+
"tag_name": "Módulos",
146+
"tag_description": "Organización del código Python en archivos reutilizables.",
147+
"language_id": "409c9fe8-74de-4db3-81a1-a55280cf92ef"
148+
},
149+
{
150+
"id_tag": "f732e956-4833-482e-aa93-3357fb3b092e",
151+
"tag_name": "Funciones",
152+
"tag_description": "Definición y uso de funciones con y sin parámetros.",
153+
"language_id": "409c9fe8-74de-4db3-81a1-a55280cf92ef"
154+
}
155+
]
156+
},
157+
{
158+
"offset": 0,
159+
"limit": 4,
160+
"count": 4,
161+
"results": [
162+
{
163+
"id_tag": "b8f181ce-5f2a-4872-8444-82f1326b1f14",
164+
"tag_name": "SELECT",
165+
"tag_description": "Consulta básica para recuperar datos de una tabla.",
166+
"language_id": "129568b8-b09a-4589-a0bb-053dd120f0bb"
167+
},
168+
{
169+
"id_tag": "d792006f-d80f-47f7-9377-1d312e266082",
170+
"tag_name": "JOINS",
171+
"tag_description": "Combinación de registros de dos o más tablas relacionadas.",
172+
"language_id": "129568b8-b09a-4589-a0bb-053dd120f0bb"
173+
},
174+
{
175+
"id_tag": "d76cbb39-5add-4ccf-8290-09f041373220",
176+
"tag_name": "GROUP BY",
177+
"tag_description": "Agrupación de datos para aplicar funciones agregadas.",
178+
"language_id": "129568b8-b09a-4589-a0bb-053dd120f0bb"
179+
},
180+
{
181+
"id_tag": "51bda818-7216-40bf-a7da-6510e80e4e14",
182+
"tag_name": "Subqueries",
183+
"tag_description": "Consultas anidadas dentro de otras consultas SQL.",
184+
"language_id": "129568b8-b09a-4589-a0bb-053dd120f0bb"
185+
}
186+
]
187+
}
188+
]

0 commit comments

Comments
 (0)