Skip to content

Migration/angular 21 - #19

Merged
mrsolarius merged 16 commits into
mainfrom
migration/angular-21
Apr 10, 2026
Merged

Migration/angular 21#19
mrsolarius merged 16 commits into
mainfrom
migration/angular-21

Conversation

@mrsolarius

Copy link
Copy Markdown
Contributor

No description provided.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Migrates the project to Angular 21, updating the build/SSR pipeline and modernizing templates/styles to align with the latest Angular + Angular Material (M3) patterns.

Changes:

  • Upgrade Angular dependencies/tooling (switch to @angular/build, update TypeScript, adjust project configs).
  • Replace legacy Angular Universal Express engine with the new @angular/ssrCommonEngine SSR setup.
  • Rework theming/styles toward Material 3 + CSS variables and update templates to the new control-flow syntax (@if, @for).

Reviewed changes

Copilot reviewed 80 out of 84 changed files in this pull request and generated 10 comments.

Show a summary per file
FileDescription
tsconfig.server.jsonRemoved legacy server tsconfig.
tsconfig.jsonUpdated TS compiler options (ES2022, bundler resolution, interop).
tsconfig.app.jsonUpdated app tsconfig (added node types; includes SSR entrypoints).
src/theme-colors.scssAdded M3 palette definitions for brand colors.
src/test.tsSimplified Angular test bootstrap file.
src/styles.scssReplaced legacy theming with M3 theme config + CSS vars + MDC overrides.
src/main.tsUpdated bootstrap call/options for Angular 21.
src/main.server.tsUpdated server entry exports for new SSR bootstrap expectations.
src/litopia-base.scssRefactored base styles to rely on CSS variables.
src/environments/environment.tsAdjusted dev environment config defaults.
src/app/utils/themes-chooser.service.tsUpdated theme switching service imports/injection.
src/app/utils/picture-content-delivery/picture-content-delivery.component.tsFormatting + Angular 21 metadata updates.
src/app/utils/picture-content-delivery/picture-content-delivery.component.htmlMigrated structural directives to @for.
src/app/utils/appear.directive.tsFormatting + Angular 21 metadata updates.
src/app/runtime-config.service.tsFormatting adjustments (runtime config loading unchanged).
src/app/pages/reglement/reglement.component.tsFormatting + Angular 21 metadata updates.
src/app/pages/profil/profil.component.tsAdjusted markdown parsing flow and formatting.
src/app/pages/profil/profil.component.htmlMigrated *ngIf to @if.
src/app/pages/nous-rejoindre/nous-rejoindre.component.tsFormatting + Angular 21 metadata updates.
src/app/pages/nous-rejoindre/nous-rejoindre.component.htmlTemplate formatting cleanup.
src/app/pages/nous-rejoindre-form/nous-rejoindre-form/nous-rejoindre-form.theme.component.scssMoved theme styling to CSS variables.
src/app/pages/nous-rejoindre-form/nous-rejoindre-form/nous-rejoindre-form.component.tsAdded theme stylesheet + formatting/refactors.
src/app/pages/nous-rejoindre-form/nous-rejoindre-form/nous-rejoindre-form.component.scssUpdated MDC checkbox deep selectors + formatting.
src/app/pages/nous-rejoindre-form/nous-rejoindre-form/nous-rejoindre-form.component.htmlMigrated to @if control flow.
src/app/pages/nous-rejoindre-form/nous-rejoindre-form.component.theme.scssMoved theme styling to CSS variables.
src/app/pages/nous-rejoindre-form/nous-rejoindre-form-counsel/nous-rejoindre-form-counsel.component.tsFormatting + Angular 21 metadata updates.
src/app/pages/nous-rejoindre-form/nous-rejoindre-form-counsel/nous-rejoindre-form-counsel.component.htmlTemplate formatting cleanup.
src/app/pages/nous-rejoindre-form/nous-rejoindre-form-adhesion/nous-rejoindre-form-adhesion.component.tsAdded shared theme stylesheet + metadata updates.
src/app/pages/not-found/not-found.component.tsFormatting + Angular 21 metadata updates.
src/app/pages/membres/profil-card/profil-card.theme.component.scssMoved theme styling to CSS variables.
src/app/pages/membres/profil-card/profil-card.component.tsFormatting + stylesheet array cleanup.
src/app/pages/membres/profil-card/profil-card.component.scssMinor typography tweak.
src/app/pages/membres/membres.component.tsFormatting + minor layout/state handling cleanup.
src/app/pages/membres/membres.component.scssLayout tuning + added section title styles.
src/app/pages/membres/membres.component.htmlMigrated loops to @for and adjusted header markup.
src/app/pages/archives/archives.component.tsAdded/updated archives data + formatting + metadata updates.
src/app/pages/archives/archives.component.theme.scssMoved theme styling to CSS variables.
src/app/pages/archives/archives.component.scssUpdated MDC chips selectors + formatting.
src/app/pages/archives/archives.component.htmlMigrated loops/conditionals to @for/@if.
src/app/pages/acceuil/timeline/timeline.theme.component.scssMoved theme styling to CSS variables.
src/app/pages/acceuil/timeline/timeline.component.tsFormatting + metadata updates.
src/app/pages/acceuil/timeline/timeline.component.scssTypography/layout tweaks.
src/app/pages/acceuil/timeline/timeline.component.htmlMigrated loop to @for.
src/app/pages/acceuil/timeline/timeline-item/timeline-item.component.tsFormatting + metadata updates.
src/app/pages/acceuil/timeline/timeline-item/timeline-item.component.theme.scssMoved theme styling to CSS variables.
src/app/pages/acceuil/timeline/timeline-item/timeline-item.component.htmlTypography class updates + formatting.
src/app/pages/acceuil/season-presentations/season-presentations.component.tsFormatting + metadata updates.
src/app/pages/acceuil/season-presentations/season-presentations.component.scssMinor typography/layout tweaks.
src/app/pages/acceuil/season-presentations/season-presentations.component.htmlFormatting + minor markup updates.
src/app/pages/acceuil/fullscreen-img-text/fullscreen-img-text.theme.component.scssMoved theme styling to CSS variables.
src/app/pages/acceuil/fullscreen-img-text/fullscreen-img-text.component.tsAdded theme stylesheet + metadata updates.
src/app/pages/acceuil/fullscreen-img-text/fullscreen-img-text.component.htmlMarkup formatting updates.
src/app/pages/acceuil/acceuil.component.tsFormatting + metadata updates.
src/app/pages/acceuil/a-propos/a-propos.component.tsFormatting + metadata updates.
src/app/layout/page-header/page-header.component.tsFormatting + metadata updates.
src/app/layout/page-header/page-header.component.htmlMigrated conditional image rendering to @if.
src/app/layout/navbar/theme-chooser/theme-chooser.component.tsFormatting + metadata updates.
src/app/layout/navbar/navbar.theme.component.scssMoved theme styling to CSS variables.
src/app/layout/navbar/navbar.component.tsFormatting + stylesheet array cleanup.
src/app/layout/navbar/navbar.component.htmlMigrated conditionals to @if.
src/app/layout/footer/footers.component.theme.scssMoved theme styling to CSS variables.
src/app/layout/footer/footer.component.tsFormatting + metadata updates.
src/app/layout/footer/footer.component.scssResponsive footer layout updates.
src/app/layout/footer/footer.component.htmlSimplified layout markup and added responsive GitHub link variants.
src/app/auth/services/authentication.service.tsSSR-safe initialization tweaks + formatting.
src/app/auth/auth-popup/auth-popup.component.tsFormatting + metadata updates.
src/app/auth/auth-popup/auth-popup.component.scssAdded dialog checkbox spacing.
src/app/auth/auth-popup/auth-popup.component.htmlMarkup formatting cleanup.
src/app/app.server.module.tsRemoved FlexLayout server module.
src/app/app.module.tsSwitch to provideHttpClient(...), adjust SSR/app-id providers, remove FlexLayout module.
src/app/app.component.tsFormatting + metadata updates.
src/app/apis/minecraft-api/minecraft-api.service.tsMinor import formatting.
src/app/apis/litopia-api/api/users.service.tsImport formatting change in generated client.
src/app/apis/litopia-api/api/minecraftUsers.service.tsImport formatting change in generated client.
src/app/apis/litopia-api/api/default.service.tsImport formatting change in generated client.
src/app/apis/litopia-api/api/candidatureProcess.service.tsImport formatting change in generated client.
src/app/apis/litopia-api/api/auth.service.tsImport formatting change in generated client.
server.tsMigrated SSR server to @angular/ssrCommonEngine and ESM-style paths.
proxy.conf.jsonAdded /api proxy target.
package.jsonUpdated Angular dependencies + SSR scripts.
karma.conf.jsUpdated Karma config (plugin/framework references changed).
angular.jsonMigrated build/test/serve builders to @angular/build and configured SSR entry.
.browserslistrcRemoved browserslist config file.
Comments suppressed due to low confidence (1)

server.ts:61

  • The server is started unconditionally via run();. This makes the module unsafe to import (e.g., serverless/SSR bundling/tests) and removes the previous "only run when main" guard. Consider restoring an ESM-safe entrypoint guard so app() can be imported without side effects.
function run(): void {
const port = process.env['PORT'] || 4000;
// Start up the Node server
const server = app();
server.listen(port, () => {
console.log(`Node Express server listening on http://localhost:${port}`);
});
}
run();

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +1 to +4
import {Inject, Injectable, PLATFORM_ID, Renderer2, RendererFactory2, DOCUMENT} from '@angular/core';
import {BehaviorSubject} from "rxjs";
import {OverlayContainer} from "@angular/cdk/overlay";
import {DOCUMENT, isPlatformBrowser} from "@angular/common";
import {isPlatformBrowser} from "@angular/common";

CopilotAIApr 6, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DOCUMENT is imported from @angular/core, but the DOCUMENT injection token is provided by @angular/common. This will fail to compile and/or inject the wrong token. Import DOCUMENT from @angular/common (or switch the injection to @Inject('DOCUMENT') to match the string-token provider in AppModule).

Copilot uses AI. Check for mistakes.
Comment on lines 17 to 23
isAppear(title: string) {
this.appearSet.add(title)
this.appearSet.add(title);
}

appear(title: string) {
return this.appearSet.has(title)
return this.appearSet.has(title);
}

CopilotAIApr 6, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isAppear() and appear() are reversed: isAppear() should return whether the key has appeared (boolean), and appear() should record the key. As written, isAppear() returns void, which will break the [@...] animation bindings and the (appear) handler logic.

Copilot uses AI. Check for mistakes.
Comment threadserver.ts Outdated
Comment on lines +24 to +27
'**',
express.static(browserDistFolder, {
maxAge: '1y',
index: 'index.html',

CopilotAIApr 6, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

express.static(..., { index: 'index.html' }) on the catch-all route will serve index.html for /, which prevents SSR from running for most routes. For SSR, set index: false (and typically only serve *.* assets) so non-asset routes fall through to CommonEngine.render(...).

Suggested change
'**',
express.static(browserDistFolder,{
maxAge: '1y',
index: 'index.html',
'*.*',
express.static(browserDistFolder,{
maxAge: '1y',
index: false,

Copilot uses AI. Check for mistakes.
Comment on lines +72 to +76
map((base64: string) => {
return {
backgroundImage: 'url(data:image/png;;base64,' + base64 + ')',
};
}),

CopilotAIApr 6, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The generated data URL has an extra semicolon (data:image/png;;base64,). This is not a valid data URL in all browsers and can prevent the preview avatar from rendering. Use data:image/png;base64,.

Copilot uses AI. Check for mistakes.
Comment on lines +135 to +149
async onSubmit(){
const user = this.authService.currentUserValue;
if (!user.logged){
this.snackBar.open('Vous devez être connecté pour pouvoir candidater', 'Ok', {duration: 5000, panelClass: 'snackbar-error'});
if (!user.logged) {
this.snackBar.open(
'Vous devez être connecté pour pouvoir candidater',
'Ok',
{ duration: 5000, panelClass: 'snackbar-error' },
);
}
try {
await lastValueFrom(
this.candidatureProcess.candidatureProcessControllerPostCandidature({candidature: this.candidatureForm.value.candidature, minecraftUUID:this.uuid})
this.candidatureProcess.candidatureProcessControllerPostCandidature({
candidature: this.candidatureForm.value.candidature,
minecraftUUID: this.uuid,
}),

CopilotAIApr 6, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After showing the "Vous devez être connecté" snackbar, onSubmit() continues and still attempts to POST the candidature. This can generate unnecessary API calls and confusing errors; return early when the user is not logged in.

Copilot uses AI. Check for mistakes.
Comment on lines +12 to +13
<span>AGPL-3.0</span></a
>

CopilotAIApr 6, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is malformed HTML around the license link: </a is followed by a stray > on the next line. This will render an extra > character and can break layout/DOM parsing. Remove the stray > and ensure the <a> tag is properly closed.

Suggested change
<span>AGPL-3.0</span></a
>
<span>AGPL-3.0</span>
</a>

Copilot uses AI. Check for mistakes.
Comment on lines +22 to 25
>
<mat-icon svgIcon="github"></mat-icon>
<span>&nbsp;Github</span>
</a>

CopilotAIApr 6, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Display text should use the correct brand capitalization: change "Github" to "GitHub".

Copilot uses AI. Check for mistakes.
<mat-checkbox [(ngModel)]="notDisplayAnymore">Ne plus afficher</mat-checkbox>
<p>
Lorsque vous vous connectez ou vous inscrivez à Litopia via discord,<br />
le Litobot vous ferra automatiquement rejoindre notre serveur discord.

CopilotAIApr 6, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo in user-facing text: "vous ferra" should be "vous fera".

Suggested change
le Litobot vous ferra automatiquement rejoindre notre serveur discord.
le Litobot vous fera automatiquement rejoindre notre serveur discord.

Copilot uses AI. Check for mistakes.
Comment on lines +10 to +11
>Ne plus afficher</mat-checkbox
>

CopilotAIApr 6, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a stray > after the closing </mat-checkbox> (it appears on its own line). This produces invalid HTML and may render an extra character. Remove the extra > and keep the checkbox element properly formatted.

Suggested change
>Ne plus afficher</mat-checkbox
>
>Ne plus afficher</mat-checkbox>

Copilot uses AI. Check for mistakes.
Comment threadkarma.conf.js
Comment on lines 6 to 14
basePath: '',
frameworks: ['jasmine', '@angular-devkit/build-angular'],
plugins: [
require('karma-jasmine'),
require('karma-chrome-launcher'),
require('karma-jasmine-html-reporter'),
require('karma-coverage'),
require('@angular-devkit/build-angular/plugins/karma')

],

CopilotAIApr 6, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Karma config still references @angular-devkit/build-angular in frameworks, but @angular-devkit/build-angular was removed from devDependencies and the project switched to @angular/build:karma. Update frameworks/plugins to the Angular 21 equivalents (and include the appropriate Angular Karma plugin) so npm test works.

Copilot uses AI. Check for mistakes.
@mrsolarius

Copy link
Copy Markdown
ContributorAuthor

@copilot apply changes based on the comments in this thread

@mrsolarius

Copy link
Copy Markdown
ContributorAuthor

@copilot fix the pipeline to be compatible with angular 21

CopilotAI commented Apr 7, 2026

Copy link
Copy Markdown
Contributor

@copilot apply changes based on the comments in this thread

Applied all changes from the review in commit 80a4818:

  1. themes-chooser.service.ts – Moved DOCUMENT import to @angular/common
  2. fullscreen-img-text.component.ts – Fixed swapped isAppear()/appear() methods (isAppear now returns boolean, appear now adds to set)
  3. server.ts – Changed static route to '*.*' with index: false so SSR handles all non-asset routes
  4. nous-rejoindre-form.component.ts – Fixed data:image/png;;base64,data:image/png;base64,; added return after the "not logged in" snackbar to prevent the POST from proceeding
  5. footer.component.html – Fixed malformed </a split tag and changed "Github" → "GitHub"
  6. auth-popup.component.html – Fixed typo "ferra" → "fera"; removed stray > from </mat-checkbox>
  7. karma.conf.js – Updated framework from @angular-devkit/build-angular to @angular/build and added require('@angular/build/plugins/karma') to plugins

- Deleted various compressed image files (AVIF, JPEG, WEBP) for 'litopia-s4-ville-asia', 'litopia-s5-coronacave', and 'litopia-s5-netherreactor' across multiple resolutions.
- Updated index.html to change font links and added crossorigin attribute for preconnect.
- Refactored styles.scss to remove font imports and streamline styles.
- Added new tools for analyzing bundle stats and generating image variants using sharp.
…ponents
- Updated the HTML structure in `a-propos.component.html` for better readability and maintainability.
- Simplified button links in `fullscreen-img-text.component.html`, `season-presentations.component.html`, and `archives.component.html` by removing redundant href attributes.
- Enhanced styling in `season-presentations.component.scss` for better responsiveness.
- Adjusted layout in `archives.component.scss` to ensure full-width display of grid items.
- Improved form structure and validation messages in `nous-rejoindre-form-adhesion.component.html` and `nous-rejoindre-form.component.html`.
- Streamlined image generation script in `generate-images.mjs` to check for existing files before regeneration.
- Updated `appear.directive.ts` to optimize visibility checks and improve performance.
- Adjusted base styles in `litopia-base.scss` for consistent image alignment and sizing.
@mrsolarius
mrsolarius requested a review from CopilotApril 10, 2026 17:10

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 82 out of 413 changed files in this pull request and generated 5 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +55 to +62
private async renderCandidature(candidature: string) {
try {
const { marked } = await import('marked');
this.descriptionField = await marked.parse(candidature);
} catch (_error) {
this.descriptionField = candidature;
}
}

CopilotAIApr 10, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

marked.parse() returns HTML. If descriptionField is rendered via [innerHTML] (common for markdown), this introduces an XSS risk because user-provided candidature can inject arbitrary HTML/JS. Recommended fix: sanitize the generated HTML before binding (e.g., via DOMPurify), and/or configure the markdown pipeline to disable raw HTML rendering; avoid using bypassSecurityTrustHtml on untrusted content.

Copilot uses AI. Check for mistakes.
Comment on lines +95 to +116
@if (mcAccount.value.length == 0) {
<mat-hint align="end"
>Saisissez au moins 3 caractères</mat-hint
>
}
@if (mcAccount.value.length > 0 && mcAccount.value.length < 3) {
<mat-hint align="end"
>Plus que {{ 3 - mcAccount.value.length }}...</mat-hint
>
}
@if (
mcAccount.value.length >= 3 && mcAccount.value.length <= 16
) {
<mat-hint align="end"
>{{ 16 - mcAccount.value.length }} caractères
restants</mat-hint
>
}
@if (mcAccount.value.length > 16) {
<mat-hint align="end"
>Trop long de
{{ mcAccount.value.length - 16 }} caractères</mat-hint

CopilotAIApr 10, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mcAccount.value can be null depending on the control state, which would throw at runtime when accessing .length. Make these checks null-safe (e.g., derive a mcLen = (mcAccount.value?.length ?? 0) and use that for all conditions/expressions).

Suggested change
@if (mcAccount.value.length == 0) {
<mat-hintalign="end"
>Saisissez au moins 3 caractères</mat-hint
>
}
@if (mcAccount.value.length > 0 && mcAccount.value.length <3){
<mat-hintalign="end"
>Plus que {{ 3 - mcAccount.value.length }}...</mat-hint
>
}
@if (
mcAccount.value.length >= 3 && mcAccount.value.length <= 16
) {
<mat-hintalign="end"
>{{ 16 - mcAccount.value.length }} caractères
restants</mat-hint
>
}
@if (mcAccount.value.length > 16) {
<mat-hintalign="end"
>Trop long de
{{ mcAccount.value.length - 16 }} caractères</mat-hint
@if ((mcAccount.value?.length ?? 0) == 0) {
<mat-hintalign="end"
>Saisissez au moins 3 caractères</mat-hint
>
}
@if (
(mcAccount.value?.length ?? 0) > 0 &&
(mcAccount.value?.length ?? 0) <3
) {
<mat-hintalign="end"
>Plus que {{ 3 - (mcAccount.value?.length ?? 0) }}...</mat-hint
>
}
@if (
(mcAccount.value?.length ?? 0) >= 3 &&
(mcAccount.value?.length ?? 0) <= 16
) {
<mat-hintalign="end"
>{{ 16 - (mcAccount.value?.length ?? 0) }} caractères
restants</mat-hint
>
}
@if ((mcAccount.value?.length ?? 0) > 16) {
<mat-hintalign="end"
>Trop long de
{{ (mcAccount.value?.length ?? 0) - 16 }} caractères</mat-hint

Copilot uses AI. Check for mistakes.
);
return { takenUsername: true };
} catch (e) {
console.log(e);

CopilotAIApr 10, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Logging raw errors to console.log inside a validator will spam the console in normal user flows (and may leak details in production). Prefer removing this log or using a structured logger gated by environment/debug mode.

Suggested change
console.log(e);

Copilot uses AI. Check for mistakes.
Comment on lines +132 to +137
const y = window.top!.outerHeight / 2 + window.top!.screenY - h / 2;
const x = window.top!.outerWidth / 2 + window.top!.screenX - w / 2;
return window.open(
url,
'',
`toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=${w}, height=${h}, top=${y}, left=${x}`,

CopilotAIApr 10, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This method uses the global window even though the service already injects a WINDOWS token (this.windows) for platform abstraction/mocking. Use this.windows here as well (and avoid non-null assertions on top) to keep the SSR/testability model consistent and prevent hard failures if window.top is unavailable (e.g., sandboxed iframes).

Suggested change
consty=window.top!.outerHeight/2+window.top!.screenY-h/2;
constx=window.top!.outerWidth/2+window.top!.screenX-w/2;
returnwindow.open(
url,
'',
`toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=${w}, height=${h}, top=${y}, left=${x}`,
constparentWindow=this.windows?.top??this.windows;
constouterHeight=parentWindow?.outerHeight??0;
constouterWidth=parentWindow?.outerWidth??0;
constscreenY=parentWindow?.screenY??0;
constscreenX=parentWindow?.screenX??0;
consty=outerHeight/2+screenY-h/2;
constx=outerWidth/2+screenX-w/2;
return(
this.windows?.open(
url,
'',
`toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=${w}, height=${h}, top=${y}, left=${x}`,
)??null

Copilot uses AI. Check for mistakes.
</a>
</div>
} @else {
<h2>Tu as déjà rédigé ta canidature</h2>

CopilotAIApr 10, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo: 'canidature' should be 'candidature'.

Suggested change
<h2>Tu as déjà rédigé ta canidature</h2>
<h2>Tu as déjà rédigé ta candidature</h2>

Copilot uses AI. Check for mistakes.
@mrsolarius

Copy link
Copy Markdown
ContributorAuthor

@copilot apply changes based on the comments in this thread

CopilotAI commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

@copilot fix the pipeline to be compatible with angular 21

Fixed in commit 3ae3d6d. The pipeline changes:

  • tests.yml: upgraded actions/checkout@v3@v4 and actions/setup-node@v3@v4 (the v3 actions were deprecated and running on Node.js 20 which will be removed from runners)
  • Dockerfile: upgraded base image from node:16 to node:22 (Angular 21 requires Node.js ≥20.19 or ≥22.12)

@copilot apply changes based on the comments in this thread

Applied all changes from that review thread in commit 3ae3d6d:

  1. profil.component.tsmarked.parse() output is now sanitized via DomSanitizer.sanitize(SecurityContext.HTML, ...) before being bound to [innerHTML]
  2. nous-rejoindre-form.component.html – All mcAccount.value.length accesses are now null-safe (mcAccount.value?.length ?? 0)
  3. nous-rejoindre-form.component.ts – Removed console.log(e) from the validator
  4. authentication.service.tspopupCenter() now uses this.windows throughout instead of the global window; top is accessed safely via optional chaining with fallback
  5. nous-rejoindre-form.component.html – Fixed typo 'canidature' → 'candidature'

@mrsolarius
mrsolarius merged commit b34333e into mainApr 10, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@mrsolarius