├── .github └── workflows │ └── deploy-pages-action.yml ├── .gitignore ├── LICENSE ├── README.md ├── angular12-corrections ├── 0-bootstrap │ └── search-films │ │ ├── .browserslistrc │ │ ├── .editorconfig │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.json │ │ ├── karma.conf.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ └── app.module.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.scss │ │ └── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 1-first-steps │ └── search-films │ │ ├── .browserslistrc │ │ ├── .editorconfig │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.json │ │ ├── karma.conf.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ └── login-form │ │ │ │ ├── login-form.component.html │ │ │ │ ├── login-form.component.scss │ │ │ │ ├── login-form.component.spec.ts │ │ │ │ └── login-form.component.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.scss │ │ └── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 2-directives │ └── search-films │ │ ├── .browserslistrc │ │ ├── .editorconfig │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.json │ │ ├── karma.conf.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ └── login-form │ │ │ │ ├── login-form.component.html │ │ │ │ ├── login-form.component.scss │ │ │ │ ├── login-form.component.spec.ts │ │ │ │ └── login-form.component.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.scss │ │ └── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 3-pipes │ └── search-films │ │ ├── .browserslistrc │ │ ├── .editorconfig │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.json │ │ ├── karma.conf.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── login-form │ │ │ │ ├── login-form.component.html │ │ │ │ ├── login-form.component.scss │ │ │ │ ├── login-form.component.spec.ts │ │ │ │ └── login-form.component.ts │ │ │ └── pipes │ │ │ │ ├── star-rating.pipe.spec.ts │ │ │ │ └── star-rating.pipe.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.scss │ │ └── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 4-components │ └── search-films │ │ ├── .browserslistrc │ │ ├── .editorconfig │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.json │ │ ├── karma.conf.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── components │ │ │ │ ├── film-search │ │ │ │ │ ├── film-search.component.html │ │ │ │ │ ├── film-search.component.scss │ │ │ │ │ ├── film-search.component.spec.ts │ │ │ │ │ └── film-search.component.ts │ │ │ │ ├── film │ │ │ │ │ ├── film.component.html │ │ │ │ │ ├── film.component.scss │ │ │ │ │ ├── film.component.spec.ts │ │ │ │ │ └── film.component.ts │ │ │ │ └── login-form │ │ │ │ │ ├── login-form.component.html │ │ │ │ │ ├── login-form.component.scss │ │ │ │ │ ├── login-form.component.spec.ts │ │ │ │ │ └── login-form.component.ts │ │ │ ├── models │ │ │ │ └── film.ts │ │ │ └── pipes │ │ │ │ ├── star-rating.pipe.spec.ts │ │ │ │ └── star-rating.pipe.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.scss │ │ └── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 5-routing │ └── search-films │ │ ├── .browserslistrc │ │ ├── .editorconfig │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.json │ │ ├── karma.conf.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── components │ │ │ │ ├── film-search │ │ │ │ │ ├── film-search.component.html │ │ │ │ │ ├── film-search.component.scss │ │ │ │ │ ├── film-search.component.spec.ts │ │ │ │ │ └── film-search.component.ts │ │ │ │ ├── film │ │ │ │ │ ├── film.component.html │ │ │ │ │ ├── film.component.scss │ │ │ │ │ ├── film.component.spec.ts │ │ │ │ │ └── film.component.ts │ │ │ │ ├── login-form │ │ │ │ │ ├── login-form.component.html │ │ │ │ │ ├── login-form.component.scss │ │ │ │ │ ├── login-form.component.spec.ts │ │ │ │ │ └── login-form.component.ts │ │ │ │ └── not-found │ │ │ │ │ ├── not-found.component.html │ │ │ │ │ ├── not-found.component.scss │ │ │ │ │ ├── not-found.component.spec.ts │ │ │ │ │ └── not-found.component.ts │ │ │ ├── models │ │ │ │ └── film.ts │ │ │ └── pipes │ │ │ │ ├── star-rating.pipe.spec.ts │ │ │ │ └── star-rating.pipe.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.scss │ │ └── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 6-services │ └── search-films │ │ ├── .browserslistrc │ │ ├── .editorconfig │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.json │ │ ├── karma.conf.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── components │ │ │ │ ├── film-search │ │ │ │ │ ├── film-search.component.html │ │ │ │ │ ├── film-search.component.scss │ │ │ │ │ ├── film-search.component.spec.ts │ │ │ │ │ └── film-search.component.ts │ │ │ │ ├── film │ │ │ │ │ ├── film.component.html │ │ │ │ │ ├── film.component.scss │ │ │ │ │ ├── film.component.spec.ts │ │ │ │ │ └── film.component.ts │ │ │ │ ├── login-form │ │ │ │ │ ├── login-form.component.html │ │ │ │ │ ├── login-form.component.scss │ │ │ │ │ ├── login-form.component.spec.ts │ │ │ │ │ └── login-form.component.ts │ │ │ │ └── not-found │ │ │ │ │ ├── not-found.component.html │ │ │ │ │ ├── not-found.component.scss │ │ │ │ │ ├── not-found.component.spec.ts │ │ │ │ │ └── not-found.component.ts │ │ │ ├── guards │ │ │ │ ├── authentication.guard.spec.ts │ │ │ │ └── authentication.guard.ts │ │ │ ├── models │ │ │ │ └── film.ts │ │ │ ├── pipes │ │ │ │ ├── star-rating.pipe.spec.ts │ │ │ │ └── star-rating.pipe.ts │ │ │ └── services │ │ │ │ └── authentication.service.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.scss │ │ └── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 7-http-calls │ └── search-films │ │ ├── .browserslistrc │ │ ├── .editorconfig │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.json │ │ ├── karma.conf.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── components │ │ │ │ ├── film-search │ │ │ │ │ ├── film-search.component.html │ │ │ │ │ ├── film-search.component.scss │ │ │ │ │ ├── film-search.component.spec.ts │ │ │ │ │ └── film-search.component.ts │ │ │ │ ├── film │ │ │ │ │ ├── film.component.html │ │ │ │ │ ├── film.component.scss │ │ │ │ │ ├── film.component.spec.ts │ │ │ │ │ └── film.component.ts │ │ │ │ ├── login-form │ │ │ │ │ ├── login-form.component.html │ │ │ │ │ ├── login-form.component.scss │ │ │ │ │ ├── login-form.component.spec.ts │ │ │ │ │ └── login-form.component.ts │ │ │ │ └── not-found │ │ │ │ │ ├── not-found.component.html │ │ │ │ │ ├── not-found.component.scss │ │ │ │ │ ├── not-found.component.spec.ts │ │ │ │ │ └── not-found.component.ts │ │ │ ├── guards │ │ │ │ ├── authentication.guard.spec.ts │ │ │ │ └── authentication.guard.ts │ │ │ ├── interceptors │ │ │ │ ├── authentication.interceptor.spec.ts │ │ │ │ └── authentication.interceptor.ts │ │ │ ├── models │ │ │ │ ├── authentication │ │ │ │ │ ├── login-request.ts │ │ │ │ │ ├── registration-request.ts │ │ │ │ │ └── user-response.ts │ │ │ │ └── film.ts │ │ │ ├── pipes │ │ │ │ ├── star-rating.pipe.spec.ts │ │ │ │ └── star-rating.pipe.ts │ │ │ └── services │ │ │ │ ├── authentication.service.ts │ │ │ │ └── film.service.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── proxy.conf.js │ │ ├── proxy.conf.json │ │ ├── styles.scss │ │ └── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 8-rxjs │ └── search-films │ │ ├── .browserslistrc │ │ ├── .editorconfig │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.json │ │ ├── karma.conf.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── components │ │ │ │ ├── film-search │ │ │ │ │ ├── film-search.component.html │ │ │ │ │ ├── film-search.component.scss │ │ │ │ │ ├── film-search.component.spec.ts │ │ │ │ │ └── film-search.component.ts │ │ │ │ ├── film │ │ │ │ │ ├── film.component.html │ │ │ │ │ ├── film.component.scss │ │ │ │ │ ├── film.component.spec.ts │ │ │ │ │ └── film.component.ts │ │ │ │ ├── login-form │ │ │ │ │ ├── login-form.component.html │ │ │ │ │ ├── login-form.component.scss │ │ │ │ │ ├── login-form.component.spec.ts │ │ │ │ │ └── login-form.component.ts │ │ │ │ └── not-found │ │ │ │ │ ├── not-found.component.html │ │ │ │ │ ├── not-found.component.scss │ │ │ │ │ ├── not-found.component.spec.ts │ │ │ │ │ └── not-found.component.ts │ │ │ ├── guards │ │ │ │ ├── authentication.guard.spec.ts │ │ │ │ └── authentication.guard.ts │ │ │ ├── interceptors │ │ │ │ ├── authentication.interceptor.spec.ts │ │ │ │ └── authentication.interceptor.ts │ │ │ ├── models │ │ │ │ ├── authentication │ │ │ │ │ ├── login-request.ts │ │ │ │ │ ├── registration-request.ts │ │ │ │ │ └── user-response.ts │ │ │ │ └── film.ts │ │ │ ├── pipes │ │ │ │ ├── star-rating.pipe.spec.ts │ │ │ │ └── star-rating.pipe.ts │ │ │ └── services │ │ │ │ ├── authentication.service.ts │ │ │ │ └── film.service.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── proxy.conf.js │ │ ├── proxy.conf.json │ │ ├── styles.scss │ │ └── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json └── 9-forms │ └── search-films │ ├── .browserslistrc │ ├── .editorconfig │ ├── .eslintrc.json │ ├── .gitignore │ ├── README.md │ ├── angular.json │ ├── e2e │ ├── protractor.conf.js │ ├── src │ │ ├── app.e2e-spec.ts │ │ └── app.po.ts │ └── tsconfig.json │ ├── karma.conf.js │ ├── package-lock.json │ ├── package.json │ ├── src │ ├── app │ │ ├── app-routing.module.ts │ │ ├── app.component.html │ │ ├── app.component.scss │ │ ├── app.component.spec.ts │ │ ├── app.component.ts │ │ ├── app.module.ts │ │ ├── components │ │ │ ├── film-search │ │ │ │ ├── film-search.component.html │ │ │ │ ├── film-search.component.scss │ │ │ │ ├── film-search.component.spec.ts │ │ │ │ └── film-search.component.ts │ │ │ ├── film │ │ │ │ ├── film.component.html │ │ │ │ ├── film.component.scss │ │ │ │ ├── film.component.spec.ts │ │ │ │ └── film.component.ts │ │ │ ├── login-form │ │ │ │ ├── login-form.component.html │ │ │ │ ├── login-form.component.scss │ │ │ │ ├── login-form.component.spec.ts │ │ │ │ └── login-form.component.ts │ │ │ └── not-found │ │ │ │ ├── not-found.component.html │ │ │ │ ├── not-found.component.scss │ │ │ │ ├── not-found.component.spec.ts │ │ │ │ └── not-found.component.ts │ │ ├── guards │ │ │ ├── authentication.guard.spec.ts │ │ │ └── authentication.guard.ts │ │ ├── interceptors │ │ │ ├── authentication.interceptor.spec.ts │ │ │ └── authentication.interceptor.ts │ │ ├── models │ │ │ ├── authentication │ │ │ │ ├── login-request.ts │ │ │ │ ├── registration-request.ts │ │ │ │ └── user-response.ts │ │ │ └── film.ts │ │ ├── pipes │ │ │ ├── star-rating.pipe.spec.ts │ │ │ └── star-rating.pipe.ts │ │ ├── services │ │ │ ├── authentication.service.ts │ │ │ └── film.service.ts │ │ └── utils │ │ │ └── password.validator.ts │ ├── assets │ │ └── .gitkeep │ ├── environments │ │ ├── environment.prod.ts │ │ └── environment.ts │ ├── favicon.ico │ ├── index.html │ ├── main.ts │ ├── polyfills.ts │ ├── proxy.conf.js │ ├── proxy.conf.json │ ├── styles.scss │ └── test.ts │ ├── tsconfig.app.json │ ├── tsconfig.json │ └── tsconfig.spec.json ├── angular15-corrections ├── 0-bootstrap │ └── search-films │ │ ├── .editorconfig │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ └── app.module.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 1-first-steps │ └── search-films │ │ ├── .editorconfig │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ └── components │ │ │ │ └── login-form │ │ │ │ ├── login-form.component.html │ │ │ │ ├── login-form.component.scss │ │ │ │ ├── login-form.component.spec.ts │ │ │ │ └── login-form.component.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 2-directives │ └── search-films │ │ ├── .editorconfig │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── components │ │ │ │ └── login-form │ │ │ │ │ ├── login-form.component.html │ │ │ │ │ ├── login-form.component.scss │ │ │ │ │ ├── login-form.component.spec.ts │ │ │ │ │ └── login-form.component.ts │ │ │ └── models │ │ │ │ └── film.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 3-pipes │ └── search-films │ │ ├── .editorconfig │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── components │ │ │ │ └── login-form │ │ │ │ │ ├── login-form.component.html │ │ │ │ │ ├── login-form.component.scss │ │ │ │ │ ├── login-form.component.spec.ts │ │ │ │ │ └── login-form.component.ts │ │ │ ├── models │ │ │ │ └── film.ts │ │ │ └── pipes │ │ │ │ ├── star-rating.pipe.spec.ts │ │ │ │ └── star-rating.pipe.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 4-components │ └── search-films │ │ ├── .editorconfig │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── components │ │ │ │ ├── film-search │ │ │ │ │ ├── film-search.component.html │ │ │ │ │ ├── film-search.component.scss │ │ │ │ │ ├── film-search.component.spec.ts │ │ │ │ │ └── film-search.component.ts │ │ │ │ ├── film │ │ │ │ │ ├── film.component.html │ │ │ │ │ ├── film.component.scss │ │ │ │ │ ├── film.component.spec.ts │ │ │ │ │ └── film.component.ts │ │ │ │ └── login-form │ │ │ │ │ ├── login-form.component.html │ │ │ │ │ ├── login-form.component.scss │ │ │ │ │ ├── login-form.component.spec.ts │ │ │ │ │ └── login-form.component.ts │ │ │ ├── models │ │ │ │ └── film.ts │ │ │ └── pipes │ │ │ │ ├── star-rating.pipe.spec.ts │ │ │ │ └── star-rating.pipe.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 5-routing │ └── search-films │ │ ├── .editorconfig │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── components │ │ │ │ ├── film-search │ │ │ │ │ ├── film-search.component.html │ │ │ │ │ ├── film-search.component.scss │ │ │ │ │ ├── film-search.component.spec.ts │ │ │ │ │ └── film-search.component.ts │ │ │ │ ├── film │ │ │ │ │ ├── film.component.html │ │ │ │ │ ├── film.component.scss │ │ │ │ │ ├── film.component.spec.ts │ │ │ │ │ └── film.component.ts │ │ │ │ ├── login-form │ │ │ │ │ ├── login-form.component.html │ │ │ │ │ ├── login-form.component.scss │ │ │ │ │ ├── login-form.component.spec.ts │ │ │ │ │ └── login-form.component.ts │ │ │ │ └── not-found │ │ │ │ │ ├── not-found.component.html │ │ │ │ │ ├── not-found.component.scss │ │ │ │ │ ├── not-found.component.spec.ts │ │ │ │ │ └── not-found.component.ts │ │ │ ├── models │ │ │ │ └── film.ts │ │ │ └── pipes │ │ │ │ ├── star-rating.pipe.spec.ts │ │ │ │ └── star-rating.pipe.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 6-services │ └── search-films │ │ ├── .editorconfig │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── components │ │ │ │ ├── film-search │ │ │ │ │ ├── film-search.component.html │ │ │ │ │ ├── film-search.component.scss │ │ │ │ │ ├── film-search.component.spec.ts │ │ │ │ │ └── film-search.component.ts │ │ │ │ ├── film │ │ │ │ │ ├── film.component.html │ │ │ │ │ ├── film.component.scss │ │ │ │ │ ├── film.component.spec.ts │ │ │ │ │ └── film.component.ts │ │ │ │ ├── login-form │ │ │ │ │ ├── login-form.component.html │ │ │ │ │ ├── login-form.component.scss │ │ │ │ │ ├── login-form.component.spec.ts │ │ │ │ │ └── login-form.component.ts │ │ │ │ └── not-found │ │ │ │ │ ├── not-found.component.html │ │ │ │ │ ├── not-found.component.scss │ │ │ │ │ ├── not-found.component.spec.ts │ │ │ │ │ └── not-found.component.ts │ │ │ ├── guards │ │ │ │ ├── authentication.guard.spec.ts │ │ │ │ └── authentication.guard.ts │ │ │ ├── models │ │ │ │ └── film.ts │ │ │ ├── pipes │ │ │ │ ├── star-rating.pipe.spec.ts │ │ │ │ └── star-rating.pipe.ts │ │ │ └── services │ │ │ │ └── authentication.service.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 7-http-calls │ └── search-films │ │ ├── .editorconfig │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── components │ │ │ │ ├── film-search │ │ │ │ │ ├── film-search.component.html │ │ │ │ │ ├── film-search.component.scss │ │ │ │ │ ├── film-search.component.spec.ts │ │ │ │ │ └── film-search.component.ts │ │ │ │ ├── film │ │ │ │ │ ├── film.component.html │ │ │ │ │ ├── film.component.scss │ │ │ │ │ ├── film.component.spec.ts │ │ │ │ │ └── film.component.ts │ │ │ │ ├── login-form │ │ │ │ │ ├── login-form.component.html │ │ │ │ │ ├── login-form.component.scss │ │ │ │ │ ├── login-form.component.spec.ts │ │ │ │ │ └── login-form.component.ts │ │ │ │ └── not-found │ │ │ │ │ ├── not-found.component.html │ │ │ │ │ ├── not-found.component.scss │ │ │ │ │ ├── not-found.component.spec.ts │ │ │ │ │ └── not-found.component.ts │ │ │ ├── guards │ │ │ │ ├── authentication.guard.spec.ts │ │ │ │ └── authentication.guard.ts │ │ │ ├── interceptors │ │ │ │ ├── authentication.interceptor.spec.ts │ │ │ │ └── authentication.interceptor.ts │ │ │ ├── models │ │ │ │ ├── film.ts │ │ │ │ ├── login-request.ts │ │ │ │ ├── registration-request.ts │ │ │ │ ├── user-response.ts │ │ │ │ └── user.ts │ │ │ ├── pipes │ │ │ │ ├── star-rating.pipe.spec.ts │ │ │ │ └── star-rating.pipe.ts │ │ │ └── services │ │ │ │ ├── authentication.service.ts │ │ │ │ ├── film.service.spec.ts │ │ │ │ └── film.service.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ ├── proxy.conf.json │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 8-rxjs │ └── search-films │ │ ├── .editorconfig │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── components │ │ │ │ ├── film-search │ │ │ │ │ ├── film-search.component.html │ │ │ │ │ ├── film-search.component.scss │ │ │ │ │ ├── film-search.component.spec.ts │ │ │ │ │ └── film-search.component.ts │ │ │ │ ├── film │ │ │ │ │ ├── film.component.html │ │ │ │ │ ├── film.component.scss │ │ │ │ │ ├── film.component.spec.ts │ │ │ │ │ └── film.component.ts │ │ │ │ ├── login-form │ │ │ │ │ ├── login-form.component.html │ │ │ │ │ ├── login-form.component.scss │ │ │ │ │ ├── login-form.component.spec.ts │ │ │ │ │ └── login-form.component.ts │ │ │ │ └── not-found │ │ │ │ │ ├── not-found.component.html │ │ │ │ │ ├── not-found.component.scss │ │ │ │ │ ├── not-found.component.spec.ts │ │ │ │ │ └── not-found.component.ts │ │ │ ├── guards │ │ │ │ ├── authentication.guard.spec.ts │ │ │ │ └── authentication.guard.ts │ │ │ ├── interceptors │ │ │ │ ├── authentication.interceptor.spec.ts │ │ │ │ └── authentication.interceptor.ts │ │ │ ├── models │ │ │ │ ├── film.ts │ │ │ │ ├── login-request.ts │ │ │ │ ├── registration-request.ts │ │ │ │ ├── user-response.ts │ │ │ │ └── user.ts │ │ │ ├── pipes │ │ │ │ ├── star-rating.pipe.spec.ts │ │ │ │ └── star-rating.pipe.ts │ │ │ └── services │ │ │ │ ├── authentication.service.ts │ │ │ │ ├── film.service.spec.ts │ │ │ │ └── film.service.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ ├── proxy.conf.json │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json └── 9-forms │ └── search-films │ ├── .editorconfig │ ├── .eslintrc.json │ ├── .gitignore │ ├── README.md │ ├── angular.json │ ├── package-lock.json │ ├── package.json │ ├── src │ ├── app │ │ ├── app-routing.module.ts │ │ ├── app.component.html │ │ ├── app.component.scss │ │ ├── app.component.spec.ts │ │ ├── app.component.ts │ │ ├── app.module.ts │ │ ├── components │ │ │ ├── film-search │ │ │ │ ├── film-search.component.html │ │ │ │ ├── film-search.component.scss │ │ │ │ ├── film-search.component.spec.ts │ │ │ │ └── film-search.component.ts │ │ │ ├── film │ │ │ │ ├── film.component.html │ │ │ │ ├── film.component.scss │ │ │ │ ├── film.component.spec.ts │ │ │ │ └── film.component.ts │ │ │ ├── login-form │ │ │ │ ├── login-form.component.html │ │ │ │ ├── login-form.component.scss │ │ │ │ ├── login-form.component.spec.ts │ │ │ │ └── login-form.component.ts │ │ │ └── not-found │ │ │ │ ├── not-found.component.html │ │ │ │ ├── not-found.component.scss │ │ │ │ ├── not-found.component.spec.ts │ │ │ │ └── not-found.component.ts │ │ ├── guards │ │ │ ├── authentication.guard.spec.ts │ │ │ └── authentication.guard.ts │ │ ├── interceptors │ │ │ ├── authentication.interceptor.spec.ts │ │ │ └── authentication.interceptor.ts │ │ ├── models │ │ │ ├── film.ts │ │ │ ├── login-request.ts │ │ │ ├── registration-request.ts │ │ │ ├── user-response.ts │ │ │ └── user.ts │ │ ├── pipes │ │ │ ├── star-rating.pipe.spec.ts │ │ │ └── star-rating.pipe.ts │ │ ├── services │ │ │ ├── authentication.service.ts │ │ │ ├── film.service.spec.ts │ │ │ └── film.service.ts │ │ └── utils │ │ │ └── password.validator.ts │ ├── assets │ │ └── .gitkeep │ ├── favicon.ico │ ├── index.html │ ├── main.ts │ ├── proxy.conf.json │ └── styles.scss │ ├── tsconfig.app.json │ ├── tsconfig.json │ └── tsconfig.spec.json ├── angular19-corrections ├── 1-first-steps │ └── search-films │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── eslint.config.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── public │ │ └── favicon.ico │ │ ├── src │ │ ├── app │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.ts │ │ │ ├── app.config.ts │ │ │ ├── app.routes.ts │ │ │ └── components │ │ │ │ └── login-form │ │ │ │ ├── login-form.component.html │ │ │ │ ├── login-form.component.scss │ │ │ │ └── login-form.component.ts │ │ ├── index.html │ │ ├── main.ts │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 2-html │ └── search-films │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── eslint.config.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── public │ │ └── favicon.ico │ │ ├── src │ │ ├── app │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.ts │ │ │ ├── app.config.ts │ │ │ ├── app.routes.ts │ │ │ ├── components │ │ │ │ └── login-form │ │ │ │ │ ├── login-form.component.html │ │ │ │ │ ├── login-form.component.scss │ │ │ │ │ └── login-form.component.ts │ │ │ └── models │ │ │ │ └── film.ts │ │ ├── index.html │ │ ├── main.ts │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 3-pipes │ └── search-films │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── eslint.config.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── public │ │ └── favicon.ico │ │ ├── src │ │ ├── app │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.ts │ │ │ ├── app.config.ts │ │ │ ├── app.routes.ts │ │ │ ├── components │ │ │ │ └── login-form │ │ │ │ │ ├── login-form.component.html │ │ │ │ │ ├── login-form.component.scss │ │ │ │ │ └── login-form.component.ts │ │ │ ├── models │ │ │ │ └── film.ts │ │ │ └── pipes │ │ │ │ └── star-rating.pipe.ts │ │ ├── index.html │ │ ├── main.ts │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 4-components │ └── search-films │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── eslint.config.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── public │ │ └── favicon.ico │ │ ├── src │ │ ├── app │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.ts │ │ │ ├── app.config.ts │ │ │ ├── app.routes.ts │ │ │ ├── components │ │ │ │ ├── film-search │ │ │ │ │ ├── film-search.component.html │ │ │ │ │ ├── film-search.component.scss │ │ │ │ │ └── film-search.component.ts │ │ │ │ ├── film │ │ │ │ │ ├── film.component.html │ │ │ │ │ ├── film.component.scss │ │ │ │ │ └── film.component.ts │ │ │ │ └── login-form │ │ │ │ │ ├── login-form.component.html │ │ │ │ │ ├── login-form.component.scss │ │ │ │ │ └── login-form.component.ts │ │ │ ├── models │ │ │ │ └── film.ts │ │ │ └── pipes │ │ │ │ └── star-rating.pipe.ts │ │ ├── index.html │ │ ├── main.ts │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 5-routing │ └── search-films │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── eslint.config.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── public │ │ └── favicon.ico │ │ ├── src │ │ ├── app │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.ts │ │ │ ├── app.config.ts │ │ │ ├── app.routes.ts │ │ │ ├── components │ │ │ │ ├── film-search │ │ │ │ │ ├── film-search.component.html │ │ │ │ │ ├── film-search.component.scss │ │ │ │ │ └── film-search.component.ts │ │ │ │ ├── film │ │ │ │ │ ├── film.component.html │ │ │ │ │ ├── film.component.scss │ │ │ │ │ └── film.component.ts │ │ │ │ ├── login-form │ │ │ │ │ ├── login-form.component.html │ │ │ │ │ ├── login-form.component.scss │ │ │ │ │ └── login-form.component.ts │ │ │ │ └── not-found │ │ │ │ │ ├── not-found.component.html │ │ │ │ │ ├── not-found.component.scss │ │ │ │ │ └── not-found.component.ts │ │ │ ├── models │ │ │ │ └── film.ts │ │ │ └── pipes │ │ │ │ └── star-rating.pipe.ts │ │ ├── index.html │ │ ├── main.ts │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 6-services │ └── search-films │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── eslint.config.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── public │ │ └── favicon.ico │ │ ├── src │ │ ├── app │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.ts │ │ │ ├── app.config.ts │ │ │ ├── app.routes.ts │ │ │ ├── components │ │ │ │ ├── film-search │ │ │ │ │ ├── film-search.component.html │ │ │ │ │ ├── film-search.component.scss │ │ │ │ │ └── film-search.component.ts │ │ │ │ ├── film │ │ │ │ │ ├── film.component.html │ │ │ │ │ ├── film.component.scss │ │ │ │ │ └── film.component.ts │ │ │ │ ├── login-form │ │ │ │ │ ├── login-form.component.html │ │ │ │ │ ├── login-form.component.scss │ │ │ │ │ └── login-form.component.ts │ │ │ │ └── not-found │ │ │ │ │ ├── not-found.component.html │ │ │ │ │ ├── not-found.component.scss │ │ │ │ │ └── not-found.component.ts │ │ │ ├── guards │ │ │ │ └── authentication.guard.ts │ │ │ ├── models │ │ │ │ └── film.ts │ │ │ ├── pipes │ │ │ │ └── star-rating.pipe.ts │ │ │ └── services │ │ │ │ └── authentication.service.ts │ │ ├── index.html │ │ ├── main.ts │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 7-http-calls │ └── search-films │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── eslint.config.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── public │ │ └── favicon.ico │ │ ├── src │ │ ├── app │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.ts │ │ │ ├── app.config.ts │ │ │ ├── app.routes.ts │ │ │ ├── components │ │ │ │ ├── film-search │ │ │ │ │ ├── film-search.component.html │ │ │ │ │ ├── film-search.component.scss │ │ │ │ │ └── film-search.component.ts │ │ │ │ ├── film │ │ │ │ │ ├── film.component.html │ │ │ │ │ ├── film.component.scss │ │ │ │ │ └── film.component.ts │ │ │ │ ├── login-form │ │ │ │ │ ├── login-form.component.html │ │ │ │ │ ├── login-form.component.scss │ │ │ │ │ └── login-form.component.ts │ │ │ │ └── not-found │ │ │ │ │ ├── not-found.component.html │ │ │ │ │ ├── not-found.component.scss │ │ │ │ │ └── not-found.component.ts │ │ │ ├── guards │ │ │ │ └── authentication.guard.ts │ │ │ ├── interceptors │ │ │ │ └── authentication.interceptor.ts │ │ │ ├── models │ │ │ │ ├── authentication │ │ │ │ │ ├── login-request.ts │ │ │ │ │ ├── registration-request.ts │ │ │ │ │ ├── user-response.ts │ │ │ │ │ └── user.ts │ │ │ │ └── film.ts │ │ │ ├── pipes │ │ │ │ └── star-rating.pipe.ts │ │ │ └── services │ │ │ │ ├── authentication.service.ts │ │ │ │ └── film.service.ts │ │ ├── index.html │ │ ├── main.ts │ │ ├── proxy.conf.json │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json ├── 8-rxjs │ └── search-films │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── eslint.config.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── public │ │ └── favicon.ico │ │ ├── src │ │ ├── app │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.ts │ │ │ ├── app.config.ts │ │ │ ├── app.routes.ts │ │ │ ├── components │ │ │ │ ├── film-search │ │ │ │ │ ├── film-search.component.html │ │ │ │ │ ├── film-search.component.scss │ │ │ │ │ └── film-search.component.ts │ │ │ │ ├── film │ │ │ │ │ ├── film.component.html │ │ │ │ │ ├── film.component.scss │ │ │ │ │ └── film.component.ts │ │ │ │ ├── login-form │ │ │ │ │ ├── login-form.component.html │ │ │ │ │ ├── login-form.component.scss │ │ │ │ │ └── login-form.component.ts │ │ │ │ └── not-found │ │ │ │ │ ├── not-found.component.html │ │ │ │ │ ├── not-found.component.scss │ │ │ │ │ └── not-found.component.ts │ │ │ ├── guards │ │ │ │ └── authentication.guard.ts │ │ │ ├── interceptors │ │ │ │ └── authentication.interceptor.ts │ │ │ ├── models │ │ │ │ ├── authentication │ │ │ │ │ ├── login-request.ts │ │ │ │ │ ├── registration-request.ts │ │ │ │ │ ├── user-response.ts │ │ │ │ │ └── user.ts │ │ │ │ └── film.ts │ │ │ ├── pipes │ │ │ │ └── star-rating.pipe.ts │ │ │ └── services │ │ │ │ ├── authentication.service.ts │ │ │ │ └── film.service.ts │ │ ├── index.html │ │ ├── main.ts │ │ ├── proxy.conf.json │ │ └── styles.scss │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ └── tsconfig.spec.json └── 9-forms │ └── search-films │ ├── .editorconfig │ ├── .gitignore │ ├── README.md │ ├── angular.json │ ├── eslint.config.js │ ├── package-lock.json │ ├── package.json │ ├── public │ └── favicon.ico │ ├── src │ ├── app │ │ ├── app.component.html │ │ ├── app.component.scss │ │ ├── app.component.ts │ │ ├── app.config.ts │ │ ├── app.routes.ts │ │ ├── components │ │ │ ├── film-search │ │ │ │ ├── film-search.component.html │ │ │ │ ├── film-search.component.scss │ │ │ │ └── film-search.component.ts │ │ │ ├── film │ │ │ │ ├── film.component.html │ │ │ │ ├── film.component.scss │ │ │ │ └── film.component.ts │ │ │ ├── login-form │ │ │ │ ├── login-form.component.html │ │ │ │ ├── login-form.component.scss │ │ │ │ └── login-form.component.ts │ │ │ └── not-found │ │ │ │ ├── not-found.component.html │ │ │ │ ├── not-found.component.scss │ │ │ │ └── not-found.component.ts │ │ ├── guards │ │ │ └── authentication.guard.ts │ │ ├── interceptors │ │ │ └── authentication.interceptor.ts │ │ ├── models │ │ │ ├── authentication │ │ │ │ ├── login-request.ts │ │ │ │ ├── registration-request.ts │ │ │ │ ├── user-response.ts │ │ │ │ └── user.ts │ │ │ └── film.ts │ │ ├── pipes │ │ │ └── star-rating.pipe.ts │ │ ├── services │ │ │ ├── authentication.service.ts │ │ │ └── film.service.ts │ │ └── utils │ │ │ └── password.validator.ts │ ├── index.html │ ├── main.ts │ ├── proxy.conf.json │ └── styles.scss │ ├── tsconfig.app.json │ ├── tsconfig.json │ └── tsconfig.spec.json └── docs ├── .npmignore ├── package-lock.json ├── package.json └── src ├── .vuepress ├── components │ └── VModelExample.vue ├── config.ts ├── public │ ├── eslint.txt │ ├── gradient-icon.gif │ ├── logo.png │ └── styles.scss └── styles │ └── index.scss ├── README.md ├── assets ├── MPA.svg ├── SPA.svg ├── child-parent.png ├── devtools-component-source.png ├── devtools-component-tree.png ├── folder-structure-multi-module.png ├── folder-structure.png ├── lifecycle.png ├── routing.png ├── tree.png ├── ts-vs-js.png ├── visual-1.png ├── visual-2b.png ├── visual-3.png ├── visual-4a.png ├── visual-4b.png ├── visual-4c.png ├── visual-5a.png ├── visual-5b.png ├── visual-5c.png ├── visual-5d.png ├── visual-6.png ├── visual-6a.png ├── visual-7a.png ├── visual-7b.png └── vscode-breakpoint.png ├── components └── README.md ├── ecosystem └── README.md ├── first-steps └── README.md ├── forms └── README.md ├── fr ├── README.md ├── components │ └── README.md ├── ecosystem │ └── README.md ├── first-steps │ └── README.md ├── forms │ └── README.md ├── html │ └── README.md ├── pipes │ └── README.md ├── presentation │ └── README.md ├── routing │ └── README.md ├── rxjs │ └── README.md ├── services │ └── README.md ├── to-go-further │ └── README.md ├── tooling │ └── README.md └── typescript │ └── README.md ├── html └── README.md ├── pipes └── README.md ├── presentation └── README.md ├── routing └── README.md ├── rxjs └── README.md ├── services └── README.md ├── to-go-further └── README.md ├── tooling └── README.md └── typescript └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # dependencies 2 | node_modules 3 | 4 | # logs 5 | npm-debug.log 6 | 7 | # Build 8 | dist 9 | .cache 10 | .temp 11 | 12 | # private 13 | TODO.md 14 | 15 | # vscode settings 16 | .vscode 17 | 18 | # jetbrains dide settings 19 | .idea -------------------------------------------------------------------------------- /angular12-corrections/0-bootstrap/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /angular12-corrections/0-bootstrap/search-films/e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class AppPage { 4 | async navigateTo(): Promise { 5 | return browser.get(browser.baseUrl); 6 | } 7 | 8 | async getTitleText(): Promise { 9 | return element(by.css('app-root .content span')).getText(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /angular12-corrections/0-bootstrap/search-films/e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../out-tsc/e2e", 6 | "module": "commonjs", 7 | "target": "es2018", 8 | "types": [ 9 | "jasmine", 10 | "node" 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /angular12-corrections/0-bootstrap/search-films/src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | 4 | const routes: Routes = []; 5 | 6 | @NgModule({ 7 | imports: [RouterModule.forRoot(routes)], 8 | exports: [RouterModule] 9 | }) 10 | export class AppRoutingModule { } 11 | -------------------------------------------------------------------------------- /angular12-corrections/0-bootstrap/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/0-bootstrap/search-films/src/app/app.component.scss -------------------------------------------------------------------------------- /angular12-corrections/0-bootstrap/search-films/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | styleUrls: ['./app.component.scss'] 7 | }) 8 | export class AppComponent { 9 | title = 'search-films'; 10 | } 11 | -------------------------------------------------------------------------------- /angular12-corrections/0-bootstrap/search-films/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/0-bootstrap/search-films/src/assets/.gitkeep -------------------------------------------------------------------------------- /angular12-corrections/0-bootstrap/search-films/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /angular12-corrections/0-bootstrap/search-films/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/0-bootstrap/search-films/src/favicon.ico -------------------------------------------------------------------------------- /angular12-corrections/0-bootstrap/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular12-corrections/0-bootstrap/search-films/src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /angular12-corrections/0-bootstrap/search-films/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts", 10 | "src/polyfills.ts" 11 | ], 12 | "include": [ 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /angular12-corrections/1-first-steps/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /angular12-corrections/1-first-steps/search-films/e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor' 2 | 3 | export class AppPage { 4 | async navigateTo(): Promise { 5 | return browser.get(browser.baseUrl) 6 | } 7 | 8 | async getTitleText(): Promise { 9 | return element(by.css('app-root .content span')).getText() 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /angular12-corrections/1-first-steps/search-films/e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../out-tsc/e2e", 6 | "module": "commonjs", 7 | "target": "es2018", 8 | "types": [ 9 | "jasmine", 10 | "node" 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /angular12-corrections/1-first-steps/search-films/src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { RouterModule, Routes } from '@angular/router' 3 | 4 | const routes: Routes = [] 5 | 6 | @NgModule({ 7 | imports: [RouterModule.forRoot(routes)], 8 | exports: [RouterModule] 9 | }) 10 | export class AppRoutingModule { } 11 | -------------------------------------------------------------------------------- /angular12-corrections/1-first-steps/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /angular12-corrections/1-first-steps/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/1-first-steps/search-films/src/app/app.component.scss -------------------------------------------------------------------------------- /angular12-corrections/1-first-steps/search-films/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | styleUrls: ['./app.component.scss'] 7 | }) 8 | export class AppComponent { 9 | } 10 | -------------------------------------------------------------------------------- /angular12-corrections/1-first-steps/search-films/src/app/login-form/login-form.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/1-first-steps/search-films/src/app/login-form/login-form.component.scss -------------------------------------------------------------------------------- /angular12-corrections/1-first-steps/search-films/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/1-first-steps/search-films/src/assets/.gitkeep -------------------------------------------------------------------------------- /angular12-corrections/1-first-steps/search-films/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /angular12-corrections/1-first-steps/search-films/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/1-first-steps/search-films/src/favicon.ico -------------------------------------------------------------------------------- /angular12-corrections/1-first-steps/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular12-corrections/1-first-steps/search-films/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts", 10 | "src/polyfills.ts" 11 | ], 12 | "include": [ 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /angular12-corrections/2-directives/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /angular12-corrections/2-directives/search-films/e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor' 2 | 3 | export class AppPage { 4 | async navigateTo(): Promise { 5 | return browser.get(browser.baseUrl) 6 | } 7 | 8 | async getTitleText(): Promise { 9 | return element(by.css('app-root .content span')).getText() 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /angular12-corrections/2-directives/search-films/e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../out-tsc/e2e", 6 | "module": "commonjs", 7 | "target": "es2018", 8 | "types": [ 9 | "jasmine", 10 | "node" 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /angular12-corrections/2-directives/search-films/src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { RouterModule, Routes } from '@angular/router' 3 | 4 | const routes: Routes = [] 5 | 6 | @NgModule({ 7 | imports: [RouterModule.forRoot(routes)], 8 | exports: [RouterModule] 9 | }) 10 | export class AppRoutingModule { } 11 | -------------------------------------------------------------------------------- /angular12-corrections/2-directives/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /angular12-corrections/2-directives/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/2-directives/search-films/src/app/app.component.scss -------------------------------------------------------------------------------- /angular12-corrections/2-directives/search-films/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | styleUrls: ['./app.component.scss'] 7 | }) 8 | export class AppComponent { 9 | } 10 | -------------------------------------------------------------------------------- /angular12-corrections/2-directives/search-films/src/app/login-form/login-form.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/2-directives/search-films/src/app/login-form/login-form.component.scss -------------------------------------------------------------------------------- /angular12-corrections/2-directives/search-films/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/2-directives/search-films/src/assets/.gitkeep -------------------------------------------------------------------------------- /angular12-corrections/2-directives/search-films/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /angular12-corrections/2-directives/search-films/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/2-directives/search-films/src/favicon.ico -------------------------------------------------------------------------------- /angular12-corrections/2-directives/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular12-corrections/2-directives/search-films/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts", 10 | "src/polyfills.ts" 11 | ], 12 | "include": [ 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /angular12-corrections/3-pipes/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /angular12-corrections/3-pipes/search-films/e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor' 2 | 3 | export class AppPage { 4 | async navigateTo(): Promise { 5 | return browser.get(browser.baseUrl) 6 | } 7 | 8 | async getTitleText(): Promise { 9 | return element(by.css('app-root .content span')).getText() 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /angular12-corrections/3-pipes/search-films/e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../out-tsc/e2e", 6 | "module": "commonjs", 7 | "target": "es2018", 8 | "types": [ 9 | "jasmine", 10 | "node" 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /angular12-corrections/3-pipes/search-films/src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { RouterModule, Routes } from '@angular/router' 3 | 4 | const routes: Routes = [] 5 | 6 | @NgModule({ 7 | imports: [RouterModule.forRoot(routes)], 8 | exports: [RouterModule] 9 | }) 10 | export class AppRoutingModule { } 11 | -------------------------------------------------------------------------------- /angular12-corrections/3-pipes/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /angular12-corrections/3-pipes/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/3-pipes/search-films/src/app/app.component.scss -------------------------------------------------------------------------------- /angular12-corrections/3-pipes/search-films/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | styleUrls: ['./app.component.scss'] 7 | }) 8 | export class AppComponent { 9 | } 10 | -------------------------------------------------------------------------------- /angular12-corrections/3-pipes/search-films/src/app/login-form/login-form.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/3-pipes/search-films/src/app/login-form/login-form.component.scss -------------------------------------------------------------------------------- /angular12-corrections/3-pipes/search-films/src/app/pipes/star-rating.pipe.spec.ts: -------------------------------------------------------------------------------- 1 | import { StarRatingPipe } from './star-rating.pipe'; 2 | 3 | describe('StarRatingPipe', () => { 4 | it('create an instance', () => { 5 | const pipe = new StarRatingPipe(); 6 | expect(pipe).toBeTruthy(); 7 | }); 8 | }); 9 | -------------------------------------------------------------------------------- /angular12-corrections/3-pipes/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: string): string { 9 | const starNumber = Math.ceil(Number(metascore) / 20) 10 | return '★'.repeat(starNumber) 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /angular12-corrections/3-pipes/search-films/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/3-pipes/search-films/src/assets/.gitkeep -------------------------------------------------------------------------------- /angular12-corrections/3-pipes/search-films/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /angular12-corrections/3-pipes/search-films/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/3-pipes/search-films/src/favicon.ico -------------------------------------------------------------------------------- /angular12-corrections/3-pipes/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular12-corrections/3-pipes/search-films/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts", 10 | "src/polyfills.ts" 11 | ], 12 | "include": [ 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /angular12-corrections/4-components/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /angular12-corrections/4-components/search-films/e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor' 2 | 3 | export class AppPage { 4 | async navigateTo(): Promise { 5 | return browser.get(browser.baseUrl) 6 | } 7 | 8 | async getTitleText(): Promise { 9 | return element(by.css('app-root .content span')).getText() 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /angular12-corrections/4-components/search-films/e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../out-tsc/e2e", 6 | "module": "commonjs", 7 | "target": "es2018", 8 | "types": [ 9 | "jasmine", 10 | "node" 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /angular12-corrections/4-components/search-films/src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { RouterModule, Routes } from '@angular/router' 3 | 4 | const routes: Routes = [] 5 | 6 | @NgModule({ 7 | imports: [RouterModule.forRoot(routes)], 8 | exports: [RouterModule] 9 | }) 10 | export class AppRoutingModule { } 11 | -------------------------------------------------------------------------------- /angular12-corrections/4-components/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /angular12-corrections/4-components/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/4-components/search-films/src/app/app.component.scss -------------------------------------------------------------------------------- /angular12-corrections/4-components/search-films/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | styleUrls: ['./app.component.scss'] 7 | }) 8 | export class AppComponent { 9 | isLoggedIn = false 10 | 11 | onLoggingIn(): void { 12 | this.isLoggedIn = true 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /angular12-corrections/4-components/search-films/src/app/components/film-search/film-search.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/4-components/search-films/src/app/components/film-search/film-search.component.scss -------------------------------------------------------------------------------- /angular12-corrections/4-components/search-films/src/app/components/film/film.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/4-components/search-films/src/app/components/film/film.component.scss -------------------------------------------------------------------------------- /angular12-corrections/4-components/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/4-components/search-films/src/app/components/login-form/login-form.component.scss -------------------------------------------------------------------------------- /angular12-corrections/4-components/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular12-corrections/4-components/search-films/src/app/pipes/star-rating.pipe.spec.ts: -------------------------------------------------------------------------------- 1 | import { StarRatingPipe } from './star-rating.pipe'; 2 | 3 | describe('StarRatingPipe', () => { 4 | it('create an instance', () => { 5 | const pipe = new StarRatingPipe(); 6 | expect(pipe).toBeTruthy(); 7 | }); 8 | }); 9 | -------------------------------------------------------------------------------- /angular12-corrections/4-components/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: string): string { 9 | const starNumber = Math.ceil(Number(metascore) / 20) 10 | return '★'.repeat(starNumber) 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /angular12-corrections/4-components/search-films/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/4-components/search-films/src/assets/.gitkeep -------------------------------------------------------------------------------- /angular12-corrections/4-components/search-films/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /angular12-corrections/4-components/search-films/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/4-components/search-films/src/favicon.ico -------------------------------------------------------------------------------- /angular12-corrections/4-components/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular12-corrections/4-components/search-films/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts", 10 | "src/polyfills.ts" 11 | ], 12 | "include": [ 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /angular12-corrections/5-routing/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /angular12-corrections/5-routing/search-films/e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor' 2 | 3 | export class AppPage { 4 | async navigateTo(): Promise { 5 | return browser.get(browser.baseUrl) 6 | } 7 | 8 | async getTitleText(): Promise { 9 | return element(by.css('app-root .content span')).getText() 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /angular12-corrections/5-routing/search-films/e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../out-tsc/e2e", 6 | "module": "commonjs", 7 | "target": "es2018", 8 | "types": [ 9 | "jasmine", 10 | "node" 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /angular12-corrections/5-routing/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /angular12-corrections/5-routing/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/5-routing/search-films/src/app/app.component.scss -------------------------------------------------------------------------------- /angular12-corrections/5-routing/search-films/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | styleUrls: ['./app.component.scss'] 7 | }) 8 | export class AppComponent { 9 | isLoggedIn = false 10 | 11 | onLoggingIn(): void { 12 | this.isLoggedIn = true 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /angular12-corrections/5-routing/search-films/src/app/components/film-search/film-search.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/5-routing/search-films/src/app/components/film-search/film-search.component.scss -------------------------------------------------------------------------------- /angular12-corrections/5-routing/search-films/src/app/components/film/film.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/5-routing/search-films/src/app/components/film/film.component.scss -------------------------------------------------------------------------------- /angular12-corrections/5-routing/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/5-routing/search-films/src/app/components/login-form/login-form.component.scss -------------------------------------------------------------------------------- /angular12-corrections/5-routing/search-films/src/app/components/not-found/not-found.component.html: -------------------------------------------------------------------------------- 1 |

404

2 |

Seems you are lost

3 |

Get back in known territory

4 | -------------------------------------------------------------------------------- /angular12-corrections/5-routing/search-films/src/app/components/not-found/not-found.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | text-align: center; 3 | } 4 | -------------------------------------------------------------------------------- /angular12-corrections/5-routing/search-films/src/app/components/not-found/not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-not-found', 5 | templateUrl: './not-found.component.html', 6 | styleUrls: ['./not-found.component.scss'] 7 | }) 8 | export class NotFoundComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /angular12-corrections/5-routing/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular12-corrections/5-routing/search-films/src/app/pipes/star-rating.pipe.spec.ts: -------------------------------------------------------------------------------- 1 | import { StarRatingPipe } from './star-rating.pipe'; 2 | 3 | describe('StarRatingPipe', () => { 4 | it('create an instance', () => { 5 | const pipe = new StarRatingPipe(); 6 | expect(pipe).toBeTruthy(); 7 | }); 8 | }); 9 | -------------------------------------------------------------------------------- /angular12-corrections/5-routing/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: string): string { 9 | const starNumber = Math.ceil(Number(metascore) / 20) 10 | return '★'.repeat(starNumber) 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /angular12-corrections/5-routing/search-films/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/5-routing/search-films/src/assets/.gitkeep -------------------------------------------------------------------------------- /angular12-corrections/5-routing/search-films/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /angular12-corrections/5-routing/search-films/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/5-routing/search-films/src/favicon.ico -------------------------------------------------------------------------------- /angular12-corrections/5-routing/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular12-corrections/5-routing/search-films/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts", 10 | "src/polyfills.ts" 11 | ], 12 | "include": [ 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /angular12-corrections/6-services/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /angular12-corrections/6-services/search-films/e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor' 2 | 3 | export class AppPage { 4 | async navigateTo(): Promise { 5 | return browser.get(browser.baseUrl) 6 | } 7 | 8 | async getTitleText(): Promise { 9 | return element(by.css('app-root .content span')).getText() 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /angular12-corrections/6-services/search-films/e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../out-tsc/e2e", 6 | "module": "commonjs", 7 | "target": "es2018", 8 | "types": [ 9 | "jasmine", 10 | "node" 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /angular12-corrections/6-services/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 | -------------------------------------------------------------------------------- /angular12-corrections/6-services/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | .logout-container { 2 | display: flex; 3 | justify-content: flex-end; 4 | 5 | button { 6 | margin: 0; 7 | font-size: 1em; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /angular12-corrections/6-services/search-films/src/app/components/film-search/film-search.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/6-services/search-films/src/app/components/film-search/film-search.component.scss -------------------------------------------------------------------------------- /angular12-corrections/6-services/search-films/src/app/components/film/film.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/6-services/search-films/src/app/components/film/film.component.scss -------------------------------------------------------------------------------- /angular12-corrections/6-services/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/6-services/search-films/src/app/components/login-form/login-form.component.scss -------------------------------------------------------------------------------- /angular12-corrections/6-services/search-films/src/app/components/not-found/not-found.component.html: -------------------------------------------------------------------------------- 1 |

404

2 |

Seems you are lost

3 |

Get back in known territory

4 | -------------------------------------------------------------------------------- /angular12-corrections/6-services/search-films/src/app/components/not-found/not-found.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | text-align: center; 3 | } 4 | -------------------------------------------------------------------------------- /angular12-corrections/6-services/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular12-corrections/6-services/search-films/src/app/pipes/star-rating.pipe.spec.ts: -------------------------------------------------------------------------------- 1 | import { StarRatingPipe } from './star-rating.pipe' 2 | 3 | describe('StarRatingPipe', () => { 4 | it('create an instance', () => { 5 | const pipe = new StarRatingPipe() 6 | expect(pipe).toBeTruthy() 7 | }) 8 | }) 9 | -------------------------------------------------------------------------------- /angular12-corrections/6-services/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: string): string { 9 | const starNumber = Math.ceil(Number(metascore) / 20) 10 | return '★'.repeat(starNumber) 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /angular12-corrections/6-services/search-films/src/app/services/authentication.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core' 2 | 3 | @Injectable({ 4 | providedIn: 'root' 5 | }) 6 | export class AuthenticationService { 7 | loggedIn = false 8 | constructor() { } 9 | 10 | login(): void { 11 | this.loggedIn = true 12 | } 13 | 14 | logout(): void { 15 | this.loggedIn = false 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /angular12-corrections/6-services/search-films/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/6-services/search-films/src/assets/.gitkeep -------------------------------------------------------------------------------- /angular12-corrections/6-services/search-films/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /angular12-corrections/6-services/search-films/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/6-services/search-films/src/favicon.ico -------------------------------------------------------------------------------- /angular12-corrections/6-services/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular12-corrections/6-services/search-films/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts", 10 | "src/polyfills.ts" 11 | ], 12 | "include": [ 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor' 2 | 3 | export class AppPage { 4 | async navigateTo(): Promise { 5 | return browser.get(browser.baseUrl) 6 | } 7 | 8 | async getTitleText(): Promise { 9 | return element(by.css('app-root .content span')).getText() 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../out-tsc/e2e", 6 | "module": "commonjs", 7 | "target": "es2018", 8 | "types": [ 9 | "jasmine", 10 | "node" 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 | -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | .logout-container { 2 | display: flex; 3 | justify-content: flex-end; 4 | 5 | button { 6 | margin: 0; 7 | font-size: 1em; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/src/app/components/film-search/film-search.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/7-http-calls/search-films/src/app/components/film-search/film-search.component.scss -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/src/app/components/film/film.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/7-http-calls/search-films/src/app/components/film/film.component.scss -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- 1 | .error { 2 | color: red; 3 | } 4 | -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/src/app/components/not-found/not-found.component.html: -------------------------------------------------------------------------------- 1 |

404

2 |

Seems you are lost

3 |

Get back in known territory

4 | -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/src/app/components/not-found/not-found.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | text-align: center; 3 | } 4 | -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/src/app/models/authentication/login-request.ts: -------------------------------------------------------------------------------- 1 | export class LoginRequest { 2 | constructor( 3 | public email: string, 4 | public password: string 5 | ) {} 6 | } 7 | -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/src/app/models/authentication/registration-request.ts: -------------------------------------------------------------------------------- 1 | export class RegistrationRequest { 2 | constructor( 3 | public email: string, 4 | public password: string, 5 | public firstname: string, 6 | public lastname: string 7 | ) {} 8 | } 9 | -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/src/app/pipes/star-rating.pipe.spec.ts: -------------------------------------------------------------------------------- 1 | import { StarRatingPipe } from './star-rating.pipe' 2 | 3 | describe('StarRatingPipe', () => { 4 | it('create an instance', () => { 5 | const pipe = new StarRatingPipe() 6 | expect(pipe).toBeTruthy() 7 | }) 8 | }) 9 | -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: string): string { 9 | const starNumber = Math.ceil(Number(metascore) / 20) 10 | return '★'.repeat(starNumber) 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/7-http-calls/search-films/src/assets/.gitkeep -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/7-http-calls/search-films/src/favicon.ico -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/src/proxy.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "/api/*": { 3 | "target": "https://vue-js-backend.herokuapp.com", 4 | "changeOrigin": true, 5 | "pathRewrite": { 6 | "^/api": "" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /angular12-corrections/7-http-calls/search-films/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts", 10 | "src/polyfills.ts" 11 | ], 12 | "include": [ 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor' 2 | 3 | export class AppPage { 4 | async navigateTo(): Promise { 5 | return browser.get(browser.baseUrl) 6 | } 7 | 8 | async getTitleText(): Promise { 9 | return element(by.css('app-root .content span')).getText() 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../out-tsc/e2e", 6 | "module": "commonjs", 7 | "target": "es2018", 8 | "types": [ 9 | "jasmine", 10 | "node" 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 | -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | .logout-container { 2 | display: flex; 3 | justify-content: flex-end; 4 | 5 | button { 6 | margin: 0; 7 | font-size: 1em; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/src/app/components/film-search/film-search.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/8-rxjs/search-films/src/app/components/film-search/film-search.component.scss -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/src/app/components/film/film.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/8-rxjs/search-films/src/app/components/film/film.component.scss -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- 1 | .error { 2 | color: red; 3 | } 4 | -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/src/app/components/not-found/not-found.component.html: -------------------------------------------------------------------------------- 1 |

404

2 |

Seems you are lost

3 |

Get back in known territory

4 | -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/src/app/components/not-found/not-found.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | text-align: center; 3 | } 4 | -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/src/app/components/not-found/not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-not-found', 5 | templateUrl: './not-found.component.html', 6 | styleUrls: ['./not-found.component.scss'] 7 | }) 8 | export class NotFoundComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/src/app/models/authentication/login-request.ts: -------------------------------------------------------------------------------- 1 | export class LoginRequest { 2 | constructor( 3 | public email: string, 4 | public password: string 5 | ) {} 6 | } 7 | -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/src/app/models/authentication/registration-request.ts: -------------------------------------------------------------------------------- 1 | export class RegistrationRequest { 2 | constructor( 3 | public email: string, 4 | public password: string, 5 | public firstname: string, 6 | public lastname: string 7 | ) {} 8 | } 9 | -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/src/app/pipes/star-rating.pipe.spec.ts: -------------------------------------------------------------------------------- 1 | import { StarRatingPipe } from './star-rating.pipe' 2 | 3 | describe('StarRatingPipe', () => { 4 | it('create an instance', () => { 5 | const pipe = new StarRatingPipe() 6 | expect(pipe).toBeTruthy() 7 | }) 8 | }) 9 | -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: string): string { 9 | const starNumber = Math.ceil(Number(metascore) / 20) 10 | return '★'.repeat(starNumber) 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/8-rxjs/search-films/src/assets/.gitkeep -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/8-rxjs/search-films/src/favicon.ico -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/src/proxy.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "/api/*": { 3 | "target": "https://vue-js-backend.herokuapp.com", 4 | "changeOrigin": true, 5 | "pathRewrite": { 6 | "^/api": "" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /angular12-corrections/8-rxjs/search-films/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts", 10 | "src/polyfills.ts" 11 | ], 12 | "include": [ 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor' 2 | 3 | export class AppPage { 4 | async navigateTo(): Promise { 5 | return browser.get(browser.baseUrl) 6 | } 7 | 8 | async getTitleText(): Promise { 9 | return element(by.css('app-root .content span')).getText() 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../out-tsc/e2e", 6 | "module": "commonjs", 7 | "target": "es2018", 8 | "types": [ 9 | "jasmine", 10 | "node" 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 | -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | .logout-container { 2 | display: flex; 3 | justify-content: flex-end; 4 | 5 | button { 6 | margin: 0; 7 | font-size: 1em; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/src/app/components/film-search/film-search.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/9-forms/search-films/src/app/components/film-search/film-search.component.scss -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/src/app/components/film/film.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/9-forms/search-films/src/app/components/film/film.component.scss -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- 1 | .error { 2 | color: red; 3 | } 4 | -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/src/app/components/not-found/not-found.component.html: -------------------------------------------------------------------------------- 1 |

404

2 |

Seems you are lost

3 |

Get back in known territory

4 | -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/src/app/components/not-found/not-found.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | text-align: center; 3 | } 4 | -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/src/app/components/not-found/not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-not-found', 5 | templateUrl: './not-found.component.html', 6 | styleUrls: ['./not-found.component.scss'] 7 | }) 8 | export class NotFoundComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/src/app/models/authentication/login-request.ts: -------------------------------------------------------------------------------- 1 | export class LoginRequest { 2 | constructor( 3 | public email: string, 4 | public password: string 5 | ) {} 6 | } 7 | -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/src/app/models/authentication/registration-request.ts: -------------------------------------------------------------------------------- 1 | export class RegistrationRequest { 2 | constructor( 3 | public email: string, 4 | public password: string, 5 | public firstname: string, 6 | public lastname: string 7 | ) {} 8 | } 9 | -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/src/app/pipes/star-rating.pipe.spec.ts: -------------------------------------------------------------------------------- 1 | import { StarRatingPipe } from './star-rating.pipe' 2 | 3 | describe('StarRatingPipe', () => { 4 | it('create an instance', () => { 5 | const pipe = new StarRatingPipe() 6 | expect(pipe).toBeTruthy() 7 | }) 8 | }) 9 | -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: string): string { 9 | const starNumber = Math.ceil(Number(metascore) / 20) 10 | return '★'.repeat(starNumber) 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/9-forms/search-films/src/assets/.gitkeep -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular12-corrections/9-forms/search-films/src/favicon.ico -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/src/proxy.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "/api/*": { 3 | "target": "https://vue-js-backend.herokuapp.com", 4 | "changeOrigin": true, 5 | "pathRewrite": { 6 | "^/api": "" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /angular12-corrections/9-forms/search-films/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts", 10 | "src/polyfills.ts" 11 | ], 12 | "include": [ 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /angular15-corrections/0-bootstrap/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /angular15-corrections/0-bootstrap/search-films/src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { RouterModule, Routes } from '@angular/router' 3 | 4 | const routes: Routes = [] 5 | 6 | @NgModule({ 7 | imports: [RouterModule.forRoot(routes)], 8 | exports: [RouterModule] 9 | }) 10 | export class AppRoutingModule { } 11 | -------------------------------------------------------------------------------- /angular15-corrections/0-bootstrap/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/0-bootstrap/search-films/src/app/app.component.scss -------------------------------------------------------------------------------- /angular15-corrections/0-bootstrap/search-films/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | styleUrls: ['./app.component.scss'] 7 | }) 8 | export class AppComponent { 9 | title = 'search-films' 10 | } 11 | -------------------------------------------------------------------------------- /angular15-corrections/0-bootstrap/search-films/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/0-bootstrap/search-films/src/assets/.gitkeep -------------------------------------------------------------------------------- /angular15-corrections/0-bootstrap/search-films/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/0-bootstrap/search-films/src/favicon.ico -------------------------------------------------------------------------------- /angular15-corrections/0-bootstrap/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular15-corrections/0-bootstrap/search-films/src/main.ts: -------------------------------------------------------------------------------- 1 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 2 | 3 | import { AppModule } from './app/app.module'; 4 | 5 | 6 | platformBrowserDynamic().bootstrapModule(AppModule) 7 | .catch(err => console.error(err)); 8 | -------------------------------------------------------------------------------- /angular15-corrections/0-bootstrap/search-films/src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /angular15-corrections/0-bootstrap/search-films/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts" 10 | ], 11 | "include": [ 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /angular15-corrections/0-bootstrap/search-films/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "include": [ 11 | "src/**/*.spec.ts", 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /angular15-corrections/1-first-steps/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /angular15-corrections/1-first-steps/search-films/src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { RouterModule, Routes } from '@angular/router' 3 | 4 | const routes: Routes = [] 5 | 6 | @NgModule({ 7 | imports: [RouterModule.forRoot(routes)], 8 | exports: [RouterModule] 9 | }) 10 | export class AppRoutingModule { } 11 | -------------------------------------------------------------------------------- /angular15-corrections/1-first-steps/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /angular15-corrections/1-first-steps/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/1-first-steps/search-films/src/app/app.component.scss -------------------------------------------------------------------------------- /angular15-corrections/1-first-steps/search-films/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | styleUrls: ['./app.component.scss'] 7 | }) 8 | export class AppComponent { 9 | title = 'search-films' 10 | } 11 | -------------------------------------------------------------------------------- /angular15-corrections/1-first-steps/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/1-first-steps/search-films/src/app/components/login-form/login-form.component.scss -------------------------------------------------------------------------------- /angular15-corrections/1-first-steps/search-films/src/app/components/login-form/login-form.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-login-form', 5 | templateUrl: './login-form.component.html', 6 | styleUrls: ['./login-form.component.scss'] 7 | }) 8 | export class LoginFormComponent { 9 | title = 'Authentication' 10 | } 11 | -------------------------------------------------------------------------------- /angular15-corrections/1-first-steps/search-films/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/1-first-steps/search-films/src/assets/.gitkeep -------------------------------------------------------------------------------- /angular15-corrections/1-first-steps/search-films/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/1-first-steps/search-films/src/favicon.ico -------------------------------------------------------------------------------- /angular15-corrections/1-first-steps/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular15-corrections/1-first-steps/search-films/src/main.ts: -------------------------------------------------------------------------------- 1 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic' 2 | 3 | import { AppModule } from './app/app.module' 4 | 5 | 6 | platformBrowserDynamic().bootstrapModule(AppModule) 7 | .catch(err => console.error(err)) 8 | -------------------------------------------------------------------------------- /angular15-corrections/1-first-steps/search-films/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts" 10 | ], 11 | "include": [ 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /angular15-corrections/1-first-steps/search-films/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "include": [ 11 | "src/**/*.spec.ts", 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /angular15-corrections/2-directives/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /angular15-corrections/2-directives/search-films/src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { RouterModule, Routes } from '@angular/router' 3 | 4 | const routes: Routes = [] 5 | 6 | @NgModule({ 7 | imports: [RouterModule.forRoot(routes)], 8 | exports: [RouterModule] 9 | }) 10 | export class AppRoutingModule { } 11 | -------------------------------------------------------------------------------- /angular15-corrections/2-directives/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /angular15-corrections/2-directives/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/2-directives/search-films/src/app/app.component.scss -------------------------------------------------------------------------------- /angular15-corrections/2-directives/search-films/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | styleUrls: ['./app.component.scss'] 7 | }) 8 | export class AppComponent { 9 | title = 'search-films' 10 | } 11 | -------------------------------------------------------------------------------- /angular15-corrections/2-directives/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/2-directives/search-films/src/app/components/login-form/login-form.component.scss -------------------------------------------------------------------------------- /angular15-corrections/2-directives/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular15-corrections/2-directives/search-films/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/2-directives/search-films/src/assets/.gitkeep -------------------------------------------------------------------------------- /angular15-corrections/2-directives/search-films/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/2-directives/search-films/src/favicon.ico -------------------------------------------------------------------------------- /angular15-corrections/2-directives/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular15-corrections/2-directives/search-films/src/main.ts: -------------------------------------------------------------------------------- 1 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic' 2 | 3 | import { AppModule } from './app/app.module' 4 | 5 | 6 | platformBrowserDynamic().bootstrapModule(AppModule) 7 | .catch(err => console.error(err)) 8 | -------------------------------------------------------------------------------- /angular15-corrections/2-directives/search-films/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts" 10 | ], 11 | "include": [ 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /angular15-corrections/2-directives/search-films/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "include": [ 11 | "src/**/*.spec.ts", 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /angular15-corrections/3-pipes/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /angular15-corrections/3-pipes/search-films/src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { RouterModule, Routes } from '@angular/router' 3 | 4 | const routes: Routes = [] 5 | 6 | @NgModule({ 7 | imports: [RouterModule.forRoot(routes)], 8 | exports: [RouterModule] 9 | }) 10 | export class AppRoutingModule { } 11 | -------------------------------------------------------------------------------- /angular15-corrections/3-pipes/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /angular15-corrections/3-pipes/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/3-pipes/search-films/src/app/app.component.scss -------------------------------------------------------------------------------- /angular15-corrections/3-pipes/search-films/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | styleUrls: ['./app.component.scss'] 7 | }) 8 | export class AppComponent { 9 | title = 'search-films' 10 | } 11 | -------------------------------------------------------------------------------- /angular15-corrections/3-pipes/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/3-pipes/search-films/src/app/components/login-form/login-form.component.scss -------------------------------------------------------------------------------- /angular15-corrections/3-pipes/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular15-corrections/3-pipes/search-films/src/app/pipes/star-rating.pipe.spec.ts: -------------------------------------------------------------------------------- 1 | import { StarRatingPipe } from './star-rating.pipe'; 2 | 3 | describe('StarRatingPipe', () => { 4 | it('create an instance', () => { 5 | const pipe = new StarRatingPipe(); 6 | expect(pipe).toBeTruthy(); 7 | }); 8 | }); 9 | -------------------------------------------------------------------------------- /angular15-corrections/3-pipes/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: string): string { 9 | return '★'.repeat(Math.ceil(+metascore / 20)) 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /angular15-corrections/3-pipes/search-films/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/3-pipes/search-films/src/assets/.gitkeep -------------------------------------------------------------------------------- /angular15-corrections/3-pipes/search-films/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/3-pipes/search-films/src/favicon.ico -------------------------------------------------------------------------------- /angular15-corrections/3-pipes/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular15-corrections/3-pipes/search-films/src/main.ts: -------------------------------------------------------------------------------- 1 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic' 2 | 3 | import { AppModule } from './app/app.module' 4 | 5 | 6 | platformBrowserDynamic().bootstrapModule(AppModule) 7 | .catch(err => console.error(err)) 8 | -------------------------------------------------------------------------------- /angular15-corrections/3-pipes/search-films/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts" 10 | ], 11 | "include": [ 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /angular15-corrections/3-pipes/search-films/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "include": [ 11 | "src/**/*.spec.ts", 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /angular15-corrections/4-components/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /angular15-corrections/4-components/search-films/src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { RouterModule, Routes } from '@angular/router' 3 | 4 | const routes: Routes = [] 5 | 6 | @NgModule({ 7 | imports: [RouterModule.forRoot(routes)], 8 | exports: [RouterModule] 9 | }) 10 | export class AppRoutingModule { } 11 | -------------------------------------------------------------------------------- /angular15-corrections/4-components/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /angular15-corrections/4-components/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/4-components/search-films/src/app/app.component.scss -------------------------------------------------------------------------------- /angular15-corrections/4-components/search-films/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | styleUrls: ['./app.component.scss'] 7 | }) 8 | export class AppComponent { 9 | title = 'search-films' 10 | isLoggedIn = false 11 | 12 | onLogin(): void { 13 | this.isLoggedIn = true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /angular15-corrections/4-components/search-films/src/app/components/film-search/film-search.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 |
    7 | 8 | 9 | 10 |
11 | -------------------------------------------------------------------------------- /angular15-corrections/4-components/search-films/src/app/components/film-search/film-search.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/4-components/search-films/src/app/components/film-search/film-search.component.scss -------------------------------------------------------------------------------- /angular15-corrections/4-components/search-films/src/app/components/film/film.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/4-components/search-films/src/app/components/film/film.component.scss -------------------------------------------------------------------------------- /angular15-corrections/4-components/search-films/src/app/components/film/film.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core' 2 | import { Film } from '@models/film' 3 | 4 | @Component({ 5 | selector: 'app-film', 6 | templateUrl: './film.component.html', 7 | styleUrls: ['./film.component.scss'] 8 | }) 9 | export class FilmComponent { 10 | @Input() film: Film | undefined 11 | } 12 | -------------------------------------------------------------------------------- /angular15-corrections/4-components/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/4-components/search-films/src/app/components/login-form/login-form.component.scss -------------------------------------------------------------------------------- /angular15-corrections/4-components/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular15-corrections/4-components/search-films/src/app/pipes/star-rating.pipe.spec.ts: -------------------------------------------------------------------------------- 1 | import { StarRatingPipe } from './star-rating.pipe'; 2 | 3 | describe('StarRatingPipe', () => { 4 | it('create an instance', () => { 5 | const pipe = new StarRatingPipe(); 6 | expect(pipe).toBeTruthy(); 7 | }); 8 | }); 9 | -------------------------------------------------------------------------------- /angular15-corrections/4-components/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: string): string { 9 | return '★'.repeat(Math.ceil(+metascore / 20)) 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /angular15-corrections/4-components/search-films/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/4-components/search-films/src/assets/.gitkeep -------------------------------------------------------------------------------- /angular15-corrections/4-components/search-films/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/4-components/search-films/src/favicon.ico -------------------------------------------------------------------------------- /angular15-corrections/4-components/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular15-corrections/4-components/search-films/src/main.ts: -------------------------------------------------------------------------------- 1 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic' 2 | 3 | import { AppModule } from './app/app.module' 4 | 5 | 6 | platformBrowserDynamic().bootstrapModule(AppModule) 7 | .catch(err => console.error(err)) 8 | -------------------------------------------------------------------------------- /angular15-corrections/4-components/search-films/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts" 10 | ], 11 | "include": [ 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /angular15-corrections/4-components/search-films/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "include": [ 11 | "src/**/*.spec.ts", 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/5-routing/search-films/src/app/app.component.scss -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | styleUrls: ['./app.component.scss'] 7 | }) 8 | export class AppComponent { 9 | title = 'search-films' 10 | isLoggedIn = false 11 | 12 | onLogin(): void { 13 | this.isLoggedIn = true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/src/app/components/film-search/film-search.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 |
    7 | 8 | 9 | 10 |
11 | -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/src/app/components/film-search/film-search.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/5-routing/search-films/src/app/components/film-search/film-search.component.scss -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/src/app/components/film/film.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/5-routing/search-films/src/app/components/film/film.component.scss -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/src/app/components/film/film.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core' 2 | import { Film } from '@models/film' 3 | 4 | @Component({ 5 | selector: 'app-film', 6 | templateUrl: './film.component.html', 7 | styleUrls: ['./film.component.scss'] 8 | }) 9 | export class FilmComponent { 10 | @Input() film: Film | undefined 11 | } 12 | -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/5-routing/search-films/src/app/components/login-form/login-form.component.scss -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/src/app/components/not-found/not-found.component.html: -------------------------------------------------------------------------------- 1 |

404

2 |

Seems you are lost

3 |

Get back in known territory

4 | -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/src/app/components/not-found/not-found.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/5-routing/search-films/src/app/components/not-found/not-found.component.scss -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/src/app/components/not-found/not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-not-found', 5 | templateUrl: './not-found.component.html', 6 | styleUrls: ['./not-found.component.scss'] 7 | }) 8 | export class NotFoundComponent { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/src/app/pipes/star-rating.pipe.spec.ts: -------------------------------------------------------------------------------- 1 | import { StarRatingPipe } from './star-rating.pipe'; 2 | 3 | describe('StarRatingPipe', () => { 4 | it('create an instance', () => { 5 | const pipe = new StarRatingPipe(); 6 | expect(pipe).toBeTruthy(); 7 | }); 8 | }); 9 | -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: string): string { 9 | return '★'.repeat(Math.ceil(+metascore / 20)) 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/5-routing/search-films/src/assets/.gitkeep -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/5-routing/search-films/src/favicon.ico -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/src/main.ts: -------------------------------------------------------------------------------- 1 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic' 2 | 3 | import { AppModule } from './app/app.module' 4 | 5 | 6 | platformBrowserDynamic().bootstrapModule(AppModule) 7 | .catch(err => console.error(err)) 8 | -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts" 10 | ], 11 | "include": [ 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /angular15-corrections/5-routing/search-films/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "include": [ 11 | "src/**/*.spec.ts", 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | .logout { 2 | align-self: end; 3 | } 4 | -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/src/app/components/film-search/film-search.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 |
    7 | 8 | 9 | 10 |
11 | -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/src/app/components/film-search/film-search.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/6-services/search-films/src/app/components/film-search/film-search.component.scss -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/src/app/components/film/film.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/6-services/search-films/src/app/components/film/film.component.scss -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/src/app/components/film/film.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core' 2 | import { Film } from '@models/film' 3 | 4 | @Component({ 5 | selector: 'app-film', 6 | templateUrl: './film.component.html', 7 | styleUrls: ['./film.component.scss'] 8 | }) 9 | export class FilmComponent { 10 | @Input() film: Film | undefined 11 | } 12 | -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/6-services/search-films/src/app/components/login-form/login-form.component.scss -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/src/app/components/not-found/not-found.component.html: -------------------------------------------------------------------------------- 1 |

404

2 |

Seems you are lost

3 |

Get back in known territory

4 | -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/src/app/components/not-found/not-found.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/6-services/search-films/src/app/components/not-found/not-found.component.scss -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/src/app/components/not-found/not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-not-found', 5 | templateUrl: './not-found.component.html', 6 | styleUrls: ['./not-found.component.scss'] 7 | }) 8 | export class NotFoundComponent { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/src/app/pipes/star-rating.pipe.spec.ts: -------------------------------------------------------------------------------- 1 | import { StarRatingPipe } from './star-rating.pipe'; 2 | 3 | describe('StarRatingPipe', () => { 4 | it('create an instance', () => { 5 | const pipe = new StarRatingPipe(); 6 | expect(pipe).toBeTruthy(); 7 | }); 8 | }); 9 | -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: string): string { 9 | return '★'.repeat(Math.ceil(+metascore / 20)) 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/src/app/services/authentication.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core' 2 | 3 | @Injectable({ 4 | providedIn: 'root' 5 | }) 6 | export class AuthenticationService { 7 | isLoggedIn = false 8 | 9 | onLogin(): void { 10 | this.isLoggedIn = true 11 | } 12 | 13 | onLogout(): void { 14 | this.isLoggedIn = false 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/6-services/search-films/src/assets/.gitkeep -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/6-services/search-films/src/favicon.ico -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/src/main.ts: -------------------------------------------------------------------------------- 1 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic' 2 | 3 | import { AppModule } from './app/app.module' 4 | 5 | 6 | platformBrowserDynamic().bootstrapModule(AppModule) 7 | .catch(err => console.error(err)) 8 | -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts" 10 | ], 11 | "include": [ 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /angular15-corrections/6-services/search-films/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "include": [ 11 | "src/**/*.spec.ts", 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | .logout { 2 | align-self: end; 3 | } 4 | -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/app/components/film-search/film-search.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 |
    7 | 8 | 9 | 10 |
11 | -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/app/components/film-search/film-search.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/7-http-calls/search-films/src/app/components/film-search/film-search.component.scss -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/app/components/film/film.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/7-http-calls/search-films/src/app/components/film/film.component.scss -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/app/components/film/film.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core' 2 | import { Film } from '@models/film' 3 | 4 | @Component({ 5 | selector: 'app-film', 6 | templateUrl: './film.component.html', 7 | styleUrls: ['./film.component.scss'] 8 | }) 9 | export class FilmComponent { 10 | @Input() film: Film | undefined 11 | } 12 | -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- 1 | .button-container { 2 | display: flex; 3 | justify-content: space-between; 4 | } 5 | 6 | .error { 7 | margin: 8px 0 0; 8 | } 9 | -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/app/components/not-found/not-found.component.html: -------------------------------------------------------------------------------- 1 |

404

2 |

Seems you are lost

3 |

Get back in known territory

4 | -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/app/components/not-found/not-found.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/7-http-calls/search-films/src/app/components/not-found/not-found.component.scss -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/app/components/not-found/not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-not-found', 5 | templateUrl: './not-found.component.html', 6 | styleUrls: ['./not-found.component.scss'] 7 | }) 8 | export class NotFoundComponent { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/app/models/login-request.ts: -------------------------------------------------------------------------------- 1 | export class LoginRequest { 2 | constructor( 3 | public email: string, 4 | public password: string 5 | ) {} 6 | } 7 | -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/app/models/registration-request.ts: -------------------------------------------------------------------------------- 1 | export class RegistrationRequest { 2 | constructor( 3 | public email: string, 4 | public password: string, 5 | public firstname: string, 6 | public lastname: string 7 | ) {} 8 | } 9 | -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/app/models/user-response.ts: -------------------------------------------------------------------------------- 1 | import { User } from './user' 2 | 3 | export class UserResponse { 4 | constructor( 5 | public user: User, 6 | public token: string 7 | ) {} 8 | } 9 | -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/app/models/user.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/naming-convention */ 2 | export class User { 3 | constructor( 4 | public id: number, 5 | public firstname: string, 6 | public lastname: string, 7 | public email: string, 8 | public created_at: string, 9 | public update_at: string 10 | ) {} 11 | } 12 | -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/app/pipes/star-rating.pipe.spec.ts: -------------------------------------------------------------------------------- 1 | import { StarRatingPipe } from './star-rating.pipe'; 2 | 3 | describe('StarRatingPipe', () => { 4 | it('create an instance', () => { 5 | const pipe = new StarRatingPipe(); 6 | expect(pipe).toBeTruthy(); 7 | }); 8 | }); 9 | -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: string): string { 9 | return '★'.repeat(Math.ceil(+metascore / 20)) 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/7-http-calls/search-films/src/assets/.gitkeep -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/7-http-calls/search-films/src/favicon.ico -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/main.ts: -------------------------------------------------------------------------------- 1 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic' 2 | 3 | import { AppModule } from './app/app.module' 4 | 5 | 6 | platformBrowserDynamic().bootstrapModule(AppModule) 7 | .catch(err => console.error(err)) 8 | -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/src/proxy.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "/api/*": { 3 | "target": "http://localhost:3030", 4 | "changeOrigin": true, 5 | "pathRewrite": { 6 | "^/api": "" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts" 10 | ], 11 | "include": [ 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /angular15-corrections/7-http-calls/search-films/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "include": [ 11 | "src/**/*.spec.ts", 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | .logout { 2 | align-self: end; 3 | } 4 | -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/app/components/film-search/film-search.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 |
    7 | 8 | 9 | 10 |
11 | -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/app/components/film-search/film-search.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/8-rxjs/search-films/src/app/components/film-search/film-search.component.scss -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/app/components/film/film.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/8-rxjs/search-films/src/app/components/film/film.component.scss -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/app/components/film/film.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core' 2 | import { Film } from '@models/film' 3 | 4 | @Component({ 5 | selector: 'app-film', 6 | templateUrl: './film.component.html', 7 | styleUrls: ['./film.component.scss'] 8 | }) 9 | export class FilmComponent { 10 | @Input() film: Film | undefined 11 | } 12 | -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- 1 | .button-container { 2 | display: flex; 3 | justify-content: space-between; 4 | } 5 | 6 | .error { 7 | margin: 8px 0 0; 8 | } 9 | -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/app/components/not-found/not-found.component.html: -------------------------------------------------------------------------------- 1 |

404

2 |

Seems you are lost

3 |

Get back in known territory

4 | -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/app/components/not-found/not-found.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/8-rxjs/search-films/src/app/components/not-found/not-found.component.scss -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/app/components/not-found/not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-not-found', 5 | templateUrl: './not-found.component.html', 6 | styleUrls: ['./not-found.component.scss'] 7 | }) 8 | export class NotFoundComponent { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/app/models/login-request.ts: -------------------------------------------------------------------------------- 1 | export class LoginRequest { 2 | constructor( 3 | public email: string, 4 | public password: string 5 | ) {} 6 | } 7 | -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/app/models/registration-request.ts: -------------------------------------------------------------------------------- 1 | export class RegistrationRequest { 2 | constructor( 3 | public email: string, 4 | public password: string, 5 | public firstname: string, 6 | public lastname: string 7 | ) {} 8 | } 9 | -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/app/models/user-response.ts: -------------------------------------------------------------------------------- 1 | import { User } from './user' 2 | 3 | export class UserResponse { 4 | constructor( 5 | public user: User, 6 | public token: string 7 | ) {} 8 | } 9 | -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/app/models/user.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/naming-convention */ 2 | export class User { 3 | constructor( 4 | public id: number, 5 | public firstname: string, 6 | public lastname: string, 7 | public email: string, 8 | public created_at: string, 9 | public update_at: string 10 | ) {} 11 | } 12 | -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/app/pipes/star-rating.pipe.spec.ts: -------------------------------------------------------------------------------- 1 | import { StarRatingPipe } from './star-rating.pipe'; 2 | 3 | describe('StarRatingPipe', () => { 4 | it('create an instance', () => { 5 | const pipe = new StarRatingPipe(); 6 | expect(pipe).toBeTruthy(); 7 | }); 8 | }); 9 | -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: string): string { 9 | return '★'.repeat(Math.ceil(+metascore / 20)) 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/8-rxjs/search-films/src/assets/.gitkeep -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/8-rxjs/search-films/src/favicon.ico -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/main.ts: -------------------------------------------------------------------------------- 1 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic' 2 | 3 | import { AppModule } from './app/app.module' 4 | 5 | 6 | platformBrowserDynamic().bootstrapModule(AppModule) 7 | .catch(err => console.error(err)) 8 | -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/src/proxy.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "/api/*": { 3 | "target": "http://localhost:3030", 4 | "changeOrigin": true, 5 | "pathRewrite": { 6 | "^/api": "" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts" 10 | ], 11 | "include": [ 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /angular15-corrections/8-rxjs/search-films/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "include": [ 11 | "src/**/*.spec.ts", 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | .logout { 2 | align-self: end; 3 | } 4 | -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/app/components/film-search/film-search.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 |
    7 | 8 | 9 | 10 |
11 | -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/app/components/film-search/film-search.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/9-forms/search-films/src/app/components/film-search/film-search.component.scss -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/app/components/film/film.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/9-forms/search-films/src/app/components/film/film.component.scss -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/app/components/film/film.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core' 2 | import { Film } from '@models/film' 3 | 4 | @Component({ 5 | selector: 'app-film', 6 | templateUrl: './film.component.html', 7 | styleUrls: ['./film.component.scss'] 8 | }) 9 | export class FilmComponent { 10 | @Input() film: Film | undefined 11 | } 12 | -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- 1 | .button-container { 2 | display: flex; 3 | justify-content: space-between; 4 | } 5 | 6 | .error { 7 | margin: 8px 0 0; 8 | } 9 | 10 | label.ng-invalid, input.ng-invalid.ng-dirty + small { 11 | color: red; 12 | } 13 | 14 | -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/app/components/not-found/not-found.component.html: -------------------------------------------------------------------------------- 1 |

404

2 |

Seems you are lost

3 |

Get back in known territory

4 | -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/app/components/not-found/not-found.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/9-forms/search-films/src/app/components/not-found/not-found.component.scss -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/app/components/not-found/not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-not-found', 5 | templateUrl: './not-found.component.html', 6 | styleUrls: ['./not-found.component.scss'] 7 | }) 8 | export class NotFoundComponent { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/app/models/login-request.ts: -------------------------------------------------------------------------------- 1 | export class LoginRequest { 2 | constructor( 3 | public email: string, 4 | public password: string 5 | ) {} 6 | } 7 | -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/app/models/registration-request.ts: -------------------------------------------------------------------------------- 1 | export class RegistrationRequest { 2 | constructor( 3 | public email: string, 4 | public password: string, 5 | public firstname: string, 6 | public lastname: string 7 | ) {} 8 | } 9 | -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/app/models/user-response.ts: -------------------------------------------------------------------------------- 1 | import { User } from './user' 2 | 3 | export class UserResponse { 4 | constructor( 5 | public user: User, 6 | public token: string 7 | ) {} 8 | } 9 | -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/app/models/user.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/naming-convention */ 2 | export class User { 3 | constructor( 4 | public id: number, 5 | public firstname: string, 6 | public lastname: string, 7 | public email: string, 8 | public created_at: string, 9 | public update_at: string 10 | ) {} 11 | } 12 | -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/app/pipes/star-rating.pipe.spec.ts: -------------------------------------------------------------------------------- 1 | import { StarRatingPipe } from './star-rating.pipe'; 2 | 3 | describe('StarRatingPipe', () => { 4 | it('create an instance', () => { 5 | const pipe = new StarRatingPipe(); 6 | expect(pipe).toBeTruthy(); 7 | }); 8 | }); 9 | -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: string): string { 9 | return '★'.repeat(Math.ceil(+metascore / 20)) 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/9-forms/search-films/src/assets/.gitkeep -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular15-corrections/9-forms/search-films/src/favicon.ico -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/main.ts: -------------------------------------------------------------------------------- 1 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic' 2 | 3 | import { AppModule } from './app/app.module' 4 | 5 | 6 | platformBrowserDynamic().bootstrapModule(AppModule) 7 | .catch(err => console.error(err)) 8 | -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/src/proxy.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "/api/*": { 3 | "target": "http://localhost:3030", 4 | "changeOrigin": true, 5 | "pathRewrite": { 6 | "^/api": "" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts" 10 | ], 11 | "include": [ 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /angular15-corrections/9-forms/search-films/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "include": [ 11 | "src/**/*.spec.ts", 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /angular19-corrections/1-first-steps/search-films/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/1-first-steps/search-films/public/favicon.ico -------------------------------------------------------------------------------- /angular19-corrections/1-first-steps/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /angular19-corrections/1-first-steps/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/1-first-steps/search-films/src/app/app.component.scss -------------------------------------------------------------------------------- /angular19-corrections/1-first-steps/search-films/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | import { LoginFormComponent } from './components/login-form/login-form.component' 3 | 4 | @Component({ 5 | selector: 'app-root', 6 | imports: [LoginFormComponent], 7 | templateUrl: './app.component.html', 8 | styleUrl: './app.component.scss' 9 | }) 10 | export class AppComponent { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /angular19-corrections/1-first-steps/search-films/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core' 2 | import { provideRouter } from '@angular/router' 3 | 4 | import { routes } from './app.routes' 5 | 6 | export const appConfig: ApplicationConfig = { 7 | providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes)] 8 | } 9 | -------------------------------------------------------------------------------- /angular19-corrections/1-first-steps/search-films/src/app/app.routes.ts: -------------------------------------------------------------------------------- 1 | import { Routes } from '@angular/router' 2 | 3 | export const routes: Routes = [] 4 | -------------------------------------------------------------------------------- /angular19-corrections/1-first-steps/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/1-first-steps/search-films/src/app/components/login-form/login-form.component.scss -------------------------------------------------------------------------------- /angular19-corrections/1-first-steps/search-films/src/app/components/login-form/login-form.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | 3 | @Component({ 4 | selector: 'app-login-form', 5 | imports: [], 6 | templateUrl: './login-form.component.html', 7 | styleUrl: './login-form.component.scss' 8 | }) 9 | export class LoginFormComponent { 10 | title = 'Authentication' 11 | } 12 | -------------------------------------------------------------------------------- /angular19-corrections/1-first-steps/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular19-corrections/1-first-steps/search-films/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser' 2 | import { appConfig } from './app/app.config' 3 | import { AppComponent } from './app/app.component' 4 | 5 | bootstrapApplication(AppComponent, appConfig) 6 | .catch(err => console.error(err)) 7 | -------------------------------------------------------------------------------- /angular19-corrections/2-html/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | ij_typescript_use_double_quotes = false 14 | 15 | [*.md] 16 | max_line_length = off 17 | trim_trailing_whitespace = false 18 | -------------------------------------------------------------------------------- /angular19-corrections/2-html/search-films/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/2-html/search-films/public/favicon.ico -------------------------------------------------------------------------------- /angular19-corrections/2-html/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /angular19-corrections/2-html/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/2-html/search-films/src/app/app.component.scss -------------------------------------------------------------------------------- /angular19-corrections/2-html/search-films/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | import { LoginFormComponent } from './components/login-form/login-form.component' 3 | 4 | @Component({ 5 | selector: 'app-root', 6 | imports: [LoginFormComponent], 7 | templateUrl: './app.component.html', 8 | styleUrl: './app.component.scss' 9 | }) 10 | export class AppComponent { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /angular19-corrections/2-html/search-films/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core' 2 | import { provideRouter } from '@angular/router' 3 | 4 | import { routes } from './app.routes' 5 | 6 | export const appConfig: ApplicationConfig = { 7 | providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes)] 8 | } 9 | -------------------------------------------------------------------------------- /angular19-corrections/2-html/search-films/src/app/app.routes.ts: -------------------------------------------------------------------------------- 1 | import { Routes } from '@angular/router' 2 | 3 | export const routes: Routes = [] 4 | -------------------------------------------------------------------------------- /angular19-corrections/2-html/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/2-html/search-films/src/app/components/login-form/login-form.component.scss -------------------------------------------------------------------------------- /angular19-corrections/2-html/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular19-corrections/2-html/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular19-corrections/2-html/search-films/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser' 2 | import { appConfig } from './app/app.config' 3 | import { AppComponent } from './app/app.component' 4 | 5 | bootstrapApplication(AppComponent, appConfig) 6 | .catch(err => console.error(err)) 7 | -------------------------------------------------------------------------------- /angular19-corrections/3-pipes/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | ij_typescript_use_double_quotes = false 14 | 15 | [*.md] 16 | max_line_length = off 17 | trim_trailing_whitespace = false 18 | -------------------------------------------------------------------------------- /angular19-corrections/3-pipes/search-films/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/3-pipes/search-films/public/favicon.ico -------------------------------------------------------------------------------- /angular19-corrections/3-pipes/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /angular19-corrections/3-pipes/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/3-pipes/search-films/src/app/app.component.scss -------------------------------------------------------------------------------- /angular19-corrections/3-pipes/search-films/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | import { LoginFormComponent } from './components/login-form/login-form.component' 3 | 4 | @Component({ 5 | selector: 'app-root', 6 | imports: [LoginFormComponent], 7 | templateUrl: './app.component.html', 8 | styleUrl: './app.component.scss' 9 | }) 10 | export class AppComponent { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /angular19-corrections/3-pipes/search-films/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core' 2 | import { provideRouter } from '@angular/router' 3 | 4 | import { routes } from './app.routes' 5 | 6 | export const appConfig: ApplicationConfig = { 7 | providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes)] 8 | } 9 | -------------------------------------------------------------------------------- /angular19-corrections/3-pipes/search-films/src/app/app.routes.ts: -------------------------------------------------------------------------------- 1 | import { Routes } from '@angular/router' 2 | 3 | export const routes: Routes = [] 4 | -------------------------------------------------------------------------------- /angular19-corrections/3-pipes/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/3-pipes/search-films/src/app/components/login-form/login-form.component.scss -------------------------------------------------------------------------------- /angular19-corrections/3-pipes/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular19-corrections/3-pipes/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: number): string { 9 | return '⭐'.repeat(Math.round(metascore / 20)) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /angular19-corrections/3-pipes/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular19-corrections/3-pipes/search-films/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser' 2 | import { appConfig } from './app/app.config' 3 | import { AppComponent } from './app/app.component' 4 | 5 | bootstrapApplication(AppComponent, appConfig) 6 | .catch(err => console.error(err)) 7 | -------------------------------------------------------------------------------- /angular19-corrections/4-components/search-films/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/4-components/search-films/public/favicon.ico -------------------------------------------------------------------------------- /angular19-corrections/4-components/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | @if (!loggedIn) { 2 | 3 | } @else { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /angular19-corrections/4-components/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/4-components/search-films/src/app/app.component.scss -------------------------------------------------------------------------------- /angular19-corrections/4-components/search-films/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core' 2 | import { provideRouter } from '@angular/router' 3 | 4 | import { routes } from './app.routes' 5 | 6 | export const appConfig: ApplicationConfig = { 7 | providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes)] 8 | } 9 | -------------------------------------------------------------------------------- /angular19-corrections/4-components/search-films/src/app/app.routes.ts: -------------------------------------------------------------------------------- 1 | import { Routes } from '@angular/router' 2 | 3 | export const routes: Routes = [] 4 | -------------------------------------------------------------------------------- /angular19-corrections/4-components/search-films/src/app/components/film-search/film-search.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 |
    7 | @for (film of films; track film.title) { 8 | 9 | } 10 |
11 | -------------------------------------------------------------------------------- /angular19-corrections/4-components/search-films/src/app/components/film-search/film-search.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/4-components/search-films/src/app/components/film-search/film-search.component.scss -------------------------------------------------------------------------------- /angular19-corrections/4-components/search-films/src/app/components/film/film.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/4-components/search-films/src/app/components/film/film.component.scss -------------------------------------------------------------------------------- /angular19-corrections/4-components/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/4-components/search-films/src/app/components/login-form/login-form.component.scss -------------------------------------------------------------------------------- /angular19-corrections/4-components/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular19-corrections/4-components/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: number): string { 9 | return '⭐'.repeat(Math.round(metascore / 20)) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /angular19-corrections/4-components/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular19-corrections/4-components/search-films/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser' 2 | import { appConfig } from './app/app.config' 3 | import { AppComponent } from './app/app.component' 4 | 5 | bootstrapApplication(AppComponent, appConfig) 6 | .catch(err => console.error(err)) 7 | -------------------------------------------------------------------------------- /angular19-corrections/5-routing/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | ij_typescript_use_double_quotes = false 14 | 15 | [*.md] 16 | max_line_length = off 17 | trim_trailing_whitespace = false 18 | -------------------------------------------------------------------------------- /angular19-corrections/5-routing/search-films/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/5-routing/search-films/public/favicon.ico -------------------------------------------------------------------------------- /angular19-corrections/5-routing/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /angular19-corrections/5-routing/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/5-routing/search-films/src/app/app.component.scss -------------------------------------------------------------------------------- /angular19-corrections/5-routing/search-films/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core' 2 | import { provideRouter } from '@angular/router' 3 | 4 | import { routes } from './app.routes' 5 | 6 | export const appConfig: ApplicationConfig = { 7 | providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes)] 8 | } 9 | -------------------------------------------------------------------------------- /angular19-corrections/5-routing/search-films/src/app/components/film-search/film-search.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 |
    7 | @for (film of films; track film.title) { 8 | 9 | } 10 |
11 | -------------------------------------------------------------------------------- /angular19-corrections/5-routing/search-films/src/app/components/film-search/film-search.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/5-routing/search-films/src/app/components/film-search/film-search.component.scss -------------------------------------------------------------------------------- /angular19-corrections/5-routing/search-films/src/app/components/film/film.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/5-routing/search-films/src/app/components/film/film.component.scss -------------------------------------------------------------------------------- /angular19-corrections/5-routing/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/5-routing/search-films/src/app/components/login-form/login-form.component.scss -------------------------------------------------------------------------------- /angular19-corrections/5-routing/search-films/src/app/components/not-found/not-found.component.html: -------------------------------------------------------------------------------- 1 |

404

2 |

Seems you are lost

3 |

Get back in known territory

4 | -------------------------------------------------------------------------------- /angular19-corrections/5-routing/search-films/src/app/components/not-found/not-found.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | text-align: center; 3 | } 4 | -------------------------------------------------------------------------------- /angular19-corrections/5-routing/search-films/src/app/components/not-found/not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | import { RouterLink } from '@angular/router' 3 | 4 | @Component({ 5 | selector: 'app-not-found', 6 | imports: [RouterLink], 7 | templateUrl: './not-found.component.html', 8 | styleUrl: './not-found.component.scss' 9 | }) 10 | export class NotFoundComponent { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /angular19-corrections/5-routing/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular19-corrections/5-routing/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: number): string { 9 | return '⭐'.repeat(Math.round(metascore / 20)) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /angular19-corrections/5-routing/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular19-corrections/5-routing/search-films/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser' 2 | import { appConfig } from './app/app.config' 3 | import { AppComponent } from './app/app.component' 4 | 5 | bootstrapApplication(AppComponent, appConfig) 6 | .catch(err => console.error(err)) 7 | -------------------------------------------------------------------------------- /angular19-corrections/6-services/search-films/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/6-services/search-films/public/favicon.ico -------------------------------------------------------------------------------- /angular19-corrections/6-services/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | @if (loggedIn) { 2 | 3 | } 4 | 5 | -------------------------------------------------------------------------------- /angular19-corrections/6-services/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | .logout { 2 | align-self: end; 3 | } 4 | -------------------------------------------------------------------------------- /angular19-corrections/6-services/search-films/src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core' 2 | import { provideRouter } from '@angular/router' 3 | 4 | import { routes } from './app.routes' 5 | 6 | export const appConfig: ApplicationConfig = { 7 | providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes)] 8 | } 9 | -------------------------------------------------------------------------------- /angular19-corrections/6-services/search-films/src/app/components/film-search/film-search.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 |
    7 | @for (film of films; track film.title) { 8 | 9 | } 10 |
11 | -------------------------------------------------------------------------------- /angular19-corrections/6-services/search-films/src/app/components/film-search/film-search.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/6-services/search-films/src/app/components/film-search/film-search.component.scss -------------------------------------------------------------------------------- /angular19-corrections/6-services/search-films/src/app/components/film/film.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/6-services/search-films/src/app/components/film/film.component.scss -------------------------------------------------------------------------------- /angular19-corrections/6-services/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/6-services/search-films/src/app/components/login-form/login-form.component.scss -------------------------------------------------------------------------------- /angular19-corrections/6-services/search-films/src/app/components/not-found/not-found.component.html: -------------------------------------------------------------------------------- 1 |

404

2 |

Seems you are lost

3 |

Get back in known territory

4 | -------------------------------------------------------------------------------- /angular19-corrections/6-services/search-films/src/app/components/not-found/not-found.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | text-align: center; 3 | } 4 | -------------------------------------------------------------------------------- /angular19-corrections/6-services/search-films/src/app/components/not-found/not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | import { RouterLink } from '@angular/router' 3 | 4 | @Component({ 5 | selector: 'app-not-found', 6 | imports: [RouterLink], 7 | templateUrl: './not-found.component.html', 8 | styleUrl: './not-found.component.scss' 9 | }) 10 | export class NotFoundComponent { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /angular19-corrections/6-services/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular19-corrections/6-services/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: number): string { 9 | return '⭐'.repeat(Math.round(metascore / 20)) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /angular19-corrections/6-services/search-films/src/app/services/authentication.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core' 2 | 3 | @Injectable({ 4 | providedIn: 'root' 5 | }) 6 | export class AuthenticationService { 7 | loggedIn = false 8 | 9 | login(): void { 10 | this.loggedIn = true 11 | } 12 | 13 | logout(): void { 14 | this.loggedIn = false 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /angular19-corrections/6-services/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular19-corrections/6-services/search-films/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser' 2 | import { appConfig } from './app/app.config' 3 | import { AppComponent } from './app/app.component' 4 | 5 | bootstrapApplication(AppComponent, appConfig) 6 | .catch(err => console.error(err)) 7 | -------------------------------------------------------------------------------- /angular19-corrections/7-http-calls/search-films/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/7-http-calls/search-films/public/favicon.ico -------------------------------------------------------------------------------- /angular19-corrections/7-http-calls/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | @if (loggedIn) { 2 | 3 | } 4 | 5 | -------------------------------------------------------------------------------- /angular19-corrections/7-http-calls/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | .logout { 2 | align-self: end; 3 | } 4 | -------------------------------------------------------------------------------- /angular19-corrections/7-http-calls/search-films/src/app/components/film-search/film-search.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 |
    7 | @for (film of films; track film.title) { 8 | 9 | } 10 |
11 | -------------------------------------------------------------------------------- /angular19-corrections/7-http-calls/search-films/src/app/components/film-search/film-search.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/7-http-calls/search-films/src/app/components/film-search/film-search.component.scss -------------------------------------------------------------------------------- /angular19-corrections/7-http-calls/search-films/src/app/components/film/film.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/7-http-calls/search-films/src/app/components/film/film.component.scss -------------------------------------------------------------------------------- /angular19-corrections/7-http-calls/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- 1 | .button-container { 2 | display: flex; 3 | justify-content: space-between; 4 | } 5 | -------------------------------------------------------------------------------- /angular19-corrections/7-http-calls/search-films/src/app/components/not-found/not-found.component.html: -------------------------------------------------------------------------------- 1 |

404

2 |

Seems you are lost

3 |

Get back in known territory

4 | -------------------------------------------------------------------------------- /angular19-corrections/7-http-calls/search-films/src/app/components/not-found/not-found.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | text-align: center; 3 | } 4 | -------------------------------------------------------------------------------- /angular19-corrections/7-http-calls/search-films/src/app/components/not-found/not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | import { RouterLink } from '@angular/router' 3 | 4 | @Component({ 5 | selector: 'app-not-found', 6 | imports: [RouterLink], 7 | templateUrl: './not-found.component.html', 8 | styleUrl: './not-found.component.scss' 9 | }) 10 | export class NotFoundComponent { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /angular19-corrections/7-http-calls/search-films/src/app/models/authentication/login-request.ts: -------------------------------------------------------------------------------- 1 | export class LoginRequest { 2 | constructor( 3 | public email: string, 4 | public password: string 5 | ) {} 6 | } 7 | -------------------------------------------------------------------------------- /angular19-corrections/7-http-calls/search-films/src/app/models/authentication/registration-request.ts: -------------------------------------------------------------------------------- 1 | export class RegistrationRequest { 2 | constructor( 3 | public email: string, 4 | public password: string, 5 | public firstname: string, 6 | public lastname: string 7 | ) {} 8 | } 9 | -------------------------------------------------------------------------------- /angular19-corrections/7-http-calls/search-films/src/app/models/authentication/user-response.ts: -------------------------------------------------------------------------------- 1 | import { User } from './user' 2 | 3 | export class UserResponse { 4 | constructor( 5 | public user: User, 6 | public token: string 7 | ) {} 8 | } 9 | -------------------------------------------------------------------------------- /angular19-corrections/7-http-calls/search-films/src/app/models/authentication/user.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/naming-convention */ 2 | export class User { 3 | constructor( 4 | public id: number, 5 | public firstname: string, 6 | public lastname: string, 7 | public email: string, 8 | public created_at: string, 9 | public update_at: string 10 | ) {} 11 | } 12 | -------------------------------------------------------------------------------- /angular19-corrections/7-http-calls/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular19-corrections/7-http-calls/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: number): string { 9 | return '⭐'.repeat(Math.round(metascore / 20)) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /angular19-corrections/7-http-calls/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular19-corrections/7-http-calls/search-films/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser' 2 | import { appConfig } from './app/app.config' 3 | import { AppComponent } from './app/app.component' 4 | 5 | bootstrapApplication(AppComponent, appConfig) 6 | .catch(err => console.error(err)) 7 | -------------------------------------------------------------------------------- /angular19-corrections/7-http-calls/search-films/src/proxy.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "/api/**": { 3 | "target": "http://localhost:3030", 4 | "changeOrigin": true, 5 | "pathRewrite": { 6 | "^/api": "" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /angular19-corrections/8-rxjs/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | ij_typescript_use_double_quotes = false 14 | 15 | [*.md] 16 | max_line_length = off 17 | trim_trailing_whitespace = false 18 | -------------------------------------------------------------------------------- /angular19-corrections/8-rxjs/search-films/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/8-rxjs/search-films/public/favicon.ico -------------------------------------------------------------------------------- /angular19-corrections/8-rxjs/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | @if (loggedIn) { 2 | 3 | } 4 | 5 | -------------------------------------------------------------------------------- /angular19-corrections/8-rxjs/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | .logout { 2 | align-self: end; 3 | } 4 | -------------------------------------------------------------------------------- /angular19-corrections/8-rxjs/search-films/src/app/components/film-search/film-search.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 |
    7 | @for (film of films | async; track film.title) { 8 | 9 | } 10 |
11 | -------------------------------------------------------------------------------- /angular19-corrections/8-rxjs/search-films/src/app/components/film-search/film-search.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/8-rxjs/search-films/src/app/components/film-search/film-search.component.scss -------------------------------------------------------------------------------- /angular19-corrections/8-rxjs/search-films/src/app/components/film/film.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/8-rxjs/search-films/src/app/components/film/film.component.scss -------------------------------------------------------------------------------- /angular19-corrections/8-rxjs/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- 1 | .button-container { 2 | display: flex; 3 | justify-content: space-between; 4 | } 5 | -------------------------------------------------------------------------------- /angular19-corrections/8-rxjs/search-films/src/app/components/not-found/not-found.component.html: -------------------------------------------------------------------------------- 1 |

404

2 |

Seems you are lost

3 |

Get back in known territory

4 | -------------------------------------------------------------------------------- /angular19-corrections/8-rxjs/search-films/src/app/components/not-found/not-found.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | text-align: center; 3 | } 4 | -------------------------------------------------------------------------------- /angular19-corrections/8-rxjs/search-films/src/app/components/not-found/not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | import { RouterLink } from '@angular/router' 3 | 4 | @Component({ 5 | selector: 'app-not-found', 6 | imports: [RouterLink], 7 | templateUrl: './not-found.component.html', 8 | styleUrl: './not-found.component.scss' 9 | }) 10 | export class NotFoundComponent { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /angular19-corrections/8-rxjs/search-films/src/app/models/authentication/login-request.ts: -------------------------------------------------------------------------------- 1 | export class LoginRequest { 2 | constructor( 3 | public email: string, 4 | public password: string 5 | ) {} 6 | } 7 | -------------------------------------------------------------------------------- /angular19-corrections/8-rxjs/search-films/src/app/models/authentication/registration-request.ts: -------------------------------------------------------------------------------- 1 | export class RegistrationRequest { 2 | constructor( 3 | public email: string, 4 | public password: string, 5 | public firstname: string, 6 | public lastname: string 7 | ) {} 8 | } 9 | -------------------------------------------------------------------------------- /angular19-corrections/8-rxjs/search-films/src/app/models/authentication/user-response.ts: -------------------------------------------------------------------------------- 1 | import { User } from './user' 2 | 3 | export class UserResponse { 4 | constructor( 5 | public user: User, 6 | public token: string 7 | ) {} 8 | } 9 | -------------------------------------------------------------------------------- /angular19-corrections/8-rxjs/search-films/src/app/models/authentication/user.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/naming-convention */ 2 | export class User { 3 | constructor( 4 | public id: number, 5 | public firstname: string, 6 | public lastname: string, 7 | public email: string, 8 | public created_at: string, 9 | public update_at: string 10 | ) {} 11 | } 12 | -------------------------------------------------------------------------------- /angular19-corrections/8-rxjs/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular19-corrections/8-rxjs/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: number): string { 9 | return '⭐'.repeat(Math.round(metascore / 20)) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /angular19-corrections/8-rxjs/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular19-corrections/8-rxjs/search-films/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser' 2 | import { appConfig } from './app/app.config' 3 | import { AppComponent } from './app/app.component' 4 | 5 | bootstrapApplication(AppComponent, appConfig) 6 | .catch(err => console.error(err)) 7 | -------------------------------------------------------------------------------- /angular19-corrections/8-rxjs/search-films/src/proxy.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "/api/**": { 3 | "target": "http://localhost:3030", 4 | "changeOrigin": true, 5 | "pathRewrite": { 6 | "^/api": "" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /angular19-corrections/9-forms/search-films/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | ij_typescript_use_double_quotes = false 14 | 15 | [*.md] 16 | max_line_length = off 17 | trim_trailing_whitespace = false 18 | -------------------------------------------------------------------------------- /angular19-corrections/9-forms/search-films/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/9-forms/search-films/public/favicon.ico -------------------------------------------------------------------------------- /angular19-corrections/9-forms/search-films/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | @if (loggedIn) { 2 | 3 | } 4 | 5 | -------------------------------------------------------------------------------- /angular19-corrections/9-forms/search-films/src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | .logout { 2 | align-self: end; 3 | } 4 | -------------------------------------------------------------------------------- /angular19-corrections/9-forms/search-films/src/app/components/film-search/film-search.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 |
    7 | @for (film of films | async; track film.title) { 8 | 9 | } 10 |
11 | -------------------------------------------------------------------------------- /angular19-corrections/9-forms/search-films/src/app/components/film-search/film-search.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/9-forms/search-films/src/app/components/film-search/film-search.component.scss -------------------------------------------------------------------------------- /angular19-corrections/9-forms/search-films/src/app/components/film/film.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/angular19-corrections/9-forms/search-films/src/app/components/film/film.component.scss -------------------------------------------------------------------------------- /angular19-corrections/9-forms/search-films/src/app/components/login-form/login-form.component.scss: -------------------------------------------------------------------------------- 1 | .button-container { 2 | display: flex; 3 | justify-content: space-between; 4 | } 5 | 6 | form.ng-dirty label:has(+ input.ng-invalid), form.ng-dirty input.ng-invalid + small { 7 | color: red; 8 | } 9 | -------------------------------------------------------------------------------- /angular19-corrections/9-forms/search-films/src/app/components/not-found/not-found.component.html: -------------------------------------------------------------------------------- 1 |

404

2 |

Seems you are lost

3 |

Get back in known territory

4 | -------------------------------------------------------------------------------- /angular19-corrections/9-forms/search-films/src/app/components/not-found/not-found.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | text-align: center; 3 | } 4 | -------------------------------------------------------------------------------- /angular19-corrections/9-forms/search-films/src/app/components/not-found/not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core' 2 | import { RouterLink } from '@angular/router' 3 | 4 | @Component({ 5 | selector: 'app-not-found', 6 | imports: [RouterLink], 7 | templateUrl: './not-found.component.html', 8 | styleUrl: './not-found.component.scss' 9 | }) 10 | export class NotFoundComponent { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /angular19-corrections/9-forms/search-films/src/app/models/authentication/login-request.ts: -------------------------------------------------------------------------------- 1 | export class LoginRequest { 2 | constructor( 3 | public email: string, 4 | public password: string 5 | ) {} 6 | } 7 | -------------------------------------------------------------------------------- /angular19-corrections/9-forms/search-films/src/app/models/authentication/registration-request.ts: -------------------------------------------------------------------------------- 1 | export class RegistrationRequest { 2 | constructor( 3 | public email: string, 4 | public password: string, 5 | public firstname: string, 6 | public lastname: string 7 | ) {} 8 | } 9 | -------------------------------------------------------------------------------- /angular19-corrections/9-forms/search-films/src/app/models/authentication/user-response.ts: -------------------------------------------------------------------------------- 1 | import { User } from './user' 2 | 3 | export class UserResponse { 4 | constructor( 5 | public user: User, 6 | public token: string 7 | ) {} 8 | } 9 | -------------------------------------------------------------------------------- /angular19-corrections/9-forms/search-films/src/app/models/authentication/user.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/naming-convention */ 2 | export class User { 3 | constructor( 4 | public id: number, 5 | public firstname: string, 6 | public lastname: string, 7 | public email: string, 8 | public created_at: string, 9 | public update_at: string 10 | ) {} 11 | } 12 | -------------------------------------------------------------------------------- /angular19-corrections/9-forms/search-films/src/app/models/film.ts: -------------------------------------------------------------------------------- 1 | export interface Film { 2 | title: string 3 | released: string 4 | director: string 5 | actors: string 6 | poster: string 7 | plot: string 8 | metascore: string 9 | } 10 | -------------------------------------------------------------------------------- /angular19-corrections/9-forms/search-films/src/app/pipes/star-rating.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core' 2 | 3 | @Pipe({ 4 | name: 'starRating' 5 | }) 6 | export class StarRatingPipe implements PipeTransform { 7 | 8 | transform(metascore: number): string { 9 | return '⭐'.repeat(Math.round(metascore / 20)) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /angular19-corrections/9-forms/search-films/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SearchFilms 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /angular19-corrections/9-forms/search-films/src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser' 2 | import { appConfig } from './app/app.config' 3 | import { AppComponent } from './app/app.component' 4 | 5 | bootstrapApplication(AppComponent, appConfig) 6 | .catch(err => console.error(err)) 7 | -------------------------------------------------------------------------------- /angular19-corrections/9-forms/search-films/src/proxy.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "/api/**": { 3 | "target": "http://localhost:3030", 4 | "changeOrigin": true, 5 | "pathRewrite": { 6 | "^/api": "" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /docs/.npmignore: -------------------------------------------------------------------------------- 1 | pids 2 | logs 3 | node_modules 4 | npm-debug.log 5 | coverage/ 6 | run 7 | dist 8 | .DS_Store 9 | .nyc_output 10 | .basement 11 | config.local.js 12 | basement_dist 13 | -------------------------------------------------------------------------------- /docs/src/.vuepress/components/VModelExample.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | -------------------------------------------------------------------------------- /docs/src/.vuepress/public/gradient-icon.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/.vuepress/public/gradient-icon.gif -------------------------------------------------------------------------------- /docs/src/.vuepress/public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/.vuepress/public/logo.png -------------------------------------------------------------------------------- /docs/src/assets/child-parent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/child-parent.png -------------------------------------------------------------------------------- /docs/src/assets/devtools-component-source.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/devtools-component-source.png -------------------------------------------------------------------------------- /docs/src/assets/devtools-component-tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/devtools-component-tree.png -------------------------------------------------------------------------------- /docs/src/assets/folder-structure-multi-module.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/folder-structure-multi-module.png -------------------------------------------------------------------------------- /docs/src/assets/folder-structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/folder-structure.png -------------------------------------------------------------------------------- /docs/src/assets/lifecycle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/lifecycle.png -------------------------------------------------------------------------------- /docs/src/assets/routing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/routing.png -------------------------------------------------------------------------------- /docs/src/assets/tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/tree.png -------------------------------------------------------------------------------- /docs/src/assets/ts-vs-js.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/ts-vs-js.png -------------------------------------------------------------------------------- /docs/src/assets/visual-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/visual-1.png -------------------------------------------------------------------------------- /docs/src/assets/visual-2b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/visual-2b.png -------------------------------------------------------------------------------- /docs/src/assets/visual-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/visual-3.png -------------------------------------------------------------------------------- /docs/src/assets/visual-4a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/visual-4a.png -------------------------------------------------------------------------------- /docs/src/assets/visual-4b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/visual-4b.png -------------------------------------------------------------------------------- /docs/src/assets/visual-4c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/visual-4c.png -------------------------------------------------------------------------------- /docs/src/assets/visual-5a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/visual-5a.png -------------------------------------------------------------------------------- /docs/src/assets/visual-5b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/visual-5b.png -------------------------------------------------------------------------------- /docs/src/assets/visual-5c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/visual-5c.png -------------------------------------------------------------------------------- /docs/src/assets/visual-5d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/visual-5d.png -------------------------------------------------------------------------------- /docs/src/assets/visual-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/visual-6.png -------------------------------------------------------------------------------- /docs/src/assets/visual-6a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/visual-6a.png -------------------------------------------------------------------------------- /docs/src/assets/visual-7a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/visual-7a.png -------------------------------------------------------------------------------- /docs/src/assets/visual-7b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/visual-7b.png -------------------------------------------------------------------------------- /docs/src/assets/vscode-breakpoint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worldline/angular-training/3046ec2e4ed004e501e917950ef5afe84aa1e66f/docs/src/assets/vscode-breakpoint.png --------------------------------------------------------------------------------