Skip to content

Conversation

@pestler
Copy link
Owner

@pestler pestler commented Sep 17, 2025

  1. Task: link
  2. Screenshot:
image
  1. Deploy: link
  2. Done 29.09.2025 / deadline 29.09.2025
  3. Score: 675 / 600

✨ Project Overview

Frontend part of the "RS App Clone" application, developed with Angular, using modern practices and tools. This project aims to demonstrate a production-quality Angular application, incorporating key features such as user authentication, data management, and a responsive user interface.

🚀 Implemented Features & Scoring

This project implements a selection of features from the provided task catalog, aiming for a balanced score. Below is a self-assessment table detailing the implemented features, their points, and evidence.

Self-Assessment Table

Area Item Points Evidence
1. Signals & Reactivity
Single source of truth with signals for one major feature 20 src/app/core/services/notification.service.ts, src/app/shared/components/toast/toast.component.ts
3+ computed values that are used in templates or logic 15 Multiple files, e.g., src/app/pages/course/course-select/course-select.component.ts, src/app/pages/cross-check-review/cross-check-review.component.ts, src/app/pages/cross-check-submit/cross-check-submit.component.ts, src/app/pages/student-dashboard/student-dashboard.component.ts
2+ effect with clean-up that trigger a real side effect 15 src/app/pages/cross-check-review/cross-check-review.component.ts, src/app/shared/components/toast/toast.component.ts
Bridge RxJS ↔ Signals: convert 3+ Observables with toSignal 15 Multiple files, e.g., src/app/pages/course/course-select/course-select.component.ts, src/app/pages/course/course.component.ts, src/app/pages/cross-check-review/cross-check-review.component.ts, src/app/shared/components/toast/toast.component.ts
Signal inputs (input()) in 3+ components 15 src/app/shared/components/cards/dashboard-card/dashboard-card.component.ts, src/app/shared/components/cards/main-stats-card/main-stats-card.component.ts, src/app/shared/components/cards/mentor-card/mentor-card.component.ts
Signal queries (viewChild, contentChild) in 1+ component 15 src/app/pages/register/register.component.ts (using viewChild and effect to focus input)
Use untracked() or a custom equality in 1+ place 0 Not Implemented
Quality & Integration
No reactive loops / leaks 0 Cannot Verify Programmatically
Useful computed 0 Cannot Verify Programmatically
Clear boundaries 0 Cannot Verify Programmatically
Performance awareness: use track with @for or trackBy with ngFor 10 Multiple .html files using track with @for
Tested behavior 0 Cannot Verify Programmatically
Short rationale 10 main-task.md
2. Routing & Navigation
Functional routes with lazy loadComponent 25 src/app/app.routes.ts
Guards/resolvers with typed data 20 src/app/core/guards/auth-guard.ts, src/app/core/guards/public-guard.ts
withComponentInputBinding() to map params to inputs 10 src/app/app.config.ts
Data prefetch or custom preloading strategy 0 Not Implemented
Error route and 404 page, safe redirects 10 src/app/app.routes.ts
Deep linking: keep query params, restore scroll, good loading UX 0 Not Implemented
3. Testing
Unit tests for key components/services/pipes with edge cases 50 33 *.spec.ts files found
E2E tests for main flows (happy path + one error path) 0 Not Implemented (Cannot find programmatic evidence)
Mock HTTP, test interceptors and error states 0 Not Implemented
Use a component testing library/harness where it helps 0 Not Implemented
4. TypeScript & Typing
strict: true without ignored errors in prod code 20 tsconfig.json has "strict": true, and no @ts-ignore or : any found in src/**/*.ts
Good domain models with generics and type guards 10 Multiple model files (dashboard.models.ts, notification-message.models.ts, solution.model.ts, task-details.model.ts, task.model.ts, user.model.ts) for good domain models and generics. No explicit type guards found.
satisfies and utility types (Pick, Partial, Omit) where helpful 5 app/core/mocks/donators.mock.ts, app/core/services/user.ts, app/pages/profile/models/contacts.model.ts, app/shared/tests/pipes/percent-from-checks-pipe.spec.ts, dashboard.models.ts, notification-message.models.ts
5. Architecture & Components
Feature-sliced structure (core/shared/ui/features) 30 Project directory structure under src/app
Reusable components with clear inputs/outputs, content projection 20 Multiple components in src/app/shared/components use @Input() and @Output(), and app/shared/components/cards/dashboard-card/dashboard-card.component.html uses <ng-content>
Useful attribute or structural directives 20 Extensive use of @if, @for, @switch (new control flow) in .html templates
DI patterns: injection tokens for config, clean boundaries 10 src/app/token.ts, src/app/app.config.ts, src/app/core/services/auth.service.ts
Well-designed pure pipes with strong typing 10 src/app/shared/pipes/language-name-pipe.ts, src/app/shared/pipes/percent-from-checks-pipe.ts
6. HTTP & Data
Typed HttpClient layer, interceptors for auth/headers 10 app.config.ts for provideHttpClient. No custom HttpInterceptor found.
Consistent error handling with user-friendly messages and safe retry policy 10 src/app/app.config.ts (GlobalErrorHandler), src/app/core/services/notification.service.ts (showError). No retry policy found.
Cancel in-flight requests on navigation, avoid races 10 Extensive use of switchMap in various services and components
Local cache with invalidation 0 Not Implemented
7. Forms (Reactive Forms)
Complex form with custom validators (sync + async), clear error UX 40 src/app/pages/cross-check-submit/cross-check-submit.component.ts (urlValidator), src/app/pages/cross-check-submit/cross-check-submit.component.html (error display)
Dynamic fields with FormArray 15 src/app/pages/cross-check-review/cross-check-review.component.ts (criteriaFormArray)
Save draft and restore form state 15 src/app/pages/register/register.component.ts (logic in ngOnInit, onSubmit, autoSaveDraft, restoreDraft)
Keyboard access, labels, aria-describedby for errors 5 Extensive use of mat-label. No aria-describedby or cdkFocusInitial found.
8. UI, Styling & Theming
Design tokens with CSS custom properties, theme switch (dark/light) saved to storage 10 src/styles.scss for CSS custom properties. No theme switch saved to storage found.
Responsive layout (BreakpointObserver or modern CSS) 15 Extensive use of @media queries in .scss files.
Angular animations that improve UX 10 src/app/shared/components/cards/dashboard-card/dashboard-card.component.ts
Good empty/loading/error states, skeletons 20 Multiple .html files for loading/error states, app-empty-state component for empty states, 404 page.
9. Content & Templates
Content projection with selectors, meaningful slots 20 app/shared/components/cards/dashboard-card/dashboard-card.component.html, app/shared/components/cards/interview-card/interview-card-base/interview-card-base.component.html
ngTemplateOutlet, ng-container, new control flow to simplify DOM 20 app/shared/components/cards/next-event-card/next-event-card.component.html (ng-container), app/shared/components/footer/donators/donators.component.html (ngTemplateOutlet), and previous confirmation of new control flow.
10. Performance
Code-splitting and lazy loading for heavy parts 20 src/app/app.routes.ts (extensive use of loadComponent)
Image lazy loading and virtual scroll for large lists 10 Implemented loading="lazy" on img tags in various components
Performance budget in README + measured Lighthouse gains 10 angular.json for performance budgets. No mention of Lighthouse gains in README.md.
11. Backend & Data Persistence
Your own backend (NestJS/Express) or Firebase (Firestore/Auth/Storage) with docs 40 package.json (Firebase dependencies), app.config.ts (Firebase initialization)
Auth with JWT/OAuth2, protected routes 20 src/app/core/services/auth.service.ts (Firebase Auth logic), src/app/app.routes.ts (route guards)
Realtime features (WebSocket or Firestore realtime) 20 Implemented with Firestore in src/app/core/services/notifications-data.service.ts
12. Accessibility (a11y)
Keyboard navigation and focus management across main screens 0 Not Implemented
Proper semantics and ARIA for forms, dialogs, menus 10 Added aria-labels to icon buttons and other interactive elements.
13. DevOps, CI & Docs
CI pipeline: lint + unit tests + build + preview 20 .github/workflows/ci.yml
Clear README with run steps, env variables, architecture diagram 20 README.md has run steps and documents environment variables.
Release notes/changelog and issue templates 5 .github/ISSUE_TEMPLATE directory contains issue templates. CHANGELOG.md has been added.
New: CHANGELOG.md added 5 CHANGELOG.md file has been added and updated.
Error monitoring (for example, Sentry) or remote logging 0 Not Implemented
14. Internationalization
Two languages using Angular i18n or ngx-translate 0 Not Implemented

Total Claimed Points: 675 (Max 600)

🛠️ Technical Choices & Architecture

Signals vs RxJS Rationale:

We chose signals for component state management (watchlist, UI state) due to their simplicity and better integration with Angular's change detection. RxJS remains for HTTP streams and complex async operations where its operators provide more flexibility. This creates clear boundaries: signals for reactive UI state, RxJS for data streams.

Core Focus Areas:

  • Signals: Utilized for managing UI state and reactive data flows, enhancing performance and developer experience.
  • New Router: Implemented with lazy loading, guards, and resolvers for efficient and secure navigation.
  • Strict TypeScript: Enforced throughout the codebase to ensure type safety and reduce runtime errors.
  • Testing: Comprehensive unit and E2E tests are in place to ensure reliability and maintainability.

⚙️ Setup & Run Instructions

Installation

  1. Install dependencies
pnpm i
  1. Start the development server
pnpm run start
  1. Run tests
pnpm run testpnpm run test:e2e
  1. Build for production
pnpm run build

Mandatory Baseline Checklist:

  • Angular 19+ with Standalone Components and the new control flow (@if, @for, @switch).
  • Signals used in at least one important feature.
  • Angular Router with lazy loading and at least one guard or resolver.
  • TypeScript strict is on. ESLint is configured.
  • Tests exist: unit tests for core logic and at least one E2E for a main user flow. (Unit tests confirmed, E2E not confirmed)
  • Basic accessibility: keyboard navigation, focus visible, form labels. (Partially confirmed, requires manual testing)
  • CI runs lint, unit tests, and build on every PR.
  • Prefer OnPush for heavy screens when it helps.
  • Use inject() where it makes code simpler.

pestler and others added 30 commits September 4, 2025 17:53
сreate dependabot
Bumps [jasmine-core](https://github.com/jasmine/jasmine) from 5.7.1 to 5.10.0.
- [Release notes](https://github.com/jasmine/jasmine/releases)
- [Changelog](https://github.com/jasmine/jasmine/blob/main/RELEASE.md)
- [Commits](jasmine/jasmine@v5.7.1...v5.10.0)

---
updated-dependencies:
- dependency-name: jasmine-core
  dependency-version: 5.10.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) from 8.40.0 to 8.42.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.42.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.42.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.8.3 to 5.9.2.
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release-publish.yml)
- [Commits](microsoft/TypeScript@v5.8.3...v5.9.2)

---
updated-dependencies:
- dependency-name: typescript
  dependency-version: 5.9.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* feat(github-config): Add GitHub configuration files and templates

* chore(github-config): Apply formatting changes

* chore(ci): Refactor pre-commit hook with lint-staged and re-write workflow files

* fix(deps): Resolve pnpm-lock.yaml conflict and finalize lint-staged setup

* feat(ci): Add test:ci script and update CI workflow
Bumps the github-actions group with 3 updates: [actions/checkout](https://github.com/actions/checkout), [actions/setup-node](https://github.com/actions/setup-node) and [pnpm/action-setup](https://github.com/pnpm/action-setup).


Updates `actions/checkout` from 4 to 5
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v4...v5)

Updates `actions/setup-node` from 4 to 5
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](actions/setup-node@v4...v5)

Updates `pnpm/action-setup` from 3 to 4
- [Release notes](https://github.com/pnpm/action-setup/releases)
- [Commits](pnpm/action-setup@v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/setup-node
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: pnpm/action-setup
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps the dev-dependencies group with 4 updates: [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js), [eslint](https://github.com/eslint/eslint), [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@eslint/js` from 9.34.0 to 9.35.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/commits/v9.35.0/packages/js)

Updates `eslint` from 9.34.0 to 9.35.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](eslint/eslint@v9.34.0...v9.35.0)

Updates `eslint-plugin-jsdoc` from 54.3.1 to 55.0.0
- [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases)
- [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc)
- [Commits](gajus/eslint-plugin-jsdoc@v54.3.1...v55.0.0)

Updates `typescript-eslint` from 8.42.0 to 8.43.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.43.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@eslint/js"
  dependency-version: 9.35.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-dependencies
- dependency-name: eslint
  dependency-version: 9.35.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-dependencies
- dependency-name: eslint-plugin-jsdoc
  dependency-version: 55.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: dev-dependencies
- dependency-name: typescript-eslint
  dependency-version: 8.43.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* feat: change setting

* fix: fix ci

* feat: add mprmc

* feat: formatting

* fix: change ci
* feat(login): create login page UI

* feat: add font-size
* feat: create layout component

* fix: test

* chore: configure schematics defaults

* feat: del component

---------

Co-authored-by: Aleh Kuis <pestleralex@gmail.com>
* feat: create layout component

* fix: test

* chore: configure schematics defaults

* feat: create draft footer (closes #23)

* feat: create header component

* fix: test

* feat: add icons

---------

Co-authored-by: Aleh Kuis <pestleralex@gmail.com>
* feat: create auth guard

* fix: test
* feat: add 404

* feat: add 404 page
* refactor: create main nav component

* fix: test

* feat: create course select component

* feat: create student stats card component

* feat: create mentor card component

* refactor: use routerLink with queryParams for getUrl

* feat: show footer only on dashboard page
* feat: create interview card for no-interview and not-completed statuses

* feat: add bottom shadow for main nav when not on dashboard

* feat: add active route styling for navigation links
pestler added 30 commits October 2, 2025 11:30
Remove environment.firebase.ts from git tracking to prevent leaking sensitive API keys. The file is now listed in .gitignore.

Local configuration should be managed via environment.ts and environment.prod.ts files, which are not tracked by git. The README has been updated with instructions for new developers on how to obtain the necessary keys.
- Installs Playwright and its dependencies (@types/node, eslint-plugin-playwright).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants