diff --git a/docs/src/content/docs/fr/challenges/angular/1-projection.md b/docs/src/content/docs/fr/challenges/angular/1-projection.md new file mode 100644 index 0000000..e93d0b3 --- /dev/null +++ b/docs/src/content/docs/fr/challenges/angular/1-projection.md @@ -0,0 +1,45 @@ +--- +title: 🟱 Projection +description: Le challenge 1 consiste Ă  apprendre Ă  projeter des Ă©lĂ©ments DOM Ă  travers des composants +author: thomas-laforge +contributors: + - alannelucq +challengeNumber: 1 +command: angular-projection +blogLink: https://medium.com/@thomas.laforge/create-a-highly-customizable-component-cc3a9805e4c5 +videoLink: + link: https://www.youtube.com/watch?v=npyEyUZxoIw&ab_channel=ArthurLannelucq + alt: Projection video by Arthur Lannelucq + flag: FR +sidebar: + order: 1 +--- + +## Information + +Dans Angular, la projection de contenu est une technique puissante pour crĂ©er des composants hautement personnalisables. Utiliser et comprendre les concepts liĂ©s aux ng-content et ngTemplateOutlet peut grandement amĂ©liorer votre capacitĂ© Ă  crĂ©er des composants rĂ©utilisables. + +Vous pouvez tout apprendre sur ng-content [ici](https://angular.dev/guide/components/content-projection), de la projection de contenu la plus simple jusqu'Ă  des utilisations plus complexes. + +Pour en savoir plus sur ngTemplateOutlet, vous pouvez trouver la documentation de l'API [ici](https://angular.io/api/common/NgTemplateOutlet) avec quelques exemples de base. + +Avec ces deux outils en main, vous ĂȘtes maintenant prĂȘt Ă  relever le dĂ©fi. + +## ÉnoncĂ© + +Vous commencerez avec une application entiĂšrement fonctionnelle qui comprend un tableau de bord contenant une carte pour les enseignants et une carte pour les Ă©lĂšves. L'objectif est de mettre en place la carte de la ville. + +Bien que l'application fonctionne, l'expĂ©rience dĂ©veloppeur est loin d'ĂȘtre optimale. Chaque fois que vous devez implĂ©menter une nouvelle carte, vous devez modifier le `card.component.ts`. Dans des projets rĂ©els, ce composant pourrait ĂȘtre partagĂ© entre de nombreuses applications. Le but du dĂ©fi est de crĂ©er un `CardComponent` qui peut ĂȘtre personnalisĂ© sans aucune modification. Une fois que vous aurez créé ce composant, vous pourrez commencer Ă  implĂ©menter le `CityCardComponent` et vous assurer de ne pas toucher au `CardComponent`. + +## Contraintes + +- Vous devez refactoriser le `CardComponent` et le `ListItemComponent`. +- La directive `NgFor` doit ĂȘtre dĂ©clarĂ©e et rester Ă  l'intĂ©rieur du `CardComponent`. Vous pourriez ĂȘtre tentĂ© de la dĂ©placer dans le `ParentCardComponent` comme `TeacherCardComponent`. +- Le composant `CardComponent` ne doit contenir aucun `NgIf` ni `NgSwitch`. +- CSS: essayez d'Ă©viter d'utiliser `::ng-deep`. Trouvez un meilleur moyen de gĂ©rer le style CSS. + +## Challenges Bonus + +- Essayez de travailler avec la nouvelle syntaxe de contrĂŽle de flux pour les boucles et les conditions (documentation [ici](https://angular.dev/guide/templates/control-flow)) +- Utilisez l'API des signals pour gĂ©rer l'Ă©tat de vos composants (documentation [ici](https://angular.dev/guide/signals)) +- Pour rĂ©fĂ©rencer le template, utilisez une directive au lieu d'une magic string ([Qu'est-ce qui pose problĂšme avec les magic string ?](https://softwareengineering.stackexchange.com/a/365344)) diff --git a/docs/src/content/docs/fr/challenges/angular/21-anchor-navigation.md b/docs/src/content/docs/fr/challenges/angular/21-anchor-navigation.md new file mode 100644 index 0000000..e8e7ea9 --- /dev/null +++ b/docs/src/content/docs/fr/challenges/angular/21-anchor-navigation.md @@ -0,0 +1,20 @@ +--- +title: 🟱 Naviguer sur une page +description: Le challenge 21 consiste Ă  apprendre Ă  utiliser la navigation intĂ©grĂ©e d'Angular +author: thomas-laforge +contributors: + - alannelucq +challengeNumber: 21 +command: angular-anchor-navigation +sidebar: + order: 4 +--- + +## Information + +Vous commencez avec une application qui possĂšde une navigation de base et une navigation par ancre dans le `HomeComponent`. Cependant, l'utilisation de `href` recrĂ©e le chemin Ă  chaque fois et rafraĂźchit la page. + +## ÉnoncĂ© + +- Votre tĂąche consiste Ă  refactoriser cette application pour utiliser la navigation intĂ©grĂ©e afin de mieux s'intĂ©grer dans le Framework Angular. Vous pouvez explorer le router, mais il est prĂ©fĂ©rable de rester dans le template et d'utiliser la directive `RouterLink`. +- Pour amĂ©liorer l'expĂ©rience utilisateur, ajoutez un scroll fluide. diff --git a/docs/src/content/docs/fr/challenges/angular/22-router-input.md b/docs/src/content/docs/fr/challenges/angular/22-router-input.md new file mode 100644 index 0000000..4bb9c83 --- /dev/null +++ b/docs/src/content/docs/fr/challenges/angular/22-router-input.md @@ -0,0 +1,28 @@ +--- +title: 🟱 @RouterInput() +description: Challenge 22 is about using the @Input decorator to retreive router params. +author: thomas-laforge +contributors: + - alannelucq +challengeNumber: 22 +command: angular-router-input +blogLink: https://medium.com/ngconf/accessing-route-params-in-angular-1f8e12770617 +sidebar: + order: 5 +--- + +## Information + +Dans cette application, nous rĂ©cupĂ©rons trois informations depuis le routeur dans notre `TestComponent` : + +- `testId` qui est situĂ© dans les paramĂštres de l'URL. +- `user` qui est situĂ© dans les paramĂštres de la requĂȘte de l'URL. +- `permission` qui est dĂ©fini dans l'objet `data` de la route. + +Jusqu'Ă  la version 15 d'Angular, nous devions utiliser le `ActivatedRoute` pour obtenir toutes ces informations et les rĂ©cupĂ©rer via des observables pour Ă©couter sur les changements d'URL. + +Depuis la version 16, Angular a introduit un nouvel `Input` qui peut Ă©couter les changements de donnĂ©es d'une route. Vous pouvez en savoir plus [ici](https://medium.com/ngconf/accessing-route-params-in-angular-1f8e12770617). + +## ÉnoncĂ© + +L'objectif de cet exercice est de refactoriser le code pour utiliser la nouvelle stratĂ©gie `RouterInput`. diff --git a/docs/src/content/docs/fr/challenges/angular/31-module-to-standalone.md b/docs/src/content/docs/fr/challenges/angular/31-module-to-standalone.md new file mode 100644 index 0000000..bd03566 --- /dev/null +++ b/docs/src/content/docs/fr/challenges/angular/31-module-to-standalone.md @@ -0,0 +1,29 @@ +--- +title: 🟱 Module vers Standalone +description: Le challenge 31 consiste Ă  migrer une application basĂ©e sur des modules vers une application standalone. +author: thomas-laforge +contributors: + - alannelucq +challengeNumber: 31 +command: angular-module-to-standalone +sidebar: + order: 6 +--- + +## Information + +Dans la version 14 d'Angular, les composants standalone ont Ă©tĂ© introduits et sont devenus stables dans la version 15. Si vous ne les avez pas encore essayĂ©s, il n'est jamais trop tard. Vous pouvez les essayer dans ce challenge. + +L'objectif est de voir comment **Nx** et les **composants standalone** fonctionnent ensemble, et d'expĂ©rimenter le processus de dĂ©couplage de votre application avec la bibliothĂšque Nx et les composants standalone. + +Les composants standalone sont trĂšs simples Ă  comprendre mais les utilisations de ces composants dans **le routing et via du lazy-loading** peuvent ĂȘtre un peu plus difficiles Ă  apprĂ©hender. Ce challenge vous permettra de manipuler des composants Ă  diffĂ©rents niveaux d'imbrication et de travailler avec des routes qui utilisent du lazy loading. + +AprĂšs avoir complĂ©tĂ© ce dĂ©fi, les composants standalone n'auront plus aucun secret pour vous. + +## ÉnoncĂ© + +L'objectif de ce challenge est de migrer votre application depuis des composants basĂ©s sur des modules vers des composants standalone. + +## Note + +Vous pouvez Ă©galement tester le [schematic Angular](https://angular.dev/reference/migrations/standalone) pour migrer les NgModule vers des composants standalone. _(Comme nous utilisons Nx, commencez votre commande par nx au lieu de ng)_ diff --git a/docs/src/content/docs/fr/challenges/angular/46-simple-animations.md b/docs/src/content/docs/fr/challenges/angular/46-simple-animations.md new file mode 100644 index 0000000..d204460 --- /dev/null +++ b/docs/src/content/docs/fr/challenges/angular/46-simple-animations.md @@ -0,0 +1,48 @@ +--- +title: 🟱 Animations Simples +description: Le challenge 46 consiste Ă  apprendre comment utiliser l'API d'animations intĂ©grĂ©e dans Angular +author: sven-brodny +contributors: + - alannelucq +challengeNumber: 46 +command: angular-simple-animations +sidebar: + order: 17 +--- + +## Information + +Il s'agit du premier des deux challenges sur les animations. Le but de cette sĂ©rie est de maĂźtriser les animations en Angular. + +Des animations bien conçues peuvent rendre votre application plus agrĂ©able et plus intuitive Ă  utiliser, mais elles ne sont pas seulement cosmĂ©tiques. Les animations peuvent amĂ©liorer votre application et l'expĂ©rience utilisateur de plusieurs façons : + +- Sans animations, les transitions de pages web peuvent sembler abruptes et dĂ©sagrĂ©ables. +- Le mouvement amĂ©liore grandement l'expĂ©rience utilisateur, les animations permettent donc aux utilisateurs de percevoir la rĂ©ponse de l'application Ă  leurs actions. +- De bonnes animations attirent intuitivement l'attention de l'utilisateur lĂ  oĂč elle est nĂ©cessaire. + +Je vous recommande de lire la [documentation officielle](https://angular.dev/guide/animations). Vous y apprendrez tout ce qui est nĂ©cessaire pour rĂ©ussir ce challenge. + +Vous pouvez Ă©galement regarder cet [exemple fonctionnel](https://svenson95.github.io/ng-xmp-animations/) et ce [repertoire git](https://github.com/svenson95/ng-xmp-animations) pour vous inspirer. + +## ÉnoncĂ© + +L'objectif de ce challenge est d'ajouter des animations qui doivent ĂȘtre dĂ©clenchĂ©es lorsque l'utilisateur arrive sur la page ou la recharge. + +## Contraintes + +- N'utilisez aucun CSS et utilisez l'API intĂ©grĂ©e d'Angular `@angular/animations`. +- Ne dĂ©clenchez pas les animations avec un bouton comme dans les exemples, mais lorsque l'utilisateur entre ou recharge la page. + +### Niveau 1 + +Ajoutez une animation de fondu ou de dĂ©placement pour les paragraphes sur le cĂŽtĂ© gauche. + + + +### Niveau 2 + +Ajoutez une animation en cascade pour la liste sur le cĂŽtĂ© droit. + + diff --git a/docs/src/content/docs/fr/challenges/angular/5-crud-application.md b/docs/src/content/docs/fr/challenges/angular/5-crud-application.md new file mode 100644 index 0000000..0ef30ec --- /dev/null +++ b/docs/src/content/docs/fr/challenges/angular/5-crud-application.md @@ -0,0 +1,52 @@ +--- +title: 🟱 Application CRUD +description: Le challenge 5 consiste Ă  refactoriser une application CRUD +author: thomas-laforge +contributors: + - alannelucq +challengeNumber: 5 +command: angular-crud-application +sidebar: + order: 2 +--- + +## Information + +Communiquer et synchroniser un Ă©tat global ou local avec votre backend est au cƓur de toute application. Vous devrez maĂźtriser les meilleures pratiques suivantes pour construire des applications Angular solides et fiables. + +## ÉnoncĂ© + +Dans cet exercice, vous avez une petite application CRUD dans laquelle vous pouvez rĂ©cupĂ©rer, mettre Ă  jour et supprimer des tĂąches. + +Pour le moment, nous avons un exemple fonctionnel mais qui est rempli de nombreuses mauvaises pratiques. + +### Étape 1 : refactoriser avec les meilleures pratiques + +Ce que vous devrez faire: + +- Évitez d'utiliser **any** comme type. Utiliser des interfaces pour tirer parti du systĂšme de typage de Typescript permet d'Ă©viter les erreurs. +- Utilisez un **service sĂ©parĂ©** pour tous vos appels HTTP et utilisez un **Signal** pour votre liste de tĂąches. +- Ne **mutez** pas les donnĂ©es + +```typescript +// À Ă©viter +this.todos[todoUpdated.id - 1] = todoUpdated; + +// PrivilĂ©gier une approche comme celle-ci, mais qui doit ĂȘtre amĂ©liorĂ©e car nous voulons toujours conserver le mĂȘme ordre +this.todos = [...this.todos.filter((t) => t.id !== todoUpdated.id), todoUpdated]; +``` + +### Étape 2 : AmĂ©liorer + +- Ajoutez un bouton **Supprimer** : _Documentation de l'API fictive_ +- GĂ©rez correctement les **erreurs**. _(De façon globale)_ +- Ajoutez un **indicateur de chargement** global. _Vous pouvez utilisez le MatProgressSpinnerModule_ + +### Étape 3 : MaintenabilitĂ© !! (ajoutez des tests) + +- Ajoutez 2/3 tests + +### Étape 4 : Effet waouw !!! (maĂźtrisez votre Ă©tat). + +- Utilisez le **component store de ngrx**, **ngrx/store**, **rxAngular**, **tanstack-query** ou **ngrx/signal-store** pour gĂ©rer l'Ă©tat local de votre composant. +- Ayez un indicateur de chargement/erreur **localisĂ©** , par exemple uniquement sur la tĂąche en cours de traitement et **dĂ©sactivez** tous les boutons sur cette tĂąche. _(Astuce: vous devrez crĂ©er un ItemComponent)_ diff --git a/docs/src/content/docs/fr/challenges/angular/8-pure-pipe.md b/docs/src/content/docs/fr/challenges/angular/8-pure-pipe.md new file mode 100644 index 0000000..0932e7a --- /dev/null +++ b/docs/src/content/docs/fr/challenges/angular/8-pure-pipe.md @@ -0,0 +1,37 @@ +--- +title: 🟱 Pipe pur +description: Le challenge 8 consiste Ă  crĂ©er un pipe pur +author: thomas-laforge +contributors: + - alannelucq +challengeNumber: 8 +command: angular-pure-pipe +blogLink: https://medium.com/ngconf/deep-dive-into-angular-pipes-c040588cd15d +sidebar: + order: 3 +--- + +## Information + +Il s'agit du premier des trois challenges `@Pipe()`. L'objectif de cette sĂ©rie est de maĂźtriser les **pipes** en Angular. + +Les pipes sont un moyen trĂšs puissant de transformer les donnĂ©es dans votre template. La diffĂ©rence entre appeler une fonction et un pipe rĂ©side dans le fait que les pipes purs sont mĂ©morisĂ©s. Ils ne seront donc pas recalculĂ©s Ă  chaque cycle de dĂ©tection des changements si les donnĂ©es en entrĂ©e n'ont pas changĂ©es. + +Les pipes sont conçus pour ĂȘtre efficaces et optimisĂ©s pour la performance. Ils utilisent des mĂ©canismes de dĂ©tection des changements pour ne recalculer la valeur que si la donnĂ©e en entrĂ©e change, ce qui minimise les calculs inutiles et amĂ©liore les performances de rendu. + +Par dĂ©faut, un pipe est pur. Vous devez ĂȘtre conscient que dĂ©finir `pure` Ă  false est susceptible d'ĂȘtre inefficace, car cela augmente le nombre de rerenders. + +:::note +Un pipe **pur** est appelĂ© uniquement lorsque la valeur change. +Un pipe **impur** est appelĂ© Ă  chaque cycle de dĂ©tection des changements. +::: + +Il existe quelques pipes prĂ©dĂ©finis utiles comme DatePipe, UpperCasePipe et CurrencyPipe. Pour en savoir plus sur les pipes dans Angular, consultez la documentation de l'API [ici](https://angular.dev/guide/pipes). + +## ÉnoncĂ© + +Dans cet exercice, vous devez refactoriser une fonction de transformation Ă  l'intĂ©rieur d'un composant qui est appelĂ©e dans votre template. L'objectif est de convertir cette fonction en un pipe. + +## Contraintes + +- Doit ĂȘtre fortement typĂ©