From edbe7d498cfd66803c8f82d3aaa1f65d99b740ae Mon Sep 17 00:00:00 2001 From: Laforge Thomas <30832608+tomalaforge@users.noreply.github.com> Date: Mon, 20 May 2024 13:34:04 +0200 Subject: [PATCH] challenge 51: signal effect trigger too often (#855) * feat: challenge 51 * fix: permission denied --- README.md | 2 +- .../51-function-call-effect/.eslintrc.json | 36 +++++++++ apps/signal/51-function-call-effect/README.md | 13 ++++ .../51-function-call-effect/project.json | 72 ++++++++++++++++++ .../src/app/action.component.ts | 45 +++++++++++ .../src/app/app.component.ts | 34 +++++++++ .../src/app/app.config.ts | 5 ++ .../src/app/user.service.ts | 10 +++ .../src/assets/.gitkeep | 0 .../51-function-call-effect/src/favicon.ico | Bin 0 -> 15086 bytes .../51-function-call-effect/src/index.html | 13 ++++ .../51-function-call-effect/src/main.ts | 7 ++ .../51-function-call-effect/src/styles.scss | 5 ++ .../tailwind.config.js | 14 ++++ .../51-function-call-effect/tsconfig.app.json | 10 +++ .../tsconfig.editor.json | 6 ++ .../51-function-call-effect/tsconfig.json | 30 ++++++++ challenge-number.json | 4 +- .../angular/50-bug-effect-signal.md | 21 +++++ .../challenges/signal/50-bug-effect-signal.md | 1 - .../signal/51-function-call-effect.md | 22 ++++++ docs/src/content/docs/es/index.mdx | 6 +- docs/src/content/docs/fr/index.mdx | 6 +- docs/src/content/docs/index.mdx | 8 +- docs/src/content/docs/pt/index.mdx | 6 +- docs/src/content/docs/ru/index.mdx | 6 +- 26 files changed, 362 insertions(+), 20 deletions(-) create mode 100644 apps/signal/51-function-call-effect/.eslintrc.json create mode 100644 apps/signal/51-function-call-effect/README.md create mode 100644 apps/signal/51-function-call-effect/project.json create mode 100644 apps/signal/51-function-call-effect/src/app/action.component.ts create mode 100644 apps/signal/51-function-call-effect/src/app/app.component.ts create mode 100644 apps/signal/51-function-call-effect/src/app/app.config.ts create mode 100644 apps/signal/51-function-call-effect/src/app/user.service.ts create mode 100644 apps/signal/51-function-call-effect/src/assets/.gitkeep create mode 100644 apps/signal/51-function-call-effect/src/favicon.ico create mode 100644 apps/signal/51-function-call-effect/src/index.html create mode 100644 apps/signal/51-function-call-effect/src/main.ts create mode 100644 apps/signal/51-function-call-effect/src/styles.scss create mode 100644 apps/signal/51-function-call-effect/tailwind.config.js create mode 100644 apps/signal/51-function-call-effect/tsconfig.app.json create mode 100644 apps/signal/51-function-call-effect/tsconfig.editor.json create mode 100644 apps/signal/51-function-call-effect/tsconfig.json create mode 100644 docs/src/content/docs/challenges/angular/50-bug-effect-signal.md create mode 100644 docs/src/content/docs/challenges/signal/51-function-call-effect.md diff --git a/README.md b/README.md index 86da5d7..a50b2c0 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ If you would like to propose a challenge, this project is open source, so feel f ## Challenges -Check [all 50 challenges](https://angular-challenges.vercel.app/) +Check [all 51 challenges](https://angular-challenges.vercel.app/) ## Contributors ✨ diff --git a/apps/signal/51-function-call-effect/.eslintrc.json b/apps/signal/51-function-call-effect/.eslintrc.json new file mode 100644 index 0000000..8ebcbfd --- /dev/null +++ b/apps/signal/51-function-call-effect/.eslintrc.json @@ -0,0 +1,36 @@ +{ + "extends": ["../../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts"], + "extends": [ + "plugin:@nx/angular", + "plugin:@angular-eslint/template/process-inline-templates" + ], + "rules": { + "@angular-eslint/directive-selector": [ + "error", + { + "type": "attribute", + "prefix": "app", + "style": "camelCase" + } + ], + "@angular-eslint/component-selector": [ + "error", + { + "type": "element", + "prefix": "app", + "style": "kebab-case" + } + ] + } + }, + { + "files": ["*.html"], + "extends": ["plugin:@nx/angular-template"], + "rules": {} + } + ] +} diff --git a/apps/signal/51-function-call-effect/README.md b/apps/signal/51-function-call-effect/README.md new file mode 100644 index 0000000..6d45433 --- /dev/null +++ b/apps/signal/51-function-call-effect/README.md @@ -0,0 +1,13 @@ +# Function call in effect + +> author: thomas-laforge + +### Run Application + +```bash +npx nx serve signal-function-call-effect +``` + +### Documentation and Instruction + +Challenge documentation is [here](https://angular-challenges.vercel.app/challenges/angular/51-function-call-effect/). diff --git a/apps/signal/51-function-call-effect/project.json b/apps/signal/51-function-call-effect/project.json new file mode 100644 index 0000000..e84c793 --- /dev/null +++ b/apps/signal/51-function-call-effect/project.json @@ -0,0 +1,72 @@ +{ + "name": "signal-function-call-effect", + "$schema": "../../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "prefix": "app", + "sourceRoot": "apps/signal/51-function-call-effect/src", + "tags": [], + "targets": { + "build": { + "executor": "@angular-devkit/build-angular:application", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/apps/signal/51-function-call-effect", + "index": "apps/signal/51-function-call-effect/src/index.html", + "browser": "apps/signal/51-function-call-effect/src/main.ts", + "polyfills": ["zone.js"], + "tsConfig": "apps/signal/51-function-call-effect/tsconfig.app.json", + "inlineStyleLanguage": "scss", + "assets": [ + "apps/signal/51-function-call-effect/src/favicon.ico", + "apps/signal/51-function-call-effect/src/assets" + ], + "styles": ["apps/signal/51-function-call-effect/src/styles.scss"], + "scripts": [] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "executor": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "signal-function-call-effect:build:production" + }, + "development": { + "buildTarget": "signal-function-call-effect:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "executor": "@angular-devkit/build-angular:extract-i18n", + "options": { + "buildTarget": "signal-function-call-effect:build" + } + }, + "lint": { + "executor": "@nx/eslint:lint" + } + } +} diff --git a/apps/signal/51-function-call-effect/src/app/action.component.ts b/apps/signal/51-function-call-effect/src/app/action.component.ts new file mode 100644 index 0000000..bbdc824 --- /dev/null +++ b/apps/signal/51-function-call-effect/src/app/action.component.ts @@ -0,0 +1,45 @@ +import { + ChangeDetectionStrategy, + Component, + effect, + inject, + signal, +} from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { UserService } from './user.service'; + +@Component({ + standalone: true, + imports: [FormsModule], + selector: 'app-actions', + template: ` +
+ + +
+ `, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ActionsComponent { + private userService = inject(UserService); + protected action = signal(undefined); + + protected actions = ['Create', 'Read', 'Update', 'Delete']; + + constructor() { + effect(() => { + this.userService.log(this.action() ?? 'No action selected'); + }); + } +} diff --git a/apps/signal/51-function-call-effect/src/app/app.component.ts b/apps/signal/51-function-call-effect/src/app/app.component.ts new file mode 100644 index 0000000..69fd23f --- /dev/null +++ b/apps/signal/51-function-call-effect/src/app/app.component.ts @@ -0,0 +1,34 @@ +import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { ActionsComponent } from './action.component'; +import { UserService } from './user.service'; + +@Component({ + standalone: true, + imports: [FormsModule, ActionsComponent], + selector: 'app-root', + template: ` + + + + `, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AppComponent { + protected userService = inject(UserService); + + protected users = ['Thomas', 'John', 'Alice', 'Bob', 'Charlie', 'David']; +} diff --git a/apps/signal/51-function-call-effect/src/app/app.config.ts b/apps/signal/51-function-call-effect/src/app/app.config.ts new file mode 100644 index 0000000..81a6edd --- /dev/null +++ b/apps/signal/51-function-call-effect/src/app/app.config.ts @@ -0,0 +1,5 @@ +import { ApplicationConfig } from '@angular/core'; + +export const appConfig: ApplicationConfig = { + providers: [], +}; diff --git a/apps/signal/51-function-call-effect/src/app/user.service.ts b/apps/signal/51-function-call-effect/src/app/user.service.ts new file mode 100644 index 0000000..b43756b --- /dev/null +++ b/apps/signal/51-function-call-effect/src/app/user.service.ts @@ -0,0 +1,10 @@ +import { Injectable, signal } from '@angular/core'; + +@Injectable({ providedIn: 'root' }) +export class UserService { + name = signal('Thomas'); + + log(message: string) { + console.log(`${this.name()}: ${message}`); + } +} diff --git a/apps/signal/51-function-call-effect/src/assets/.gitkeep b/apps/signal/51-function-call-effect/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/signal/51-function-call-effect/src/favicon.ico b/apps/signal/51-function-call-effect/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..317ebcb2336e0833a22dddf0ab287849f26fda57 GIT binary patch literal 15086 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 + + + + angular-function-call-effect + + + + + + + + diff --git a/apps/signal/51-function-call-effect/src/main.ts b/apps/signal/51-function-call-effect/src/main.ts new file mode 100644 index 0000000..f3a7223 --- /dev/null +++ b/apps/signal/51-function-call-effect/src/main.ts @@ -0,0 +1,7 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { AppComponent } from './app/app.component'; +import { appConfig } from './app/app.config'; + +bootstrapApplication(AppComponent, appConfig).catch((err) => + console.error(err), +); diff --git a/apps/signal/51-function-call-effect/src/styles.scss b/apps/signal/51-function-call-effect/src/styles.scss new file mode 100644 index 0000000..77e408a --- /dev/null +++ b/apps/signal/51-function-call-effect/src/styles.scss @@ -0,0 +1,5 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* You can add global styles to this file, and also import other style files */ diff --git a/apps/signal/51-function-call-effect/tailwind.config.js b/apps/signal/51-function-call-effect/tailwind.config.js new file mode 100644 index 0000000..38183db --- /dev/null +++ b/apps/signal/51-function-call-effect/tailwind.config.js @@ -0,0 +1,14 @@ +const { createGlobPatternsForDependencies } = require('@nx/angular/tailwind'); +const { join } = require('path'); + +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + join(__dirname, 'src/**/!(*.stories|*.spec).{ts,html}'), + ...createGlobPatternsForDependencies(__dirname), + ], + theme: { + extend: {}, + }, + plugins: [], +}; diff --git a/apps/signal/51-function-call-effect/tsconfig.app.json b/apps/signal/51-function-call-effect/tsconfig.app.json new file mode 100644 index 0000000..5822042 --- /dev/null +++ b/apps/signal/51-function-call-effect/tsconfig.app.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "types": [] + }, + "files": ["src/main.ts"], + "include": ["src/**/*.d.ts"], + "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] +} diff --git a/apps/signal/51-function-call-effect/tsconfig.editor.json b/apps/signal/51-function-call-effect/tsconfig.editor.json new file mode 100644 index 0000000..a8ac182 --- /dev/null +++ b/apps/signal/51-function-call-effect/tsconfig.editor.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "include": ["src/**/*.ts"], + "compilerOptions": {}, + "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] +} diff --git a/apps/signal/51-function-call-effect/tsconfig.json b/apps/signal/51-function-call-effect/tsconfig.json new file mode 100644 index 0000000..3df17b9 --- /dev/null +++ b/apps/signal/51-function-call-effect/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "target": "es2022", + "useDefineForClassFields": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.editor.json" + }, + { + "path": "./tsconfig.app.json" + } + ], + "extends": "../../../tsconfig.base.json", + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/challenge-number.json b/challenge-number.json index b4b38aa..7891d9a 100644 --- a/challenge-number.json +++ b/challenge-number.json @@ -1,6 +1,6 @@ { - "total": 50, - "🟢": 19, + "total": 51, + "🟢": 20, "🟠": 121, "🔴": 209 } diff --git a/docs/src/content/docs/challenges/angular/50-bug-effect-signal.md b/docs/src/content/docs/challenges/angular/50-bug-effect-signal.md new file mode 100644 index 0000000..0e73301 --- /dev/null +++ b/docs/src/content/docs/challenges/angular/50-bug-effect-signal.md @@ -0,0 +1,21 @@ +--- +title: 🟢 Bug in Effect ? +description: Challenge 50 is about understanding why an effect is not triggered. +author: thomas-laforge +contributors: + - tomalaforge +challengeNumber: 50 +command: angular-bug-effect-signal +sidebar: + order: 19 +--- + +## Information + +In this basic exercise, we aim to display an alert whenever at least one checkbox is checked. + +## Statement + +The alert correctly triggers when clicking on each checkbox separately. However, if you first click on one checkbox and then click on a second one, the alert fails to appear. Why does this happen? + +The objective of this challenge is to understand and correct the issue preventing the alert from appearing when the second checkbox is clicked. diff --git a/docs/src/content/docs/challenges/signal/50-bug-effect-signal.md b/docs/src/content/docs/challenges/signal/50-bug-effect-signal.md index f5fb178..3715b2c 100644 --- a/docs/src/content/docs/challenges/signal/50-bug-effect-signal.md +++ b/docs/src/content/docs/challenges/signal/50-bug-effect-signal.md @@ -9,7 +9,6 @@ challengeNumber: 50 command: signal-bug-in-effect sidebar: order: 19 - badge: New --- ## Information diff --git a/docs/src/content/docs/challenges/signal/51-function-call-effect.md b/docs/src/content/docs/challenges/signal/51-function-call-effect.md new file mode 100644 index 0000000..91d02bd --- /dev/null +++ b/docs/src/content/docs/challenges/signal/51-function-call-effect.md @@ -0,0 +1,22 @@ +--- +title: 🟢 Function call in effect +description: Challenge 51 is about understanding why an effect is triggered too often. +author: thomas-laforge +contributors: + - tomalaforge +challengeNumber: 51 +command: signal-function-call-effect +sidebar: + order: 20 + badge: New +--- + +## Information + +In this second challenge focusing on Signal effects, we've introduced an input select that allows users to choose an action. Whenever an action is selected, it is logged in the console. The application also permits changes to the selected user. + +## Problem Statement + +Ideally, the system should log an action only when one is specifically selected. However, we currently face an issue where changing the user also triggers a log entry, even though we do not explicitly monitor user changes. + +The objective of this challenge is to identify and resolve the cause of these extra triggers. We aim to ensure that logging only occurs when an action is selected. diff --git a/docs/src/content/docs/es/index.mdx b/docs/src/content/docs/es/index.mdx index 2772914..cefa56b 100644 --- a/docs/src/content/docs/es/index.mdx +++ b/docs/src/content/docs/es/index.mdx @@ -13,7 +13,7 @@ hero: icon: right-arrow variant: primary - text: Ir al Desafío más reciente - link: /es/signal/angular/50-bug-effect-signal/ + link: /es/challenges/signal/51-function-call-effect icon: rocket - text: Dar una estrella link: https://github.com/tomalaforge/angular-challenges @@ -26,8 +26,8 @@ import MyIcon from '../../../components/MyIcon.astro'; import SubscriptionForm from '../../../components/SubscriptionForm.astro'; - - Este repositorio contiene 50 Desafíos relacionados con Angular, Nx, RxJS, Ngrx y Typescript. + + Este repositorio contiene 51 Desafíos relacionados con Angular, Nx, RxJS, Ngrx y Typescript. Estos desafíos se resuelven en torno a problemas de la vida real o características específicas para mejorar tus habilidades. diff --git a/docs/src/content/docs/fr/index.mdx b/docs/src/content/docs/fr/index.mdx index 98b1b8e..e510057 100644 --- a/docs/src/content/docs/fr/index.mdx +++ b/docs/src/content/docs/fr/index.mdx @@ -13,7 +13,7 @@ hero: icon: right-arrow variant: primary - text: Aller au dernier Challenge - link: /fr/challenges/signal/50-bug-effect-signal/ + link: /fr/challenges/signal/51-function-call-effect icon: rocket - text: Donne une étoile link: https://github.com/tomalaforge/angular-challenges @@ -26,8 +26,8 @@ import MyIcon from '../../../components/MyIcon.astro'; import SubscriptionForm from '../../../components/SubscriptionForm.astro'; - - Ce répertoire rassemble 50 Défis liés à Angular, Nx, RxJS, Ngrx et Typescript. Ces défis portent sur des problèmes réels ou des fonctionnalités spécifiques pour améliorer vos compétences. + + Ce répertoire rassemble 51 Défis liés à Angular, Nx, RxJS, Ngrx et Typescript. Ces défis portent sur des problèmes réels ou des fonctionnalités spécifiques pour améliorer vos compétences. diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx index afb2f50..60f3a6d 100644 --- a/docs/src/content/docs/index.mdx +++ b/docs/src/content/docs/index.mdx @@ -13,7 +13,7 @@ hero: icon: right-arrow variant: primary - text: Go to the latest Challenge - link: /challenges/signal/50-bug-effect-signal/ + link: /challenges/signal/51-function-call-effect icon: rocket - text: Give a star link: https://github.com/tomalaforge/angular-challenges @@ -27,9 +27,9 @@ import MyIcon from '../../components/MyIcon.astro'; import SubscriptionForm from '../../components/SubscriptionForm.astro'; - - This repository gathers 50 Challenges related to Angular, Nx, RxJS, NgRx and TypeScript. - These challenges revolve around real-life issues or specific features to elevate your skills. + + This repository gathers 51 Challenges related to Angular, Nx, RxJS, Ngrx and Typescript. + These challenges resolve around real-life issues or specific features to elevate your skills. diff --git a/docs/src/content/docs/pt/index.mdx b/docs/src/content/docs/pt/index.mdx index 55abc3a..e399368 100644 --- a/docs/src/content/docs/pt/index.mdx +++ b/docs/src/content/docs/pt/index.mdx @@ -13,7 +13,7 @@ hero: icon: right-arrow variant: primary - text: Ir para o desafio mais recente - link: /pt/challenges/signal/50-bug-effect-signal/ + link: /pt/challenges/signal/51-function-call-effect icon: rocket - text: Dar uma estrela link: https://github.com/tomalaforge/angular-challenges @@ -26,8 +26,8 @@ import MyIcon from '../../../components/MyIcon.astro'; import SubscriptionForm from '../../../components/SubscriptionForm.astro'; - - Este repositório possui 50 Desafios relacionados a Angular, Nx, RxJS, + + Este repositório possui 51 Desafios relacionados a Angular, Nx, RxJS, Ngrx e Typescript. Esses desafios são voltados para problemas reais ou funcionalidades específicas afim de melhorar suas habilidades. diff --git a/docs/src/content/docs/ru/index.mdx b/docs/src/content/docs/ru/index.mdx index e3f489c..79f2bd2 100644 --- a/docs/src/content/docs/ru/index.mdx +++ b/docs/src/content/docs/ru/index.mdx @@ -13,7 +13,7 @@ hero: icon: right-arrow variant: primary - text: Перейти к последней задаче - link: /ru/challenges/signal/50-bug-effect-signal/ + link: /ru/challenges/signal/51-function-call-effect icon: rocket - text: Добавить звезду link: https://github.com/tomalaforge/angular-challenges @@ -26,8 +26,8 @@ import MyIcon from '../../../components/MyIcon.astro'; import SubscriptionForm from '../../../components/SubscriptionForm.astro'; - - Этот репозиторий содержит 49 испытаний, связанных с Angular, Nx, RxJS, Ngrx и Typescript. + + Этот репозиторий содержит 51 испытаний, связанных с Angular, Nx, RxJS, Ngrx и Typescript. Испытания основаны на реальных задачах или инструментах для того, чтобы прокачать вас.