-
Notifications
You must be signed in to change notification settings - Fork 102
Migrate secondary side panels to Angular Signals #2420
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Migrate secondary side panels to Angular Signals #2420
Conversation
Summary of ChangesHello @rfontanarosa, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request significantly modernizes the implementation of the secondary side panels by adopting Angular Signals. The change aims to improve the reactivity, maintainability, and performance of these components by moving away from traditional RxJS subscriptions for state management. This refactoring simplifies the component logic and aligns with the latest Angular best practices for reactive programming. Highlights
🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## master #2420 +/- ##
==========================================
- Coverage 59.58% 59.53% -0.06%
==========================================
Files 111 111
Lines 2769 2768 -1
Branches 405 408 +3
==========================================
- Hits 1650 1648 -2
- Misses 1061 1063 +2
+ Partials 58 57 -1 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request migrates secondary side panels to use Angular Signals, which is a great step towards modernizing the application's state management. The changes are generally well-implemented, but there are a few critical issues and areas for improvement that I've identified. Specifically, there are potential null pointer exceptions in templates due to how signals are handled, a bug in a component method where a signal is not being accessed correctly, and some anti-patterns like side effects within signal definitions. I've provided detailed comments and suggestions for each of these points.
...onents/main-page-container/main-page/secondary-side-panel/loi-panel/loi-panel.component.html
Outdated
Show resolved
Hide resolved
| switchMap(([survey, lois, loiId]) => { | ||
| const loi = lois?.find(l => l.id === loiId); | ||
| if (survey && loi) { | ||
| console.log(loiId); | ||
| this.iconColor = survey.getJob(loi.jobId)?.color ?? ''; | ||
| this.loi = loi; | ||
| this.name = LocationOfInterestService.getDisplayName(loi); | ||
| this.icon = getLoiIcon(loi); | ||
| return concat( | ||
| of(undefined), | ||
| this.submissionService.getSubmissions$(survey, loi).pipe(delay(100)) | ||
| ); | ||
| } | ||
| return of(null).pipe(delay(100)); | ||
| }) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This switchMap has a couple of issues:
- It contains a
console.logwhich should be removed. - It has side effects by modifying component properties (
iconColor,loi,name,icon). This is an anti-pattern when working with signals, as it makes data flow implicit and harder to track.
A better approach would be to use computed signals to derive these properties from your inputs. This makes your component more declarative and aligned with the signal-based mindset.
...page-container/main-page/secondary-side-panel/submission-panel/submission-panel.component.ts
Show resolved
Hide resolved
| return this.submission() === undefined; | ||
| }); | ||
|
|
||
| submission = toSignal( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same question here.
| }) | ||
| ); | ||
| } | ||
| submissions = toSignal( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why do we need signals at all? Can't the loi and survey just be a component inputs? This seems much more complicated..
…lay-when-selecting-lois
…cting-lois' of https://github.com/google/ground-platform into rfontanarosa/1669/submission-list-brief-delay-when-selecting-lois
closes #1669
towards #2256
Registrazione.schermo.2026-01-30.alle.18.00.45.mov