Skip to content

Conversation

@krusche
Copy link
Member

@krusche krusche commented Dec 12, 2025

This PR migrates all custom Angular animations (@angular/animations) to native CSS animations (@keyframes, transition). This follows Angular's recommended migration path as the legacy animation system is deprecated.

Checklist

General

Client

  • Important: I implemented the changes with a very good performance, prevented too many (unnecessary) REST calls and made sure the UI is responsive, even with large data (e.g. using paging).
  • I strictly followed the client coding guidelines.
  • I strictly followed the AET UI-UX guidelines.
  • Following the theming guidelines, I specified colors only in the theming variable files and checked that the changes look consistent in both the light and the dark theme.
  • I added multiple integration tests (Jest) related to the features (with a high test coverage), while following the test guidelines.

Motivation and Context

Angular's legacy animation system (@angular/animations with trigger(), state(), transition(), animate()) is deprecated as of Angular 20.2. The Angular team recommends migrating to native CSS animations. See: https://angular.dev/guide/animations/migration

This PR migrates all custom Angular animations in the Artemis codebase to native CSS animations using @keyframes and CSS transition properties, following Angular's recommended migration path.

Description

Components migrated to CSS animations (7 total):

  • exercise-chatbot-button.component: Message bubble expand/collapse animation using CSS transitions
  • iris-base-chatbot.component: Message and suggestion enter animations using CSS @keyframes
  • answer-post.component: Fade-in animation for answer posts using CSS @keyframes
  • post.component: Removed unused animation import
  • course-notification-popup-overlay.component: Scale-in animation for popup notifications using CSS @keyframes
  • course-notification-overview.component: Fade animations for notification list using CSS @keyframes
  • alert-overlay.component: Slide-in animation for alert toasts using CSS @keyframes with cubic-bezier timing

Configuration changes:

  • Removed BrowserAnimationsModule from app.config.ts

Test infrastructure:

  • Created centralized provideNoopAnimationsForTests() helper in src/test/javascript/spec/helpers/animations.ts
  • This consolidates the deprecated provideNoopAnimations() calls needed for third-party libraries (PrimeNG, ngx-charts, ngx-graph) into a single file
  • Updated all affected test files to use the centralized helper

Steps for Testing

Prerequisites:

  • 1 Instructor
  • 1 Student
  • 1 Course with Iris enabled
  • 1 Programming exercise with Iris enabled

1. Iris Chatbot Button Animation

  1. Log in as Student
  2. Navigate to a programming exercise that has Iris enabled
  3. Look for the Iris chatbot button in the bottom-right corner
  4. Trigger a new Iris message (e.g., by submitting code or waiting for Iris to send a hint)
  5. Verify the message bubble smoothly scales up from the button with a smooth animation
  6. Dismiss the message
  7. Verify the bubble smoothly scales down and disappears

2. Iris Chatbot Messages Animation

  1. Click on the Iris chatbot button to open the dialog
  2. Send a message to Iris
  3. Verify new messages animate in with a smooth scale effect
  4. Verify suggestion buttons animate in with a fade effect after a short delay
  5. Send multiple messages and verify animations remain smooth

3. Answer Post Animation

  1. Navigate to a course with an active communication section
  2. Open a message that has existing answers
  3. Verify answer messages are displayed (they fade in on initial load)
  4. Add a new answer to the message
  5. Verify the new answer appears with a smooth fade-in animation
  6. Collapse and expand the answers section
  7. Verify animations appear smooth without flickering

4. Course Notification Popup Animation

  1. Log in as Instructor in one browser
  2. Log in as Student in another browser (or incognito window)
  3. As Instructor, create a new announcement or post in a channel the Student is subscribed to
  4. As Student, observe the notification popup appearing in the corner
  5. Verify the notification popup scales in smoothly from small to full size
  6. Verify the popup is interactive (can click on it)

5. Course Notification Overview Animation

  1. Click on the notifications bell icon to open the notification sidebar/overview
  2. Verify notifications fade in smoothly when the panel opens
  3. Verify the notification list wrapper animates in correctly
  4. Mark some notifications as read
  5. Trigger new notifications and verify they appear with smooth animations

6. Alert Overlay Animation

  1. Trigger various alerts in the application:
    - Success alert: Save course settings successfully
    - Error alert: Try to submit invalid form data
    - Info alert: Perform an action that shows an info message
  2. Verify alerts slide in from the right side with a smooth animation
  3. Verify the animation has two phases: first height expands, then slides into view
  4. Verify multiple alerts stack correctly with proper spacing (15px margin)
  5. Close alerts manually by clicking the X button
  6. Wait for alerts to auto-dismiss
  7. Verify the application remains responsive throughout

7. Theme Verification

  1. Switch between light and dark theme
  2. Repeat steps 1-6 in the alternate theme
  3. Verify all animations work identically in both themes
  4. Verify no visual glitches or color issues

Testserver States

You can manage test servers using Helios. Check environment statuses in the environment list. To deploy to a test server, go to the CI/CD page, find your PR or branch, and trigger the deployment.

Review Progress

Code Review

  • Code Review 1
  • Code Review 2

Manual Tests

  • Test 1
  • Test 2

Test Coverage

Class/File Line Coverage Lines Expects Ratio
answer-post.component.ts 97.59% 170 30 17.6
course-notification-overview.component.ts 88.39% 192 60 31.3
course-notification-popup-overlay.component.ts 98.21% 100 34 34.0
post.component.ts 95.56% 295 64 21.7
alert-overlay.component.ts 100.00% 24 11 45.8
iris-base-chatbot.component.ts 88.37% 441 85 19.3
exercise-chatbot-button.component.ts 88.88% 118 7 5.9

Summary by CodeRabbit

  • New Features

    • Central test helper to opt into no-op animations.
    • Chatbot: spinner on suggestion click, interaction tracking, and suggestions cleared after successful send.
  • Refactor

    • Replaced framework animation triggers with CSS/class-based enter/leave animations and wrapper hooks across alerts, notifications, posts, chatbot, and related UI.
    • Minor UI transition timing tweak in chat status.
  • Tests

    • Many specs updated to use the new helper or remove direct animation module imports.

✏️ Tip: You can customize this high-level summary in your review settings.

@krusche krusche requested review from a team as code owners December 12, 2025 23:01
@github-project-automation github-project-automation bot moved this to Work In Progress in Artemis Development Dec 12, 2025
@github-actions github-actions bot added tests client Pull requests that update TypeScript code. (Added Automatically!) atlas Pull requests that affect the corresponding module communication Pull requests that affect the corresponding module core Pull requests that affect the corresponding module exam Pull requests that affect the corresponding module exercise Pull requests that affect the corresponding module iris Pull requests that affect the corresponding module lecture Pull requests that affect the corresponding module programming Pull requests that affect the corresponding module labels Dec 12, 2025
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 12, 2025

Walkthrough

Removed Angular animation triggers/metadata from many components, replaced them with CSS keyframes/wrapper enter/leave bindings or class-based visibility, added a centralized test helper for noop animations, updated many specs to remove animation modules or use the helper, and removed BrowserAnimationsModule and RouterModule from appConfig.providers.

Changes

Cohort / File(s) Summary
App configuration
src/main/webapp/app/app.config.ts
Removed BrowserAnimationsModule and RouterModule from appConfig.providers.
New test helper
src/test/javascript/spec/helpers/animations.ts
Added provideNoopAnimationsForTests() wrapper that returns provideNoopAnimations() to centralize noop-animation provisioning for tests.
Component metadata — removed Angular animations
src/main/webapp/app/core/alert/alert-overlay.component.ts, src/main/webapp/app/communication/answer-post/answer-post.component.ts, src/main/webapp/app/communication/post/post.component.ts, src/main/webapp/app/communication/course-notification/.../*.component.ts, src/main/webapp/app/iris/overview/.../*.component.ts, src/main/webapp/app/iris/overview/exercise-chatbot/exercise-chatbot-button.component.ts, ...
Deleted animation imports and animations: [...] arrays from many component decorators.
Templates — animation bindings → wrappers/attributes/classes
src/main/webapp/app/communication/answer-post/answer-post.component.html, src/main/webapp/app/core/alert/alert-overlay.component.html, src/main/webapp/app/communication/course-notification/.../*.component.html, src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.html, src/main/webapp/app/iris/overview/exercise-chatbot/exercise-chatbot-button.component.html, ...
Replaced @... animation bindings with wrapper elements using animate.enter/animate.leave or class-based markers and adjusted DOM structure and conditional bindings.
SCSS — CSS keyframes & wrapper classes added
src/main/webapp/app/communication/answer-post/answer-post.component.scss, src/main/webapp/app/communication/course-notification/.../*.component.scss, src/main/webapp/app/core/alert/alert-overlay.component.scss, src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.scss, src/main/webapp/app/iris/overview/exercise-chatbot/exercise-chatbot-button.component.scss, ...
Introduced keyframes and wrapper-targeted classes (enter/leave states, scale/slide/fade), adjusted responsive/spacing selectors to target new wrappers, and added bubble-visible/hidden states.
Specs — removed animation modules and MockModule usage
many src/main/webapp/app/**/*.component.spec.ts (e.g., communication/*, core/*, iris/*, exam/*, atlas/*, programming/*, lecture/*, exercise/*, ...)
Removed BrowserAnimationsModule/NoopAnimationsModule imports and MockModule(...) usages across numerous spec files.
Specs — adopt provider helper or adjust providers
src/main/webapp/app/core/course/overview/course-statistics/course-statistics.component.spec.ts, src/main/webapp/app/exam/.../*.component.spec.ts, src/main/webapp/app/atlas/.../*.component.spec.ts, src/main/webapp/app/communication/.../*.component.spec.ts, src/main/webapp/app/exercise/.../*.component.spec.ts, ...
Replaced module-based animation stubs with provideNoopAnimationsForTests() in TestBed providers or removed noop providers, centralizing test animation handling.
Specs — other test adjustments
src/main/webapp/app/communication/answer-post/answer-post.component.spec.ts, src/main/webapp/app/communication/post/post.component.spec.ts, src/main/webapp/app/core/alert/alert-overlay.component.spec.ts, ...
Updated test declarations/imports (e.g., moved MockDirective(NgbTooltip) to declarations, added OverlayModule, expanded mocks/providers) to align tests with removed animation modules or new provider approach.
Iris chat service — suggestions timing change
src/main/webapp/app/iris/overview/services/iris-chat.service.ts
Moved clearing of suggestions from before sending the message to after a successful HTTP response (now cleared inside tap after created message).
Iris base chatbot — UI/state additions
src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.ts
Added faCircleNotch, animatingMessageIds, clickedSuggestion, lifecycle tweaks (500ms post-init animation enabling), and changed onSuggestionClick to set clickedSuggestion before dispatching.
Misc UI tweaks
src/main/webapp/app/iris/overview/base-chatbot/chat-status-bar/chat-status-bar.component.scss, src/main/webapp/app/core/alert/alert-overlay.component.html, ...
Minor presentation changes (e.g., increased transition duration, reorganized markup to wrapper-based animation handling).

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~30 minutes

  • Verify template class names and animate.enter/animate.leave attributes match the new SCSS selectors.
  • Inspect alert-overlay and notification wrapper spacing/positioning for responsive regressions.
  • Confirm all specs consistently use provideNoopAnimationsForTests() where intended and that no animation modules/providers remain unexpectedly.
  • Review app.config.ts removal of RouterModule for unintended routing/provider side effects.
  • Check the timing change in IrisChatService.sendMessage for potential UI race conditions or tests assuming pre-send clearing.

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The PR title clearly and accurately summarizes the main objective: migrating Angular animations to CSS animations. It is concise, specific, and directly reflects the primary change across the changeset.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch chore/angular-animation

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/main/webapp/app/app.config.ts (1)

35-79: Add animation provider to appConfig.
The configuration lacks provideAnimations() or provideNoopAnimations(). Angular 20.x requires one of these at runtime when Material or other animation-dependent libraries are present. Without it, Material components (dialogs, menus, tooltips, expansion panels, etc.) will fail at runtime with missing animation provider errors. Add provideAnimations() from @angular/platform-browser/animations to the providers array, or use provideNoopAnimations() if animations should be disabled.

🧹 Nitpick comments (7)
src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.scss (1)

6-25: Consider namespacing the keyframes + honoring prefers-reduced-motion.
@keyframes fade-in is very generic (global scope) and can collide; also consider disabling/reducing animations for reduced-motion users.

-@keyframes fade-in {
+@keyframes course-notification-fade-in {
     from {
         opacity: 0;
     }

     to {
         opacity: 1;
     }
 }

 .fade-animation-delayed-enter {
-    animation: fade-in 200ms 400ms ease-in-out forwards;
+    animation: course-notification-fade-in 200ms 400ms ease-in-out forwards;
     opacity: 0;
 }

 .notification-wrap-animation-enter {
-    animation: fade-in 200ms ease-in-out forwards;
+    animation: course-notification-fade-in 200ms ease-in-out forwards;
 }
+
+@media (prefers-reduced-motion: reduce) {
+    .fade-animation-delayed-enter,
+    .notification-wrap-animation-enter {
+        animation: none;
+        opacity: 1;
+    }
+}
src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.scss (1)

2-16: Consider adding prefers-reduced-motion support.

The CSS animation implementation is correct. However, for better accessibility, consider respecting the user's motion preferences.

Apply this pattern to disable or reduce animations when users prefer reduced motion:

 .notification-animation-enter {
     animation: notification-scale-in 200ms ease-in-out forwards;
+
+    @media (prefers-reduced-motion: reduce) {
+        animation: none;
+        opacity: 1;
+        transform: scale(1);
+    }
 }
src/main/webapp/app/core/alert/alert-overlay.component.scss (1)

22-24: Consider adding prefers-reduced-motion support for accessibility.

For better accessibility, respect users' motion preferences by disabling or reducing animations when requested.

 .alert-animation-enter {
     animation: alert-slide-in 0.4s cubic-bezier(0.2, 1.22, 0.64, 1) forwards;
+
+    @media (prefers-reduced-motion: reduce) {
+        animation: none;
+        margin-bottom: 15px;
+        transform: translateX(0);
+    }
 }
src/main/webapp/app/communication/answer-post/answer-post.component.scss (1)

6-19: Consider prefers-reduced-motion + keyframes namespacing to avoid global collisions.
Suggested tweak:

-@keyframes fade-in {
+@keyframes answer-post-fade-in {
     from {
         opacity: 0;
     }
 
     to {
         opacity: 1;
     }
 }
 
 .fade-animation-enter {
-    animation: fade-in 300ms ease-in forwards;
+    animation: answer-post-fade-in 300ms ease-in forwards;
+}
+
+@media (prefers-reduced-motion: reduce) {
+    .fade-animation-enter {
+        animation: none;
+    }
 }
src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.spec.ts (1)

55-68: Optional: add provideNoopAnimationsForTests() here for future-proofing (unless you intentionally want “real” animations in this spec).
Right now this is probably OK due to CSS migration, but noop-animations tends to prevent flaky UI tests when someone later reintroduces a library component that depends on Angular animations.

src/main/webapp/app/iris/overview/exercise-chatbot/exercise-chatbot-button.component.html (1)

6-6: Clean migration from trigger-based animation to CSS state classes.
The bubble-visible/bubble-hidden split is straightforward and keeps the template logic simple.

If you want to avoid relying on truthy/falsy object values, consider normalizing to booleans (e.g., !!newIrisMessage) for readability.

src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.scss (1)

60-64: Consider simplifying the dual animation or adding a clarifying comment.

The .message-animation-enter class applies the message-enter keyframe twice with different timing functions:

  1. First: 0.3s ease-in-out forwards (immediate)
  2. Second: 0.3s 0.1s cubic-bezier(0.2, 1.22, 0.64, 1) forwards (delayed with bounce)

Since both animations target the same properties (height, transform) and use forwards fill mode, the second animation will override the first. If the intention is to create a bounce effect, consider either:

  1. Using only the second animation with the cubic-bezier easing
  2. Adding a CSS comment explaining the dual-animation approach

Option 1: Simplified single animation

 .message-animation-enter {
-    animation:
-        message-enter 0.3s ease-in-out forwards,
-        message-enter 0.3s 0.1s cubic-bezier(0.2, 1.22, 0.64, 1) forwards;
+    animation: message-enter 0.3s 0.1s cubic-bezier(0.2, 1.22, 0.64, 1) forwards;
 }

Option 2: Add clarifying comment

 .message-animation-enter {
+    // Dual-stage animation: initial ease-in followed by bounce effect
     animation:
         message-enter 0.3s ease-in-out forwards,
         message-enter 0.3s 0.1s cubic-bezier(0.2, 1.22, 0.64, 1) forwards;
 }
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5eada0d and cd9c960.

📒 Files selected for processing (54)
  • src/main/webapp/app/app.config.ts (1 hunks)
  • src/main/webapp/app/atlas/manage/competency-graph/competency-graph.component.spec.ts (2 hunks)
  • src/main/webapp/app/atlas/manage/course-competencies-relation-graph/course-competencies-relation-graph.component.spec.ts (2 hunks)
  • src/main/webapp/app/atlas/manage/course-competencies-relation-modal/course-competencies-relation-modal.component.spec.ts (2 hunks)
  • src/main/webapp/app/communication/answer-post/answer-post.component.html (1 hunks)
  • src/main/webapp/app/communication/answer-post/answer-post.component.scss (1 hunks)
  • src/main/webapp/app/communication/answer-post/answer-post.component.spec.ts (2 hunks)
  • src/main/webapp/app/communication/answer-post/answer-post.component.ts (0 hunks)
  • src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.html (2 hunks)
  • src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.scss (1 hunks)
  • src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.spec.ts (1 hunks)
  • src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.ts (0 hunks)
  • src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.html (1 hunks)
  • src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.scss (1 hunks)
  • src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.spec.ts (1 hunks)
  • src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.ts (0 hunks)
  • src/main/webapp/app/communication/course-notification/course-notification/course-notification.component.spec.ts (1 hunks)
  • src/main/webapp/app/communication/faq/faq-update.component.spec.ts (2 hunks)
  • src/main/webapp/app/communication/faq/faq.component.spec.ts (1 hunks)
  • src/main/webapp/app/communication/post/post.component.spec.ts (2 hunks)
  • src/main/webapp/app/communication/post/post.component.ts (0 hunks)
  • src/main/webapp/app/communication/shared/discussion-section/discussion-section.component.spec.ts (1 hunks)
  • src/main/webapp/app/core/alert/alert-overlay.component.html (1 hunks)
  • src/main/webapp/app/core/alert/alert-overlay.component.scss (1 hunks)
  • src/main/webapp/app/core/alert/alert-overlay.component.spec.ts (0 hunks)
  • src/main/webapp/app/core/alert/alert-overlay.component.ts (0 hunks)
  • src/main/webapp/app/core/calendar/desktop/month-presentation/calendar-desktop-month-presentation.component.spec.ts (2 hunks)
  • src/main/webapp/app/core/calendar/desktop/overview/calendar-desktop-overview.component.spec.ts (2 hunks)
  • src/main/webapp/app/core/calendar/mobile/overview/calendar-mobile-overview.component.spec.ts (2 hunks)
  • src/main/webapp/app/core/calendar/shared/calendar-event-detail-popover-component/calendar-event-detail-popover.component.spec.ts (2 hunks)
  • src/main/webapp/app/core/calendar/shared/calendar-events-per-day-section/calendar-events-per-day-section.component.spec.ts (2 hunks)
  • src/main/webapp/app/core/calendar/shared/calendar-subscription-popover/calendar-subscription-popover.component.spec.ts (2 hunks)
  • src/main/webapp/app/core/course/manage/course-management-container/course-management-container.component.spec.ts (1 hunks)
  • src/main/webapp/app/core/course/overview/course-overview/course-overview.component.spec.ts (1 hunks)
  • src/main/webapp/app/core/course/overview/course-statistics/course-statistics.component.spec.ts (2 hunks)
  • src/main/webapp/app/core/course/overview/visualizations/exercise-scores-chart/exercise-scores-chart.component.spec.ts (2 hunks)
  • src/main/webapp/app/core/course/shared/course-sidebar/course-sidebar.component.spec.ts (0 hunks)
  • src/main/webapp/app/exam/manage/exam-scores/average-scores-graph/exam-scores-average-scores-graph.component.spec.ts (3 hunks)
  • src/main/webapp/app/exam/manage/exam-scores/exam-scores.component.spec.ts (2 hunks)
  • src/main/webapp/app/exam/manage/students/room-distribution/students-room-distribution-dialog.component.spec.ts (2 hunks)
  • src/main/webapp/app/exercise/statistics/exercise-statistics.component.spec.ts (2 hunks)
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.html (1 hunks)
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.scss (1 hunks)
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.spec.ts (1 hunks)
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.ts (0 hunks)
  • src/main/webapp/app/iris/overview/exercise-chatbot/exercise-chatbot-button.component.html (1 hunks)
  • src/main/webapp/app/iris/overview/exercise-chatbot/exercise-chatbot-button.component.scss (1 hunks)
  • src/main/webapp/app/iris/overview/exercise-chatbot/exercise-chatbot-button.component.spec.ts (1 hunks)
  • src/main/webapp/app/iris/overview/exercise-chatbot/exercise-chatbot-button.component.ts (0 hunks)
  • src/main/webapp/app/lecture/manage/lecture-series-create/lecture-series-create.component.spec.ts (2 hunks)
  • src/main/webapp/app/lecture/manage/lecture-series-edit-modal/lecture-series-draft-edit-modal.component.spec.ts (2 hunks)
  • src/main/webapp/app/programming/manage/update/programming-exercise-update.component.spec.ts (1 hunks)
  • src/main/webapp/app/programming/manage/update/update-components/information/programming-exercise-information.component.spec.ts (0 hunks)
  • src/test/javascript/spec/helpers/animations.ts (1 hunks)
💤 Files with no reviewable changes (10)
  • src/main/webapp/app/programming/manage/update/update-components/information/programming-exercise-information.component.spec.ts
  • src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.ts
  • src/main/webapp/app/core/alert/alert-overlay.component.spec.ts
  • src/main/webapp/app/communication/post/post.component.ts
  • src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.ts
  • src/main/webapp/app/iris/overview/exercise-chatbot/exercise-chatbot-button.component.ts
  • src/main/webapp/app/core/alert/alert-overlay.component.ts
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.ts
  • src/main/webapp/app/core/course/shared/course-sidebar/course-sidebar.component.spec.ts
  • src/main/webapp/app/communication/answer-post/answer-post.component.ts
🧰 Additional context used
📓 Path-based instructions (8)
src/main/webapp/app/**/*.{ts,tsx,html,scss,css}

📄 CodeRabbit inference engine (AGENTS.md)

Place Angular client code in src/main/webapp/app/ with feature modules, shared utilities in app/shared, and assets/translations in content/

Files:

  • src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.scss
  • src/main/webapp/app/iris/overview/exercise-chatbot/exercise-chatbot-button.component.scss
  • src/main/webapp/app/communication/answer-post/answer-post.component.html
  • src/main/webapp/app/lecture/manage/lecture-series-edit-modal/lecture-series-draft-edit-modal.component.spec.ts
  • src/main/webapp/app/core/course/overview/course-statistics/course-statistics.component.spec.ts
  • src/main/webapp/app/core/calendar/desktop/month-presentation/calendar-desktop-month-presentation.component.spec.ts
  • src/main/webapp/app/communication/faq/faq.component.spec.ts
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.html
  • src/main/webapp/app/core/course/manage/course-management-container/course-management-container.component.spec.ts
  • src/main/webapp/app/exam/manage/exam-scores/average-scores-graph/exam-scores-average-scores-graph.component.spec.ts
  • src/main/webapp/app/exam/manage/students/room-distribution/students-room-distribution-dialog.component.spec.ts
  • src/main/webapp/app/core/calendar/desktop/overview/calendar-desktop-overview.component.spec.ts
  • src/main/webapp/app/app.config.ts
  • src/main/webapp/app/atlas/manage/course-competencies-relation-graph/course-competencies-relation-graph.component.spec.ts
  • src/main/webapp/app/core/calendar/shared/calendar-subscription-popover/calendar-subscription-popover.component.spec.ts
  • src/main/webapp/app/core/course/overview/visualizations/exercise-scores-chart/exercise-scores-chart.component.spec.ts
  • src/main/webapp/app/lecture/manage/lecture-series-create/lecture-series-create.component.spec.ts
  • src/main/webapp/app/atlas/manage/competency-graph/competency-graph.component.spec.ts
  • src/main/webapp/app/communication/shared/discussion-section/discussion-section.component.spec.ts
  • src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.spec.ts
  • src/main/webapp/app/exam/manage/exam-scores/exam-scores.component.spec.ts
  • src/main/webapp/app/programming/manage/update/programming-exercise-update.component.spec.ts
  • src/main/webapp/app/communication/answer-post/answer-post.component.spec.ts
  • src/main/webapp/app/communication/post/post.component.spec.ts
  • src/main/webapp/app/core/alert/alert-overlay.component.html
  • src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.spec.ts
  • src/main/webapp/app/communication/course-notification/course-notification/course-notification.component.spec.ts
  • src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.scss
  • src/main/webapp/app/core/course/overview/course-overview/course-overview.component.spec.ts
  • src/main/webapp/app/core/calendar/shared/calendar-events-per-day-section/calendar-events-per-day-section.component.spec.ts
  • src/main/webapp/app/atlas/manage/course-competencies-relation-modal/course-competencies-relation-modal.component.spec.ts
  • src/main/webapp/app/core/alert/alert-overlay.component.scss
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.spec.ts
  • src/main/webapp/app/exercise/statistics/exercise-statistics.component.spec.ts
  • src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.html
  • src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.html
  • src/main/webapp/app/iris/overview/exercise-chatbot/exercise-chatbot-button.component.html
  • src/main/webapp/app/communication/faq/faq-update.component.spec.ts
  • src/main/webapp/app/core/calendar/mobile/overview/calendar-mobile-overview.component.spec.ts
  • src/main/webapp/app/iris/overview/exercise-chatbot/exercise-chatbot-button.component.spec.ts
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.scss
  • src/main/webapp/app/core/calendar/shared/calendar-event-detail-popover-component/calendar-event-detail-popover.component.spec.ts
  • src/main/webapp/app/communication/answer-post/answer-post.component.scss
src/main/webapp/app/**/*.component.html

📄 CodeRabbit inference engine (AGENTS.md)

In Angular templates, use built-in control-flow syntax (@if, @for, @switch) and never use legacy structural directives (*ngIf, *ngFor, *ngSwitch)

Files:

  • src/main/webapp/app/communication/answer-post/answer-post.component.html
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.html
  • src/main/webapp/app/core/alert/alert-overlay.component.html
  • src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.html
  • src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.html
  • src/main/webapp/app/iris/overview/exercise-chatbot/exercise-chatbot-button.component.html
src/main/webapp/**/*.html

⚙️ CodeRabbit configuration file

@if and @for are new and valid Angular syntax replacing *ngIf and *ngFor. They should always be used over the old style.

Files:

  • src/main/webapp/app/communication/answer-post/answer-post.component.html
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.html
  • src/main/webapp/app/core/alert/alert-overlay.component.html
  • src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.html
  • src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.html
  • src/main/webapp/app/iris/overview/exercise-chatbot/exercise-chatbot-button.component.html
src/main/webapp/app/**/*.spec.ts

📄 CodeRabbit inference engine (AGENTS.md)

Co-locate client tests with TypeScript components (Jest specs alongside component files)

Files:

  • src/main/webapp/app/lecture/manage/lecture-series-edit-modal/lecture-series-draft-edit-modal.component.spec.ts
  • src/main/webapp/app/core/course/overview/course-statistics/course-statistics.component.spec.ts
  • src/main/webapp/app/core/calendar/desktop/month-presentation/calendar-desktop-month-presentation.component.spec.ts
  • src/main/webapp/app/communication/faq/faq.component.spec.ts
  • src/main/webapp/app/core/course/manage/course-management-container/course-management-container.component.spec.ts
  • src/main/webapp/app/exam/manage/exam-scores/average-scores-graph/exam-scores-average-scores-graph.component.spec.ts
  • src/main/webapp/app/exam/manage/students/room-distribution/students-room-distribution-dialog.component.spec.ts
  • src/main/webapp/app/core/calendar/desktop/overview/calendar-desktop-overview.component.spec.ts
  • src/main/webapp/app/atlas/manage/course-competencies-relation-graph/course-competencies-relation-graph.component.spec.ts
  • src/main/webapp/app/core/calendar/shared/calendar-subscription-popover/calendar-subscription-popover.component.spec.ts
  • src/main/webapp/app/core/course/overview/visualizations/exercise-scores-chart/exercise-scores-chart.component.spec.ts
  • src/main/webapp/app/lecture/manage/lecture-series-create/lecture-series-create.component.spec.ts
  • src/main/webapp/app/atlas/manage/competency-graph/competency-graph.component.spec.ts
  • src/main/webapp/app/communication/shared/discussion-section/discussion-section.component.spec.ts
  • src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.spec.ts
  • src/main/webapp/app/exam/manage/exam-scores/exam-scores.component.spec.ts
  • src/main/webapp/app/programming/manage/update/programming-exercise-update.component.spec.ts
  • src/main/webapp/app/communication/answer-post/answer-post.component.spec.ts
  • src/main/webapp/app/communication/post/post.component.spec.ts
  • src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.spec.ts
  • src/main/webapp/app/communication/course-notification/course-notification/course-notification.component.spec.ts
  • src/main/webapp/app/core/course/overview/course-overview/course-overview.component.spec.ts
  • src/main/webapp/app/core/calendar/shared/calendar-events-per-day-section/calendar-events-per-day-section.component.spec.ts
  • src/main/webapp/app/atlas/manage/course-competencies-relation-modal/course-competencies-relation-modal.component.spec.ts
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.spec.ts
  • src/main/webapp/app/exercise/statistics/exercise-statistics.component.spec.ts
  • src/main/webapp/app/communication/faq/faq-update.component.spec.ts
  • src/main/webapp/app/core/calendar/mobile/overview/calendar-mobile-overview.component.spec.ts
  • src/main/webapp/app/iris/overview/exercise-chatbot/exercise-chatbot-button.component.spec.ts
  • src/main/webapp/app/core/calendar/shared/calendar-event-detail-popover-component/calendar-event-detail-popover.component.spec.ts
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (AGENTS.md)

In TypeScript/JavaScript files, prefer single quotes over double quotes

Files:

  • src/main/webapp/app/lecture/manage/lecture-series-edit-modal/lecture-series-draft-edit-modal.component.spec.ts
  • src/main/webapp/app/core/course/overview/course-statistics/course-statistics.component.spec.ts
  • src/main/webapp/app/core/calendar/desktop/month-presentation/calendar-desktop-month-presentation.component.spec.ts
  • src/main/webapp/app/communication/faq/faq.component.spec.ts
  • src/main/webapp/app/core/course/manage/course-management-container/course-management-container.component.spec.ts
  • src/main/webapp/app/exam/manage/exam-scores/average-scores-graph/exam-scores-average-scores-graph.component.spec.ts
  • src/main/webapp/app/exam/manage/students/room-distribution/students-room-distribution-dialog.component.spec.ts
  • src/main/webapp/app/core/calendar/desktop/overview/calendar-desktop-overview.component.spec.ts
  • src/test/javascript/spec/helpers/animations.ts
  • src/main/webapp/app/app.config.ts
  • src/main/webapp/app/atlas/manage/course-competencies-relation-graph/course-competencies-relation-graph.component.spec.ts
  • src/main/webapp/app/core/calendar/shared/calendar-subscription-popover/calendar-subscription-popover.component.spec.ts
  • src/main/webapp/app/core/course/overview/visualizations/exercise-scores-chart/exercise-scores-chart.component.spec.ts
  • src/main/webapp/app/lecture/manage/lecture-series-create/lecture-series-create.component.spec.ts
  • src/main/webapp/app/atlas/manage/competency-graph/competency-graph.component.spec.ts
  • src/main/webapp/app/communication/shared/discussion-section/discussion-section.component.spec.ts
  • src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.spec.ts
  • src/main/webapp/app/exam/manage/exam-scores/exam-scores.component.spec.ts
  • src/main/webapp/app/programming/manage/update/programming-exercise-update.component.spec.ts
  • src/main/webapp/app/communication/answer-post/answer-post.component.spec.ts
  • src/main/webapp/app/communication/post/post.component.spec.ts
  • src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.spec.ts
  • src/main/webapp/app/communication/course-notification/course-notification/course-notification.component.spec.ts
  • src/main/webapp/app/core/course/overview/course-overview/course-overview.component.spec.ts
  • src/main/webapp/app/core/calendar/shared/calendar-events-per-day-section/calendar-events-per-day-section.component.spec.ts
  • src/main/webapp/app/atlas/manage/course-competencies-relation-modal/course-competencies-relation-modal.component.spec.ts
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.spec.ts
  • src/main/webapp/app/exercise/statistics/exercise-statistics.component.spec.ts
  • src/main/webapp/app/communication/faq/faq-update.component.spec.ts
  • src/main/webapp/app/core/calendar/mobile/overview/calendar-mobile-overview.component.spec.ts
  • src/main/webapp/app/iris/overview/exercise-chatbot/exercise-chatbot-button.component.spec.ts
  • src/main/webapp/app/core/calendar/shared/calendar-event-detail-popover-component/calendar-event-detail-popover.component.spec.ts
src/main/webapp/app/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

src/main/webapp/app/**/*.{ts,tsx}: Use latest Angular/TypeScript features and avoid null, preferring undefined
Avoid spread operator for objects in TypeScript; prefer explicit property handling
Prefer 100% type safety in TypeScript code

Files:

  • src/main/webapp/app/lecture/manage/lecture-series-edit-modal/lecture-series-draft-edit-modal.component.spec.ts
  • src/main/webapp/app/core/course/overview/course-statistics/course-statistics.component.spec.ts
  • src/main/webapp/app/core/calendar/desktop/month-presentation/calendar-desktop-month-presentation.component.spec.ts
  • src/main/webapp/app/communication/faq/faq.component.spec.ts
  • src/main/webapp/app/core/course/manage/course-management-container/course-management-container.component.spec.ts
  • src/main/webapp/app/exam/manage/exam-scores/average-scores-graph/exam-scores-average-scores-graph.component.spec.ts
  • src/main/webapp/app/exam/manage/students/room-distribution/students-room-distribution-dialog.component.spec.ts
  • src/main/webapp/app/core/calendar/desktop/overview/calendar-desktop-overview.component.spec.ts
  • src/main/webapp/app/app.config.ts
  • src/main/webapp/app/atlas/manage/course-competencies-relation-graph/course-competencies-relation-graph.component.spec.ts
  • src/main/webapp/app/core/calendar/shared/calendar-subscription-popover/calendar-subscription-popover.component.spec.ts
  • src/main/webapp/app/core/course/overview/visualizations/exercise-scores-chart/exercise-scores-chart.component.spec.ts
  • src/main/webapp/app/lecture/manage/lecture-series-create/lecture-series-create.component.spec.ts
  • src/main/webapp/app/atlas/manage/competency-graph/competency-graph.component.spec.ts
  • src/main/webapp/app/communication/shared/discussion-section/discussion-section.component.spec.ts
  • src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.spec.ts
  • src/main/webapp/app/exam/manage/exam-scores/exam-scores.component.spec.ts
  • src/main/webapp/app/programming/manage/update/programming-exercise-update.component.spec.ts
  • src/main/webapp/app/communication/answer-post/answer-post.component.spec.ts
  • src/main/webapp/app/communication/post/post.component.spec.ts
  • src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.spec.ts
  • src/main/webapp/app/communication/course-notification/course-notification/course-notification.component.spec.ts
  • src/main/webapp/app/core/course/overview/course-overview/course-overview.component.spec.ts
  • src/main/webapp/app/core/calendar/shared/calendar-events-per-day-section/calendar-events-per-day-section.component.spec.ts
  • src/main/webapp/app/atlas/manage/course-competencies-relation-modal/course-competencies-relation-modal.component.spec.ts
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.spec.ts
  • src/main/webapp/app/exercise/statistics/exercise-statistics.component.spec.ts
  • src/main/webapp/app/communication/faq/faq-update.component.spec.ts
  • src/main/webapp/app/core/calendar/mobile/overview/calendar-mobile-overview.component.spec.ts
  • src/main/webapp/app/iris/overview/exercise-chatbot/exercise-chatbot-button.component.spec.ts
  • src/main/webapp/app/core/calendar/shared/calendar-event-detail-popover-component/calendar-event-detail-popover.component.spec.ts
src/main/webapp/**/*.ts

⚙️ CodeRabbit configuration file

angular_style:https://angular.io/guide/styleguide;methods_in_html:false;lazy_loading:true;code_reuse:true;tests:meaningful;types:PascalCase;enums:PascalCase;funcs:camelCase;props:camelCase;no_priv_prefix:true;strings:single_quotes;localize:true;btns:functionality;links:navigation;icons_text:newline;labels:associate;code_style:arrow_funcs,curly_braces,open_braces_same_line,indent_4;memory_leak_prevention:true;routes:naming_schema;chart_framework:ngx-charts;responsive_layout:true

Files:

  • src/main/webapp/app/lecture/manage/lecture-series-edit-modal/lecture-series-draft-edit-modal.component.spec.ts
  • src/main/webapp/app/core/course/overview/course-statistics/course-statistics.component.spec.ts
  • src/main/webapp/app/core/calendar/desktop/month-presentation/calendar-desktop-month-presentation.component.spec.ts
  • src/main/webapp/app/communication/faq/faq.component.spec.ts
  • src/main/webapp/app/core/course/manage/course-management-container/course-management-container.component.spec.ts
  • src/main/webapp/app/exam/manage/exam-scores/average-scores-graph/exam-scores-average-scores-graph.component.spec.ts
  • src/main/webapp/app/exam/manage/students/room-distribution/students-room-distribution-dialog.component.spec.ts
  • src/main/webapp/app/core/calendar/desktop/overview/calendar-desktop-overview.component.spec.ts
  • src/main/webapp/app/app.config.ts
  • src/main/webapp/app/atlas/manage/course-competencies-relation-graph/course-competencies-relation-graph.component.spec.ts
  • src/main/webapp/app/core/calendar/shared/calendar-subscription-popover/calendar-subscription-popover.component.spec.ts
  • src/main/webapp/app/core/course/overview/visualizations/exercise-scores-chart/exercise-scores-chart.component.spec.ts
  • src/main/webapp/app/lecture/manage/lecture-series-create/lecture-series-create.component.spec.ts
  • src/main/webapp/app/atlas/manage/competency-graph/competency-graph.component.spec.ts
  • src/main/webapp/app/communication/shared/discussion-section/discussion-section.component.spec.ts
  • src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.spec.ts
  • src/main/webapp/app/exam/manage/exam-scores/exam-scores.component.spec.ts
  • src/main/webapp/app/programming/manage/update/programming-exercise-update.component.spec.ts
  • src/main/webapp/app/communication/answer-post/answer-post.component.spec.ts
  • src/main/webapp/app/communication/post/post.component.spec.ts
  • src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.spec.ts
  • src/main/webapp/app/communication/course-notification/course-notification/course-notification.component.spec.ts
  • src/main/webapp/app/core/course/overview/course-overview/course-overview.component.spec.ts
  • src/main/webapp/app/core/calendar/shared/calendar-events-per-day-section/calendar-events-per-day-section.component.spec.ts
  • src/main/webapp/app/atlas/manage/course-competencies-relation-modal/course-competencies-relation-modal.component.spec.ts
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.spec.ts
  • src/main/webapp/app/exercise/statistics/exercise-statistics.component.spec.ts
  • src/main/webapp/app/communication/faq/faq-update.component.spec.ts
  • src/main/webapp/app/core/calendar/mobile/overview/calendar-mobile-overview.component.spec.ts
  • src/main/webapp/app/iris/overview/exercise-chatbot/exercise-chatbot-button.component.spec.ts
  • src/main/webapp/app/core/calendar/shared/calendar-event-detail-popover-component/calendar-event-detail-popover.component.spec.ts
src/test/javascript/spec/**/*.ts

⚙️ CodeRabbit configuration file

jest: true; mock: NgMocks; bad_practices: avoid_full_module_import; perf_improvements: mock_irrelevant_deps; service_testing: mock_http_for_logic; no_schema: avoid_NO_ERRORS_SCHEMA; expectation_specificity: true; solutions: {boolean: toBeTrue/False, reference: toBe, existence: toBeNull/NotNull, undefined: toBeUndefined, class_obj: toContainEntries/toEqual, spy_calls: {not_called: not.toHaveBeenCalled, once: toHaveBeenCalledOnce, with_value: toHaveBeenCalledWith|toHaveBeenCalledExactlyOnceWith}}

Files:

  • src/test/javascript/spec/helpers/animations.ts
🧬 Code graph analysis (17)
src/main/webapp/app/lecture/manage/lecture-series-edit-modal/lecture-series-draft-edit-modal.component.spec.ts (1)
src/test/javascript/spec/helpers/animations.ts (1)
  • provideNoopAnimationsForTests (27-29)
src/main/webapp/app/core/course/overview/course-statistics/course-statistics.component.spec.ts (1)
src/test/javascript/spec/helpers/animations.ts (1)
  • provideNoopAnimationsForTests (27-29)
src/main/webapp/app/core/calendar/desktop/month-presentation/calendar-desktop-month-presentation.component.spec.ts (1)
src/test/javascript/spec/helpers/animations.ts (1)
  • provideNoopAnimationsForTests (27-29)
src/main/webapp/app/exam/manage/exam-scores/average-scores-graph/exam-scores-average-scores-graph.component.spec.ts (1)
src/test/javascript/spec/helpers/animations.ts (1)
  • provideNoopAnimationsForTests (27-29)
src/main/webapp/app/exam/manage/students/room-distribution/students-room-distribution-dialog.component.spec.ts (1)
src/test/javascript/spec/helpers/animations.ts (1)
  • provideNoopAnimationsForTests (27-29)
src/main/webapp/app/core/calendar/desktop/overview/calendar-desktop-overview.component.spec.ts (1)
src/test/javascript/spec/helpers/animations.ts (1)
  • provideNoopAnimationsForTests (27-29)
src/main/webapp/app/atlas/manage/course-competencies-relation-graph/course-competencies-relation-graph.component.spec.ts (1)
src/test/javascript/spec/helpers/animations.ts (1)
  • provideNoopAnimationsForTests (27-29)
src/main/webapp/app/core/calendar/shared/calendar-subscription-popover/calendar-subscription-popover.component.spec.ts (1)
src/test/javascript/spec/helpers/animations.ts (1)
  • provideNoopAnimationsForTests (27-29)
src/main/webapp/app/core/course/overview/visualizations/exercise-scores-chart/exercise-scores-chart.component.spec.ts (1)
src/test/javascript/spec/helpers/animations.ts (1)
  • provideNoopAnimationsForTests (27-29)
src/main/webapp/app/lecture/manage/lecture-series-create/lecture-series-create.component.spec.ts (1)
src/test/javascript/spec/helpers/animations.ts (1)
  • provideNoopAnimationsForTests (27-29)
src/main/webapp/app/atlas/manage/competency-graph/competency-graph.component.spec.ts (1)
src/test/javascript/spec/helpers/animations.ts (1)
  • provideNoopAnimationsForTests (27-29)
src/main/webapp/app/exam/manage/exam-scores/exam-scores.component.spec.ts (1)
src/test/javascript/spec/helpers/animations.ts (1)
  • provideNoopAnimationsForTests (27-29)
src/main/webapp/app/core/calendar/shared/calendar-events-per-day-section/calendar-events-per-day-section.component.spec.ts (1)
src/test/javascript/spec/helpers/animations.ts (1)
  • provideNoopAnimationsForTests (27-29)
src/main/webapp/app/atlas/manage/course-competencies-relation-modal/course-competencies-relation-modal.component.spec.ts (1)
src/test/javascript/spec/helpers/animations.ts (1)
  • provideNoopAnimationsForTests (27-29)
src/main/webapp/app/exercise/statistics/exercise-statistics.component.spec.ts (1)
src/test/javascript/spec/helpers/animations.ts (1)
  • provideNoopAnimationsForTests (27-29)
src/main/webapp/app/core/calendar/mobile/overview/calendar-mobile-overview.component.spec.ts (1)
src/test/javascript/spec/helpers/animations.ts (1)
  • provideNoopAnimationsForTests (27-29)
src/main/webapp/app/core/calendar/shared/calendar-event-detail-popover-component/calendar-event-detail-popover.component.spec.ts (1)
src/test/javascript/spec/helpers/animations.ts (1)
  • provideNoopAnimationsForTests (27-29)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (10)
  • GitHub Check: Codacy Static Code Analysis
  • GitHub Check: Build and Push Docker Image / Build linux/arm64 Docker Image for ls1intum/artemis
  • GitHub Check: Build .war artifact
  • GitHub Check: Build and Push Docker Image / Build linux/amd64 Docker Image for ls1intum/artemis
  • GitHub Check: client-tests
  • GitHub Check: server-tests
  • GitHub Check: client-style
  • GitHub Check: server-style
  • GitHub Check: client-tests-selected
  • GitHub Check: Analyse
🔇 Additional comments (37)
src/main/webapp/app/communication/faq/faq.component.spec.ts (1)

5-5: Sanity-check: if this spec gets flaky post-migration, switch to the shared noop-animations helper.
Given the codebase-wide removal of BrowserAnimationsModule, if FaqComponent (or any nested third-party UI) still schedules animations/timers in tests, consider adding provideNoopAnimationsForTests() to the TestBed providers (per the new test helper pattern used elsewhere in this PR).

src/main/webapp/app/programming/manage/update/programming-exercise-update.component.spec.ts (1)

73-89: Removal of BrowserAnimationsModule from this spec looks safe.
This test setup doesn’t appear to depend on Angular animation providers, so dropping it should reduce noise and align with the migration.

src/main/webapp/app/communication/post/post.component.spec.ts (2)

1-4: Keep ng-mocks import update consistent (OK).
No concerns with the MockDirective addition itself.


85-116: NgbTooltip is correctly imported as a standalone directive. ng-bootstrap v14+ (including v19.x) supports standalone directives, so imports: [NgbTooltip, OverlayModule] is valid and will not break tests. No changes needed.

src/main/webapp/app/app.config.ts (1)

6-12: RouterModule removal is consistent with provideRouter usage.
No issues with the import change itself.

src/main/webapp/app/core/course/manage/course-management-container/course-management-container.component.spec.ts (1)

165-177: Dropping BrowserAnimationsModule from this spec looks safe and reduces test coupling.

src/main/webapp/app/communication/shared/discussion-section/discussion-section.component.spec.ts (1)

71-99: TestBed imports cleanup (removing BrowserAnimationsModule) looks good.

src/main/webapp/app/core/course/overview/course-overview/course-overview.component.spec.ts (1)

190-207: FaIconComponent in TestBed imports is correct.

The change is consistent with the codebase pattern. FaIconComponent from @fortawesome/angular-fontawesome 3.0.0 is a standalone component and correctly belongs in the imports array.

src/main/webapp/app/communication/faq/faq-update.component.spec.ts (1)

46-55: TestBed configuration is correct.
FaIconComponent is a standalone component in @fortawesome/angular-fontawesome and can be imported directly via the imports array. The change from BrowserAnimationsModule to [FaIconComponent] is valid.

src/main/webapp/app/iris/overview/exercise-chatbot/exercise-chatbot-button.component.scss (1)

32-46: LGTM! Clean migration to CSS-based visibility animations.

The transform-origin and transition properties work well together with the visibility state classes. The approach properly handles the scale animation for show/hide states.

src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.html (1)

10-10: LGTM! Correctly applies CSS animation class.

The migration from Angular animation binding to CSS class is implemented correctly and aligns with the corresponding SCSS definitions.

src/main/webapp/app/core/alert/alert-overlay.component.html (1)

2-2: LGTM! Consistent migration to CSS animation classes.

Both the dismiss-all button and alert-wrap elements correctly apply the CSS animation class, matching the pattern used throughout this PR.

Also applies to: 10-10

src/main/webapp/app/exam/manage/students/room-distribution/students-room-distribution-dialog.component.spec.ts (1)

25-25: LGTM! Proper migration to centralized test helper.

The switch to provideNoopAnimationsForTests() aligns with the project-wide test infrastructure standardization. The helper correctly delegates to provideNoopAnimations() while providing a consistent import path across all test files.

Also applies to: 58-58

src/main/webapp/app/core/calendar/mobile/overview/calendar-mobile-overview.component.spec.ts (1)

17-17: LGTM! Consistent use of centralized animation test helper.

The migration follows the same pattern as other test files in this PR, ensuring consistency across the test suite.

Also applies to: 62-62

src/main/webapp/app/lecture/manage/lecture-series-edit-modal/lecture-series-draft-edit-modal.component.spec.ts (1)

10-10: LGTM! Proper use of standardized animation test helper.

The test configuration correctly adopts the centralized provideNoopAnimationsForTests() helper, maintaining consistency with the broader test infrastructure updates in this PR.

Also applies to: 24-24

src/main/webapp/app/exercise/statistics/exercise-statistics.component.spec.ts (1)

17-18: Good: centralized noop animations provider in TestBed to keep tests deterministic.
Given Angular’s provider typing changes across versions, it’s worth confirming this compiles cleanly in CI with the current Angular version.

Also applies to: 50-60

src/main/webapp/app/exam/manage/exam-scores/exam-scores.component.spec.ts (1)

49-50: Good: switching from module-based animations to provider-based noop animations matches the migration strategy.

Also applies to: 266-294

src/main/webapp/app/communication/course-notification/course-notification/course-notification.component.spec.ts (1)

47-50: Verify that the component template no longer contains Angular animation triggers before removing NoopAnimationsModule.

If course-notification.component.html uses @trigger directives or if the component class defines animations metadata, tests will fail with "Unexpected synthetic property" errors. Confirm the migration to CSS animations is complete and no animation bindings remain in the template.

src/main/webapp/app/lecture/manage/lecture-series-create/lecture-series-create.component.spec.ts (1)

13-13: Import path and helper function verified as valid.

The import from test/helpers/animations resolves correctly (mapped to src/test/javascript/spec/helpers/animations.ts), and provideNoopAnimationsForTests is properly exported. This pattern is consistently used across 18+ spec files in the codebase, confirming the path alias and helper work as expected.

src/main/webapp/app/core/calendar/desktop/month-presentation/calendar-desktop-month-presentation.component.spec.ts (1)

13-14: Consistent noop-animations setup for calendar tests—verify the custom helper exists.

The import from 'test/helpers/animations' references a custom project helper rather than a standard Angular package. Confirm that provideNoopAnimationsForTests is properly exported from test/helpers/animations.ts and that this helper correctly wraps Angular's provideNoopAnimations().

Also applies to: 60-66

src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.spec.ts (1)

76-76: Removing NoopAnimationsModule here seems fine after CSS migration—just ensure nothing still depends on the animations engine.
Given the component no longer uses Angular animations and children are mocked, dropping the module should be safe; please verify by running this spec (and any Iris-related spec suite) to catch hidden dependencies.

src/main/webapp/app/communication/answer-post/answer-post.component.html (1)

68-69: CSS class-based entry animation hookup looks correct.
Applying fade-animation-enter on the conditionally-rendered reactions bar should reproduce the former “enter” behavior without Angular animations.

src/main/webapp/app/core/course/overview/course-statistics/course-statistics.component.spec.ts (1)

25-26: Nice: centralized noop-animations provider keeps specs consistent.
Using provideNoopAnimationsForTests() here aligns with the new testing approach and should reduce churn when Angular deprecations land.

Also applies to: 343-346

src/main/webapp/app/core/calendar/desktop/overview/calendar-desktop-overview.component.spec.ts (1)

19-20: Provider-based noop animations update is consistent and low-risk.
Looks good; should behave like the prior provideNoopAnimations() usage while keeping specs aligned with the new helper.

Also applies to: 49-54

src/main/webapp/app/atlas/manage/course-competencies-relation-graph/course-competencies-relation-graph.component.spec.ts (1)

6-7: Good alignment with the shared animations test helper.
Switching from NoopAnimationsModule to provideNoopAnimationsForTests() is consistent with the repo-wide direction and should keep these graph tests stable.

Also applies to: 56-65

src/main/webapp/app/iris/overview/exercise-chatbot/exercise-chatbot-button.component.spec.ts (1)

73-75: Verify HtmlForMarkdownPipe standalone status in TestBed configuration.

The placement of MockPipe(HtmlForMarkdownPipe) depends on whether the pipe is standalone: use imports only if it's standalone (Angular 14+), otherwise use declarations. Without confirming the pipe's definition, the current configuration cannot be validated. Check the HtmlForMarkdownPipe class definition for the standalone: true flag to determine correct placement.

src/main/webapp/app/core/calendar/shared/calendar-subscription-popover/calendar-subscription-popover.component.spec.ts (1)

5-5: LGTM: Test animation helper migration completed correctly.

The migration from provideNoopAnimations() to provideNoopAnimationsForTests() is consistent with the centralized test helper pattern introduced in this PR.

Also applies to: 17-17

src/main/webapp/app/atlas/manage/course-competencies-relation-modal/course-competencies-relation-modal.component.spec.ts (1)

13-13: LGTM: Consistent migration to provider-based animation stubbing.

The change from NoopAnimationsModule to provideNoopAnimationsForTests() aligns with the project-wide test strategy.

Also applies to: 59-59

src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.scss (1)

35-70: LGTM: CSS animations successfully replace Angular animations.

The keyframe animations and CSS classes provide a clean replacement for the Angular animation metadata that was removed from the component TypeScript file.

src/main/webapp/app/core/calendar/shared/calendar-event-detail-popover-component/calendar-event-detail-popover.component.spec.ts (1)

8-8: LGTM: Test helper migration is consistent.

The migration follows the established pattern across all test files in this PR.

Also applies to: 18-18

src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.html (2)

172-172: LGTM: Animation trigger replaced with CSS class.

The change from @suggestionAnimation trigger to suggestion-animation-enter CSS class correctly implements the migration to CSS-based animations.


179-179: LGTM: Conditional animation correctly migrated to CSS class binding.

The migration from @messageAnimation with [@.disabled]="!shouldAnimate" to [class.message-animation-enter]="shouldAnimate" preserves the conditional animation behavior while using CSS classes. This is the correct approach for CSS-based animations.

src/main/webapp/app/atlas/manage/competency-graph/competency-graph.component.spec.ts (1)

7-7: LGTM: Module-based animation stubbing replaced with provider-based approach.

The migration from NoopAnimationsModule to provideNoopAnimationsForTests() is correctly implemented and consistent with the project-wide pattern.

Also applies to: 34-41

src/main/webapp/app/exam/manage/exam-scores/average-scores-graph/exam-scores-average-scores-graph.component.spec.ts (1)

15-15: LGTM: Animation module migration completed correctly.

The change from BrowserAnimationsModule in imports to provideNoopAnimationsForTests() in providers follows the established pattern for this PR.

Also applies to: 55-69

src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.spec.ts (1)

54-60: Verify whether animation stubbing is needed for consistency.

Animation modules (BrowserAnimationsModule, NoopAnimationsModule) were removed from imports, but provideNoopAnimationsForTests() was not added to providers. According to the PR objectives, the helper is intended to consolidate animation stubbing for third-party libraries (PrimeNG, ngx-charts, ngx-graph).

Please verify whether:

  1. The component or its dependencies (including CourseNotificationComponent) use any third-party libraries that require animation support
  2. If so, add provideNoopAnimationsForTests() to the providers array for consistency with other test files in this PR

If no animation support is needed, this change is acceptable.

src/main/webapp/app/core/course/overview/visualizations/exercise-scores-chart/exercise-scores-chart.component.spec.ts (1)

15-15: Centralized noop-animations provider usage looks correct.

Switching from importing animation modules to provideNoopAnimationsForTests() in providers matches the PR direction and keeps the test setup lightweight.

Also applies to: 41-53

src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.html (1)

44-47: Potential regression: animations may not play when the overlay is opened.

Because these animation classes are always present, the keyframes may run while the overlay is hidden and won't replay on open unless your SCSS scopes animation to the .is-shown state (or otherwise re-triggers). Consider toggling the classes with isShown:

-                    <div class="fade-animation-delayed-enter">
+                    <div [class.fade-animation-delayed-enter]="isShown">
                         @for (notification of notificationsForSelectedCategory; track notification) {
-                            <div class="course-notification-overview-notification-wrap notification-wrap-animation-enter">
+                            <div
+                                class="course-notification-overview-notification-wrap"
+                                [class.notification-wrap-animation-enter]="isShown"
+                            >
                                 <jhi-course-notification
                                     [courseNotification]="notification"
                                     [isUnseen]="notification.status === CourseNotificationViewingStatus.UNSEEN"
                                     [isShowClose]="true"
                                     [isRedirectToUrl]="true"
                                     (onCloseClicked)="closeClicked(notification)"
                                 />
                             </div>
                         }
                         <div class="py-1"></div>
                     </div>
                 } @else {
-                    <div class="course-notification-overview-notification-empty-prompt fade-animation-delayed-enter">
+                    <div
+                        class="course-notification-overview-notification-empty-prompt"
+                        [class.fade-animation-delayed-enter]="isShown"
+                    >

Also applies to: 59

@github-project-automation github-project-automation bot moved this from Work In Progress to Ready For Review in Artemis Development Dec 12, 2025
coderabbitai[bot]
coderabbitai bot previously approved these changes Dec 12, 2025
@github-actions
Copy link

End-to-End (E2E) Test Results Summary

TestsPassed ☑️Skipped ⚠️Failed ❌️Time ⏱
End-to-End (E2E) Test Report218 ran212 passed3 skipped3 failed1h 13m 4s 553ms
TestResultTime ⏱
End-to-End (E2E) Test Report
e2e/exam/test-exam/TestExamParticipation.spec.ts
ts.Test exam participation › Early Hand-in › Using exercise overview to navigate within exam❌ failure3m 50s 844ms
e2e/exercise/programming/ProgrammingExerciseParticipation.spec.ts
ts.Programming exercise participation › Programming exercise team participation › Check team participation › Instructor checks the participation❌ failure8s 67ms
e2e/exercise/programming/ProgrammingExerciseStaticCodeAnalysis.spec.ts
ts.Static code analysis tests › Configures SCA grading and makes a successful submission with SCA errors❌ failure2m 26s 42ms

@github-actions
Copy link

End-to-End (E2E) Test Results Summary

TestsPassed ☑️Skipped ⚠️Failed ❌️Time ⏱
End-to-End (E2E) Test Report218 ran214 passed3 skipped1 failed1h 11m 51s 197ms
TestResultTime ⏱
End-to-End (E2E) Test Report
e2e/exercise/programming/ProgrammingExerciseParticipation.spec.ts
ts.Programming exercise participation › Programming exercise team participation › Check team participation › Instructor checks the participation❌ failure7s 225ms

@github-actions
Copy link

End-to-End (E2E) Test Results Summary

TestsPassed ☑️Skipped ⚠️Failed ❌️Time ⏱
End-to-End (E2E) Test Report218 ran209 passed3 skipped6 failed1h 17m 8s 63ms
TestResultTime ⏱
End-to-End (E2E) Test Report
e2e/atlas/CompetencyManagement.spec.ts
ts.Competency Management › Creates a competency❌ failure2m 3s 597ms
ts.Prerequisite Management › Creates a prerequisite❌ failure2m 3s 607ms
ts.Prerequisite Management › Prerequisite editing › Edits a prerequisite❌ failure2m 4s 71ms
e2e/exam/test-exam/TestExamParticipation.spec.ts
ts.Test exam participation › Early Hand-in › Using exercise overview to navigate within exam❌ failure3m 48s 341ms
e2e/exercise/programming/ProgrammingExerciseParticipation.spec.ts
ts.Programming exercise participation › Programming exercise team participation › Check team participation › Instructor checks the participation❌ failure8s 858ms
e2e/exercise/programming/ProgrammingExerciseStaticCodeAnalysis.spec.ts
ts.Static code analysis tests › Configures SCA grading and makes a successful submission with SCA errors❌ failure2m 30s 705ms

@github-actions
Copy link

End-to-End (E2E) Test Results Summary

TestsPassed ☑️Skipped ⚠️Failed ❌️Time ⏱
End-to-End (E2E) Test Report218 ran214 passed3 skipped1 failed1h 11m 2s 517ms
TestResultTime ⏱
End-to-End (E2E) Test Report
e2e/exercise/programming/ProgrammingExerciseParticipation.spec.ts
ts.Programming exercise participation › Programming exercise team participation › Check team participation › Instructor checks the participation❌ failure8s 466ms

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5e20e55 and e11c916.

📒 Files selected for processing (10)
  • src/main/webapp/app/core/calendar/desktop/month-presentation/calendar-desktop-month-presentation.component.spec.ts (0 hunks)
  • src/main/webapp/app/core/calendar/desktop/overview/calendar-desktop-overview.component.spec.ts (0 hunks)
  • src/main/webapp/app/core/calendar/mobile/overview/calendar-mobile-overview.component.spec.ts (0 hunks)
  • src/main/webapp/app/core/calendar/shared/calendar-event-detail-popover-component/calendar-event-detail-popover.component.spec.ts (0 hunks)
  • src/main/webapp/app/core/calendar/shared/calendar-events-per-day-section/calendar-events-per-day-section.component.spec.ts (0 hunks)
  • src/main/webapp/app/core/calendar/shared/calendar-subscription-popover/calendar-subscription-popover.component.spec.ts (1 hunks)
  • src/main/webapp/app/exam/manage/students/room-distribution/students-room-distribution-dialog.component.spec.ts (0 hunks)
  • src/main/webapp/app/lecture/manage/lecture-series-create/lecture-series-create.component.spec.ts (0 hunks)
  • src/main/webapp/app/lecture/manage/lecture-series-edit-modal/lecture-series-draft-edit-modal.component.spec.ts (1 hunks)
  • src/test/javascript/spec/helpers/animations.ts (1 hunks)
💤 Files with no reviewable changes (7)
  • src/main/webapp/app/core/calendar/shared/calendar-events-per-day-section/calendar-events-per-day-section.component.spec.ts
  • src/main/webapp/app/core/calendar/desktop/overview/calendar-desktop-overview.component.spec.ts
  • src/main/webapp/app/core/calendar/desktop/month-presentation/calendar-desktop-month-presentation.component.spec.ts
  • src/main/webapp/app/core/calendar/mobile/overview/calendar-mobile-overview.component.spec.ts
  • src/main/webapp/app/exam/manage/students/room-distribution/students-room-distribution-dialog.component.spec.ts
  • src/main/webapp/app/core/calendar/shared/calendar-event-detail-popover-component/calendar-event-detail-popover.component.spec.ts
  • src/main/webapp/app/lecture/manage/lecture-series-create/lecture-series-create.component.spec.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/test/javascript/spec/helpers/animations.ts
🧰 Additional context used
📓 Path-based instructions (5)
src/main/webapp/app/**/*.{ts,tsx,html,scss,css}

📄 CodeRabbit inference engine (AGENTS.md)

Place Angular client code in src/main/webapp/app/ with feature modules, shared utilities in app/shared, and assets/translations in content/

Files:

  • src/main/webapp/app/core/calendar/shared/calendar-subscription-popover/calendar-subscription-popover.component.spec.ts
  • src/main/webapp/app/lecture/manage/lecture-series-edit-modal/lecture-series-draft-edit-modal.component.spec.ts
src/main/webapp/app/**/*.spec.ts

📄 CodeRabbit inference engine (AGENTS.md)

Co-locate client tests with TypeScript components (Jest specs alongside component files)

Files:

  • src/main/webapp/app/core/calendar/shared/calendar-subscription-popover/calendar-subscription-popover.component.spec.ts
  • src/main/webapp/app/lecture/manage/lecture-series-edit-modal/lecture-series-draft-edit-modal.component.spec.ts
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (AGENTS.md)

In TypeScript/JavaScript files, prefer single quotes over double quotes

Files:

  • src/main/webapp/app/core/calendar/shared/calendar-subscription-popover/calendar-subscription-popover.component.spec.ts
  • src/main/webapp/app/lecture/manage/lecture-series-edit-modal/lecture-series-draft-edit-modal.component.spec.ts
src/main/webapp/app/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

src/main/webapp/app/**/*.{ts,tsx}: Use latest Angular/TypeScript features and avoid null, preferring undefined
Avoid spread operator for objects in TypeScript; prefer explicit property handling
Prefer 100% type safety in TypeScript code

Files:

  • src/main/webapp/app/core/calendar/shared/calendar-subscription-popover/calendar-subscription-popover.component.spec.ts
  • src/main/webapp/app/lecture/manage/lecture-series-edit-modal/lecture-series-draft-edit-modal.component.spec.ts
src/main/webapp/**/*.ts

⚙️ CodeRabbit configuration file

angular_style:https://angular.io/guide/styleguide;methods_in_html:false;lazy_loading:true;code_reuse:true;tests:meaningful;types:PascalCase;enums:PascalCase;funcs:camelCase;props:camelCase;no_priv_prefix:true;strings:single_quotes;localize:true;btns:functionality;links:navigation;icons_text:newline;labels:associate;code_style:arrow_funcs,curly_braces,open_braces_same_line,indent_4;memory_leak_prevention:true;routes:naming_schema;chart_framework:ngx-charts;responsive_layout:true

Files:

  • src/main/webapp/app/core/calendar/shared/calendar-subscription-popover/calendar-subscription-popover.component.spec.ts
  • src/main/webapp/app/lecture/manage/lecture-series-edit-modal/lecture-series-draft-edit-modal.component.spec.ts
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (10)
  • GitHub Check: Codacy Static Code Analysis
  • GitHub Check: Build and Push Docker Image / Build linux/amd64 Docker Image for ls1intum/artemis
  • GitHub Check: Build and Push Docker Image / Build linux/arm64 Docker Image for ls1intum/artemis
  • GitHub Check: Build .war artifact
  • GitHub Check: server-tests
  • GitHub Check: client-style
  • GitHub Check: client-tests-selected
  • GitHub Check: client-tests
  • GitHub Check: server-style
  • GitHub Check: Analyse
🔇 Additional comments (1)
src/main/webapp/app/core/calendar/shared/calendar-subscription-popover/calendar-subscription-popover.component.spec.ts (1)

15-15: No action required—the test configuration is correct.

The component uses PrimeNG components (Popover, Checkbox, SelectButton), which as of PrimeNG 21 no longer require animation providers in tests. The removal of provideNoopAnimations() is appropriate and aligns with the PR's migration away from Angular animations. The centralized provideNoopAnimationsForTests() helper is specifically for libraries like ngx-charts and ngx-graph that still depend on @angular/animations; this component doesn't use those libraries.

@github-actions
Copy link

End-to-End (E2E) Test Results Summary

TestsPassed ✅SkippedFailedTime ⏱
End-to-End (E2E) Test Report1 ran1 passed0 skipped0 failed1s 860ms
TestResultTime ⏱
No test annotations available

@github-actions
Copy link

End-to-End (E2E) Test Results Summary

TestsPassed ☑️Skipped ⚠️Failed ❌️Time ⏱
End-to-End (E2E) Test Report218 ran214 passed3 skipped1 failed1h 7m 45s 577ms
TestResultTime ⏱
End-to-End (E2E) Test Report
e2e/exercise/programming/ProgrammingExerciseParticipation.spec.ts
ts.Programming exercise participation › Programming exercise team participation › Check team participation › Instructor checks the participation❌ failure9s 77ms

@helios-aet helios-aet bot temporarily deployed to artemis-test4.artemis.cit.tum.de December 17, 2025 12:31 Inactive
Copy link
Collaborator

@FelixTJDietrich FelixTJDietrich left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tested on staging works as expected in the mentioned locations of the testing steps. The code also looks good and nothing strange sticks out, except for provideNoopAnimationsForTests but that is explained in the helper.

bassner and others added 4 commits December 17, 2025 14:34
Use Angular 21's animate.enter and animate.leave attributes to properly
trigger animations when elements enter/leave the DOM. Use CSS Grid
(grid-template-rows: 0fr → 1fr) to animate height since CSS cannot
interpolate to height: auto.
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
src/main/webapp/app/core/alert/alert-overlay.component.scss (1)

24-32: Consider if max-height: 200px is sufficient for all alert content.

The max-height: 200px is used for the height animation, which is correct (browsers can interpolate max-height unlike height: auto). However, if an alert has very long content (e.g., multi-line error messages with action buttons), it might get clipped.

If this becomes an issue, consider increasing to a larger value like 500px — since max-height only constrains the animation endpoint and doesn't affect final rendered height once animation completes.

Also applies to: 56-57, 69-73

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e11c916 and 5c54748.

📒 Files selected for processing (4)
  • src/main/webapp/app/core/alert/alert-overlay.component.html (1 hunks)
  • src/main/webapp/app/core/alert/alert-overlay.component.scss (2 hunks)
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.html (1 hunks)
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.scss (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.scss
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.html
🧰 Additional context used
📓 Path-based instructions (3)
src/main/webapp/app/**/*.{ts,tsx,html,scss,css}

📄 CodeRabbit inference engine (AGENTS.md)

Place Angular client code in src/main/webapp/app/ with feature modules, shared utilities in app/shared, and assets/translations in content/

Files:

  • src/main/webapp/app/core/alert/alert-overlay.component.html
  • src/main/webapp/app/core/alert/alert-overlay.component.scss
src/main/webapp/app/**/*.component.html

📄 CodeRabbit inference engine (AGENTS.md)

In Angular templates, use built-in control-flow syntax (@if, @for, @switch) and never use legacy structural directives (*ngIf, *ngFor, *ngSwitch)

Files:

  • src/main/webapp/app/core/alert/alert-overlay.component.html
src/main/webapp/**/*.html

⚙️ CodeRabbit configuration file

@if and @for are new and valid Angular syntax replacing *ngIf and *ngFor. They should always be used over the old style.

Files:

  • src/main/webapp/app/core/alert/alert-overlay.component.html
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (10)
  • GitHub Check: Build and Push Docker Image / Build linux/arm64 Docker Image for ls1intum/artemis
  • GitHub Check: Build and Push Docker Image / Build linux/amd64 Docker Image for ls1intum/artemis
  • GitHub Check: Build .war artifact
  • GitHub Check: server-tests
  • GitHub Check: client-tests
  • GitHub Check: client-style
  • GitHub Check: server-style
  • GitHub Check: client-tests-selected
  • GitHub Check: Codacy Static Code Analysis
  • GitHub Check: Analyse
🔇 Additional comments (4)
src/main/webapp/app/core/alert/alert-overlay.component.html (2)

1-31: LGTM — Clean migration to CSS-based animations.

The template correctly:

  • Uses modern @if and @for control flow syntax
  • Wraps animated elements in dedicated animation wrapper divs
  • Applies enter/leave animation classes via Angular's animation directives

The structure aligns well with the SCSS animation definitions.


2-2: animate.enter and animate.leave are valid Angular animation APIs.

animate.enter and animate.leave are special APIs supported directly by the Angular compiler, not directives. These features were introduced in Angular v20.2 and accept either a simple string with spaces for multiple classes or a string array. The syntax shown in your template is correct and has been a stable, documented Angular feature since August 2025.

Likely an incorrect or invalid review comment.

src/main/webapp/app/core/alert/alert-overlay.component.scss (2)

1-85: Well-structured CSS animation implementation.

The animation approach is solid:

  • Separate keyframes for height, margin, and slide transform allow fine-grained control
  • overflow: visible during animation ensures content remains visible while wrapper height expands
  • Different durations for enter (0.35s) vs leave (0.25s) creates nice asymmetric UX
  • The cubic-bezier(0.16, 1, 0.3, 1) timing function provides smooth deceleration

178-183: Responsive selector correctly updated to target the new wrapper.

The media query now correctly targets .alert-animation-wrapper instead of the previous .alert-wrap and .dismiss-all selectors, ensuring the width constraint applies to the animation wrapper at larger screen sizes.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (4)
src/main/webapp/app/iris/overview/base-chatbot/chat-status-bar/chat-status-bar.component.scss (1)

11-11: Good consistency improvement; consider specifying transition properties.

Matching the parent's 0.3s duration creates a more cohesive animation experience. However, using transition: all can impact performance since it monitors every property for changes.

Consider specifying only the properties that actually transition:

-        transition: all 0.3s;
+        transition: max-height 0.3s, min-height 0.3s, padding 0.3s;

This applies to both line 2 (.chat-status-bar) and line 11 (.display) if you'd like to optimize performance across the component.

src/main/webapp/app/iris/overview/services/iris-chat.service.ts (1)

191-201: Verify UX implications of delayed suggestion clearing.

Suggestions are now cleared after the HTTP response succeeds (line 193) rather than before sending the message. This means suggestions remain visible during the HTTP request. Consider whether this delay could confuse users, especially with network latency. Alternatively, if this change was intentional to preserve suggestions on send failures, please confirm this behavior aligns with the desired user experience.

Consider clearing suggestions before the HTTP call for immediate feedback, then restore them only if the request fails:

 public sendMessage(message: string): Observable<undefined> {
     if (!this.sessionId) {
         return throwError(() => new Error('Not initialized'));
     }

     // Trim messages (Spaces, newlines)
     message = message.trim();

     const newMessage = new IrisUserMessage();
     newMessage.content = [new IrisTextMessageContent(message)];
+    const previousSuggestions = this.suggestions.getValue();
+    this.suggestions.next([]);
     return this.irisChatHttpService.createMessage(this.sessionId, newMessage).pipe(
         tap((m) => {
-            this.suggestions.next([]);
             this.replaceOrAddMessage(m.body!);
         }),
         map(() => undefined),
         catchError((error: HttpErrorResponse) => {
+            this.suggestions.next(previousSuggestions);
             this.handleSendHttpError(error);
             return of();
         }),
     );
 }
src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.ts (2)

134-134: Consider clearing animatingMessageIds after animations complete to prevent memory growth.

The animatingMessageIds Set accumulates message IDs indefinitely and is only cleared on session changes. While the memory impact is minimal (storing numbers), this represents unbounded growth. Consider removing message IDs from the Set after their animations complete (typically a few hundred milliseconds).

Apply this approach to clear animation IDs after animations complete:

// In the message tracking section (lines 190-198)
if (this.shouldAnimate) {
    const existingIds = new Set(this.messages?.map((m) => m.id) ?? []);
    messages.forEach((m) => {
        if (m.id && !existingIds.has(m.id)) {
            this.animatingMessageIds.add(m.id);
+           // Clear after animation completes (e.g., 300ms for typical CSS animation)
+           setTimeout(() => this.animatingMessageIds.delete(m.id), 300);
        }
    });
}

171-176: Clarify setTimeout delay for re-enabling animations.

The setTimeout call on line 175 has no explicit delay parameter, defaulting to 0ms (next tick). This means animations are re-enabled almost immediately, before messages actually load. If the intent is to wait for messages to load, consider either:

  • Adding an explicit delay (e.g., 100-200ms), or
  • Moving this logic to the messages subscription handler to enable animations only after messages arrive

Option 1 - Add explicit delay:

-setTimeout(() => (this.shouldAnimate = true));
+setTimeout(() => (this.shouldAnimate = true), 100);

Option 2 - Enable in messages subscription:

 if (this.currentSessionId !== sessionId) {
     this.animatingMessageIds.clear();
     this.shouldAnimate = false;
-    setTimeout(() => (this.shouldAnimate = true));
 }

Then in the messages subscription (after line 199):

 this.messages = _.cloneDeep(messages).reverse();
+// Re-enable animations after messages load following session change
+if (!this.shouldAnimate && messages.length > 0) {
+    this.shouldAnimate = true;
+}
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5c54748 and 86712a4.

📒 Files selected for processing (5)
  • src/main/webapp/app/iris/overview/base-chatbot/chat-status-bar/chat-status-bar.component.scss (1 hunks)
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.html (1 hunks)
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.scss (1 hunks)
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.ts (8 hunks)
  • src/main/webapp/app/iris/overview/services/iris-chat.service.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.scss
🧰 Additional context used
📓 Path-based instructions (9)
src/main/webapp/app/**/*.{ts,tsx,html,scss,css}

📄 CodeRabbit inference engine (AGENTS.md)

Place Angular client code in src/main/webapp/app/ with feature modules, shared utilities in app/shared, and assets/translations in content/

Files:

  • src/main/webapp/app/iris/overview/base-chatbot/chat-status-bar/chat-status-bar.component.scss
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.html
  • src/main/webapp/app/iris/overview/services/iris-chat.service.ts
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.ts
src/main/webapp/app/**/*.component.html

📄 CodeRabbit inference engine (AGENTS.md)

In Angular templates, use built-in control-flow syntax (@if, @for, @switch) and never use legacy structural directives (*ngIf, *ngFor, *ngSwitch)

Files:

  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.html
src/main/webapp/**/*.html

⚙️ CodeRabbit configuration file

@if and @for are new and valid Angular syntax replacing *ngIf and *ngFor. They should always be used over the old style.

Files:

  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.html
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (AGENTS.md)

In TypeScript/JavaScript files, prefer single quotes over double quotes

Files:

  • src/main/webapp/app/iris/overview/services/iris-chat.service.ts
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.ts
src/main/webapp/app/**/*.{component,service,directive,pipe,module}.ts

📄 CodeRabbit inference engine (AGENTS.md)

src/main/webapp/app/**/*.{component,service,directive,pipe,module}.ts: Use PascalCase for Angular class and service names
Use camelCase for Angular class members (properties and methods)

Files:

  • src/main/webapp/app/iris/overview/services/iris-chat.service.ts
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.ts
src/main/webapp/app/**/*.{component,service}.ts

📄 CodeRabbit inference engine (AGENTS.md)

Use Angular Signals for component state and obtain dependencies via inject() function; prohibit legacy decorator-based state patterns and constructor-based dependency injection

Files:

  • src/main/webapp/app/iris/overview/services/iris-chat.service.ts
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.ts
src/main/webapp/app/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

src/main/webapp/app/**/*.{ts,tsx}: Use latest Angular/TypeScript features and avoid null, preferring undefined
Avoid spread operator for objects in TypeScript; prefer explicit property handling
Prefer 100% type safety in TypeScript code

Files:

  • src/main/webapp/app/iris/overview/services/iris-chat.service.ts
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.ts
src/main/webapp/**/*.ts

⚙️ CodeRabbit configuration file

angular_style:https://angular.io/guide/styleguide;methods_in_html:false;lazy_loading:true;code_reuse:true;tests:meaningful;types:PascalCase;enums:PascalCase;funcs:camelCase;props:camelCase;no_priv_prefix:true;strings:single_quotes;localize:true;btns:functionality;links:navigation;icons_text:newline;labels:associate;code_style:arrow_funcs,curly_braces,open_braces_same_line,indent_4;memory_leak_prevention:true;routes:naming_schema;chart_framework:ngx-charts;responsive_layout:true

Files:

  • src/main/webapp/app/iris/overview/services/iris-chat.service.ts
  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.ts
src/main/webapp/app/**/*.component.ts

📄 CodeRabbit inference engine (AGENTS.md)

Use kebab-case for Angular component file names (e.g., course-detail.component.ts)

Files:

  • src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.ts
🧬 Code graph analysis (1)
src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.ts (1)
src/main/webapp/app/iris/overview/services/iris-chat.service.ts (2)
  • sessionId (74-76)
  • sessionId (78-80)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (10)
  • GitHub Check: Codacy Static Code Analysis
  • GitHub Check: Build and Push Docker Image / Build linux/amd64 Docker Image for ls1intum/artemis
  • GitHub Check: Build and Push Docker Image / Build linux/arm64 Docker Image for ls1intum/artemis
  • GitHub Check: Build .war artifact
  • GitHub Check: client-style
  • GitHub Check: server-tests
  • GitHub Check: client-tests
  • GitHub Check: client-tests-selected
  • GitHub Check: server-style
  • GitHub Check: Analyse
🔇 Additional comments (7)
src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.html (2)

171-183: LGTM! Suggestion animation migration implemented correctly.

The migration from Angular animations to CSS animations is well-implemented. The suggestion buttons are properly disabled during loading (line 174), and the spinner feedback when clicking a suggestion (lines 175-179) provides good user experience.


186-190: LGTM! Message animation wrapper correctly configured.

The message animation wrapper properly uses the animate.enter attribute and conditional class binding to control animations based on the animatingMessageIds Set. The transform-origin styling is preserved for proper animation direction.

src/main/webapp/app/iris/overview/base-chatbot/iris-base-chatbot.component.ts (5)

6-6: LGTM! FontAwesome icon added for loading feedback.

The faCircleNotch icon is correctly imported and exposed for use in the template to display a spinner when a suggestion is clicked.

Also applies to: 93-93


190-198: LGTM! New message animation tracking implemented correctly.

The logic properly identifies new messages by comparing existing IDs and marks them for animation only when shouldAnimate is enabled. This ensures initial page loads don't trigger animations.


239-239: LGTM! Clicked suggestion properly reset.

Resetting clickedSuggestion when new suggestions arrive ensures the spinner icon clears correctly and prevents stale state.


256-258: LGTM! Initial animation delay prevents unwanted entrance effects.

The 500ms delay before enabling animations ensures that messages already present on page load don't animate in, which would be jarring UX.


479-485: LGTM! Clicked suggestion tracking implemented correctly.

The clickedSuggestion state properly tracks which suggestion was clicked, enabling the spinner feedback in the template. The flow correctly sets the message content and sends it.

@github-actions
Copy link

End-to-End (E2E) Test Results Summary

TestsPassed ☑️Skipped ⚠️Failed ❌️Time ⏱
End-to-End (E2E) Test Report218 ran214 passed3 skipped1 failed1h 4m 34s 487ms
TestResultTime ⏱
End-to-End (E2E) Test Report
e2e/exercise/programming/ProgrammingExerciseParticipation.spec.ts
ts.Programming exercise participation › Programming exercise team participation › Check team participation › Instructor checks the participation❌ failure9s 298ms

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.scss (2)

28-69: Consider adding prefers-reduced-motion support for accessibility.

Users who are sensitive to motion may experience discomfort with scale animations. Adding a media query to respect this preference is a recommended accessibility practice.

Add this after the keyframe definitions:

@media (prefers-reduced-motion: reduce) {
    .notification-entering > *,
    .notification-leaving > * {
        animation: none;
        opacity: 1;
        transform: scale(1);
    }
}

90-103: Missing Firefox scrollbar hiding.

The ::-webkit-scrollbar pseudo-elements only work in WebKit/Blink browsers. Firefox users will still see the scrollbar.

Add Firefox support:

+.course-notification-popup-overlay {
+    scrollbar-width: none; /* Firefox */
+}
+
 .course-notification-popup-overlay::-webkit-scrollbar {
     background-color: transparent;
     display: none;
 }
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 86712a4 and ef9b22b.

📒 Files selected for processing (6)
  • src/main/webapp/app/communication/answer-post/answer-post.component.html (1 hunks)
  • src/main/webapp/app/communication/answer-post/answer-post.component.scss (1 hunks)
  • src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.html (1 hunks)
  • src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.scss (2 hunks)
  • src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.html (1 hunks)
  • src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.scss (3 hunks)
🚧 Files skipped from review as they are similar to previous changes (5)
  • src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.scss
  • src/main/webapp/app/communication/answer-post/answer-post.component.scss
  • src/main/webapp/app/communication/course-notification/course-notification-overview/course-notification-overview.component.html
  • src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.html
  • src/main/webapp/app/communication/answer-post/answer-post.component.html
🧰 Additional context used
📓 Path-based instructions (1)
src/main/webapp/app/**/*.{ts,tsx,html,scss,css}

📄 CodeRabbit inference engine (AGENTS.md)

Place Angular client code in src/main/webapp/app/ with feature modules, shared utilities in app/shared, and assets/translations in content/

Files:

  • src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.scss
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (10)
  • GitHub Check: server-tests
  • GitHub Check: server-style
  • GitHub Check: client-tests-selected
  • GitHub Check: client-tests
  • GitHub Check: Codacy Static Code Analysis
  • GitHub Check: Build and Push Docker Image / Build linux/amd64 Docker Image for ls1intum/artemis
  • GitHub Check: Build and Push Docker Image / Build linux/arm64 Docker Image for ls1intum/artemis
  • GitHub Check: Build .war artifact
  • GitHub Check: Analyse
  • GitHub Check: submit-gradle

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.scss (1)

7-9: Consider aligning transition timing with animation duration.

The wrapper transitions use 0.4s while the enter/leave animations (lines 33, 54) use 0.2s. This timing mismatch means notifications will finish scaling in/out before they finish repositioning, which could feel slightly disjointed.

Consider standardizing both to 0.2s for snappier, more synchronized motion:

     transition:
-        opacity 0.4s ease-out,
-        bottom 0.4s ease-in-out;
+        opacity 0.2s ease-out,
+        bottom 0.2s ease-in-out;
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ef9b22b and e7a5d68.

📒 Files selected for processing (1)
  • src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.scss (4 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
src/main/webapp/app/**/*.{ts,tsx,html,scss,css}

📄 CodeRabbit inference engine (AGENTS.md)

Place Angular client code in src/main/webapp/app/ with feature modules, shared utilities in app/shared, and assets/translations in content/

Files:

  • src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.scss
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (8)
  • GitHub Check: Codacy Static Code Analysis
  • GitHub Check: Build and Push Docker Image / Build linux/arm64 Docker Image for ls1intum/artemis
  • GitHub Check: Build and Push Docker Image / Build linux/amd64 Docker Image for ls1intum/artemis
  • GitHub Check: Build .war artifact
  • GitHub Check: client-tests
  • GitHub Check: server-tests
  • GitHub Check: Analyse
  • GitHub Check: submit-gradle
🔇 Additional comments (7)
src/main/webapp/app/communication/course-notification/course-notification-popup-overlay/course-notification-popup-overlay.component.scss (7)

28-46: LGTM! Well-structured enter animation.

The scale-in animation is properly implemented with correct initial state, keyframes, and fill-mode. The comment about Angular's animationend detection is helpful for maintainability.


48-67: LGTM! Proper leave animation with good UX considerations.

The scale-out animation is correctly implemented with pointer-events: none to prevent interaction during exit. The ease-in timing complements the ease-out enter animation.


69-91: LGTM! Proper pointer-events pattern for overlay UX.

The changes to height, overflow, and pointer-events work well together: overflow: visible enables the stacking effect, while the pointer-events pattern ensures clicks only interact with actual notifications, not empty overlay space.


108-111: LGTM! Clear delegation to animation wrapper.

The comment clearly documents that positioning is now handled by .notification-animation-wrapper, making the architectural change explicit.


124-126: LGTM! Good use of aspect-ratio for circular buttons.

The aspect-ratio: 1 property ensures buttons remain perfectly circular. Note that this requires modern browsers (Chrome 88+, Firefox 89+, Safari 15+), which should be acceptable for this Angular application.


129-144: LGTM! Properly adapted for wrapper-based architecture.

The expanded state correctly targets .notification-animation-wrapper and the 0.5s delay on the collapse button's opacity transition provides good UX sequencing—notifications appear before the collapse controls.


12-26: The nth-last-child stacking logic is safe and does not create harmful DOM coupling.

The collapse element is unconditionally rendered after the notification loop in the template, guaranteeing it is always the last child. The nth-last-child selectors (2, 3, 4) reliably target the last three notifications. Notifications beyond the 3rd position correctly fall back to the default bottom: 1.5rem defined on line 5, which is intentional cascading behavior. No changes are needed.

@github-actions
Copy link

End-to-End (E2E) Test Results Summary

TestsPassed ✅SkippedFailedTime ⏱
End-to-End (E2E) Test Report1 ran1 passed0 skipped0 failed1s 468ms
TestResultTime ⏱
No test annotations available

@github-actions github-actions bot added the server Pull requests that update Java code. (Added Automatically!) label Dec 17, 2025
@github-actions
Copy link

End-to-End (E2E) Test Results Summary

TestsPassed ✅SkippedFailedTime ⏱
End-to-End (E2E) Test Report1 ran1 passed0 skipped0 failed1s 573ms
TestResultTime ⏱
No test annotations available

@bassner bassner force-pushed the chore/angular-animation branch from e4b4330 to 41c07da Compare December 17, 2025 15:56
@github-actions github-actions bot removed the server Pull requests that update Java code. (Added Automatically!) label Dec 17, 2025
@krusche krusche merged commit 632be66 into develop Dec 17, 2025
30 of 47 checks passed
@krusche krusche deleted the chore/angular-animation branch December 17, 2025 16:22
@github-project-automation github-project-automation bot moved this from Ready For Review to Merged in Artemis Development Dec 17, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

atlas Pull requests that affect the corresponding module client Pull requests that update TypeScript code. (Added Automatically!) communication Pull requests that affect the corresponding module core Pull requests that affect the corresponding module exam Pull requests that affect the corresponding module exercise Pull requests that affect the corresponding module iris Pull requests that affect the corresponding module lecture Pull requests that affect the corresponding module programming Pull requests that affect the corresponding module tests

Projects

Status: Merged

Development

Successfully merging this pull request may close these issues.

4 participants