Skip to content

Conversation

@marlonnienaber
Copy link
Contributor

@marlonnienaber marlonnienaber commented Oct 28, 2025

Checklist

General

Server

  • Important: I implemented the changes with a very good performance and prevented too many (unnecessary) and too complex database calls.
  • I strictly followed the principle of data economy for all database calls.
  • I strictly followed the server coding and design guidelines.
  • I added multiple integration tests (Spring) related to the features (with a high test coverage).
  • I added pre-authorization annotations according to the guidelines and checked the course groups for all new REST Calls (security).
  • I documented the Java code using JavaDoc style.

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 principle of data economy for all client-server REST calls.
  • I strictly followed the client coding.
  • I added multiple integration tests (Jest) related to the features (with a high test coverage), while following the test guidelines.
  • I added authorities to all new routes and checked the course groups for displaying navigation elements (links, buttons).
  • I added multiple screenshots/screencasts of my UI changes.
  • I translated all newly inserted strings into English and German.

Motivation and Context

Currently we have no dedicated way to distribute tutorial contents. In the courses of the chair we usually repurpose lectures for this purpose which is not the best UX.

With this PR we would like to enable instructors and editors to mark lectures as so-called tutorial lectures. Tutorial lectures do not appear in the lecture tab of the student view. Instead they are part of the tutorial groups tab. There is also no channel displayed for tutorial lectures in the communications tab, nor is there a chat section in the detail view of a tutorial lecture. Besides this, tutorial lectures provide the same functionality as normal lectures.

Description

The following code changes were made on the client:

  • I adjusted the tutorial groups tab such that it includes tutorial lectures.
  • I removed the communications section from the detail view of tutorial lectures.
  • I extended the UI of the lecture creation/update page with a checkbox that allows users to mark or unmark a lecture as a tutorial lecture
  • I adjusted the communications tab such that it does not display tutorial lecture channels

The following code changes were made on the server:

  • I added one new endpoints (returns all tutorial lectures for a course)
  • I adapted server code that uses lectures to treat the new flag correctly

Steps for Testing

Prerequisites:

  • 1 Instructor
  • A course with one tutorial group
  1. Create two tutorial lectures. Make sure that at least one of them has a start date before now and an end date after now.
  2. Verify that the tutorial lectures are displayed in the tutorial group tab of the student view together with the tutorial group
  3. Verify that a lecture is displayed in the accordion titles "Current Lesson". This should be a lecture which has started in the past and has not yet ended. If you created multiple of such lectures, it should be the one that started latest.
  4. Verify that in the detail view of the tutorial group, there is a button in the top right that links to the current lesson
  5. Verify that there is no communication section the detail view of the tutorial lectures.
  6. Verify that there are no channels for the tutorial lectures in the communications tab of the student view.

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

Client

Class/File Line Coverage Confirmation (assert/expect)
create-course-competency.component.ts 100%
edit-course-competency.component.ts 96%
course-overview.service.ts 93.3%
lecture-period.component.ts 100%
lecture-series-create.component.ts 98.07%
lecture-update.component.ts 91.23%
lecture.service.ts 96.15%
course-lectures.component.ts 91.13%
sidebar-card.directive.ts 96.96%
sidebar-event.service.ts 100%
sidebar-card-medium.component.ts 96%
sidebar.component.ts 91.86%
course-tutorial-group-detail.component.ts 93.54%
course-tutorial-groups.component.ts 92.74%

Server

Class/File Line Coverage Confirmation (assert/expect)
LectureResource.java 91%
LectureService.java 95%

Screenshots

image

Summary by CodeRabbit

  • New Features

    • Tutorial lectures: new lecture type with checkbox, dedicated list endpoint, route, and quick-link from tutorial group details.
  • Bug Fixes

    • Channel, ingestion and chat features now ignore tutorial lectures to prevent unintended processing or UI actions.
  • Improvements

    • Sidebar, course overview and navbar updated with tutorial-lecture categories, routing/sub-route support and revised translations.
    • Removed long-lecture warning UI and related indicators.

@github-project-automation github-project-automation bot moved this to Work In Progress in Artemis Development Oct 28, 2025
@github-actions github-actions bot added tests server Pull requests that update Java code. (Added Automatically!) client Pull requests that update TypeScript code. (Added Automatically!) database Pull requests that update the database. (Added Automatically!). Require a CRITICAL deployment. core Pull requests that affect the corresponding module iris Pull requests that affect the corresponding module lecture Pull requests that affect the corresponding module tutorialgroup Pull requests that affect the corresponding module labels Oct 28, 2025
@marlonnienaber marlonnienaber changed the title Feature/tutorial groups/tutorial lectures Tutorial groups: Introduce tutorial group lectures Oct 28, 2025
@github-actions github-actions bot added the atlas Pull requests that affect the corresponding module label Nov 3, 2025
@ls1intum ls1intum deleted a comment from github-actions bot Nov 3, 2025
@ls1intum ls1intum deleted a comment from github-actions bot Nov 3, 2025
@helios-aet helios-aet bot temporarily deployed to artemis-test4.artemis.cit.tum.de November 18, 2025 11:36 Inactive
@helios-aet helios-aet bot temporarily deployed to artemis-test6.artemis.cit.tum.de November 18, 2025 13:24 Inactive
@marlonnienaber marlonnienaber temporarily deployed to artemis-test2.artemis.cit.tum.de November 18, 2025 13:31 — with GitHub Actions Inactive
@helios-aet helios-aet bot temporarily deployed to artemis-test4.artemis.cit.tum.de November 18, 2025 14:30 Inactive
Copy link

@ValentinHerrmann ValentinHerrmann left a comment

Choose a reason for hiding this comment

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

Tested again on TS4. Breadcrumbs (and everything that worked before) are working, and my other requests are out of scope for this PR. For the future, an indicator (without opening the edit view) if a lecture is a tutorial-lecture would be nice.

Copy link
Collaborator

@MaximilianAnzinger MaximilianAnzinger left a comment

Choose a reason for hiding this comment

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

I'd suggest resolving the merge conflicts first and then continue the reviewing process. Otherwise all the approvals will drop again.

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/lecture/manage/lecture-update/lecture-update.component.ts (1)

163-166: Consider using immutable update pattern for signal.

The effect directly mutates this.lecture().isTutorialLecture, which bypasses signal immutability. While this pattern appears in the codebase, using this.lecture.update() would be more aligned with Angular signals best practices.

 effect(() => {
-    this.lecture().isTutorialLecture = this.isTutorialLecture();
+    this.lecture.update(lecture => ({ ...lecture, isTutorialLecture: this.isTutorialLecture() }));
     this.updateIsChangesMadeToTitleOrPeriodSection();
 });
📜 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 9bbed83 and 460efed.

⛔ Files ignored due to path filters (1)
  • src/main/resources/config/liquibase/master.xml is excluded by !**/*.xml
📒 Files selected for processing (10)
  • src/main/java/de/tum/cit/aet/artemis/lecture/domain/Lecture.java (3 hunks)
  • src/main/java/de/tum/cit/aet/artemis/lecture/repository/LectureRepository.java (2 hunks)
  • src/main/java/de/tum/cit/aet/artemis/lecture/web/LectureResource.java (2 hunks)
  • src/main/java/de/tum/cit/aet/artemis/lecture/web/LectureUnitResource.java (1 hunks)
  • src/main/webapp/app/core/course/overview/courses.route.ts (1 hunks)
  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.spec.ts (1 hunks)
  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts (8 hunks)
  • src/main/webapp/i18n/de/lecture.json (1 hunks)
  • src/main/webapp/i18n/en/lecture.json (1 hunks)
  • src/test/java/de/tum/cit/aet/artemis/lecture/LectureIntegrationTest.java (3 hunks)
🚧 Files skipped from review as they are similar to previous changes (6)
  • src/test/java/de/tum/cit/aet/artemis/lecture/LectureIntegrationTest.java
  • src/main/java/de/tum/cit/aet/artemis/lecture/web/LectureUnitResource.java
  • src/main/java/de/tum/cit/aet/artemis/lecture/domain/Lecture.java
  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.spec.ts
  • src/main/webapp/app/core/course/overview/courses.route.ts
  • src/main/java/de/tum/cit/aet/artemis/lecture/web/LectureResource.java
🧰 Additional context used
📓 Path-based instructions (3)
src/main/java/**/*.java

⚙️ CodeRabbit configuration file

naming:CamelCase; principles:{single_responsibility,small_methods,no_duplication}; db:{perf_queries,datetime_not_timestamp}; rest:{stateless,singleton,delegate_logic,http_only,minimal_dtos}; dtos:{java_records,no_entities,min_data,single_resp}; di:constructor_injection; kiss:simple_code; file_handling:os_indep_paths; practices:{least_access,avoid_transactions,code_reuse,static_member_ref,prefer_primitives}; sql:{param_annotation,uppercase,avoid_subqueries};java:avoid_star_imports

Files:

  • src/main/java/de/tum/cit/aet/artemis/lecture/repository/LectureRepository.java
src/main/webapp/i18n/de/**/*.json

⚙️ CodeRabbit configuration file

German language translations should be informal (dutzen) and should never be formal (sietzen). So the user should always be addressed with "du/dein" and never with "sie/ihr".

Files:

  • src/main/webapp/i18n/de/lecture.json
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-update/lecture-update.component.ts
🧠 Learnings (30)
📓 Common learnings
Learnt from: Strohgelaender
Repo: ls1intum/Artemis PR: 8574
File: src/main/java/de/tum/in/www1/artemis/service/tutorialgroups/TutorialGroupService.java:0-0
Timestamp: 2024-10-08T15:35:42.972Z
Learning: The `tryToFindMatchingUsers` method in `TutorialGroupService.java` has been updated to skip registrations without a student, enhancing the method's robustness. This change was implemented in commit `bef30f9751de0913143e8cb28cc0088264052261`.
📚 Learning: 2025-09-20T16:43:32.823Z
Learnt from: MoritzSpengler
Repo: ls1intum/Artemis PR: 11382
File: src/main/java/de/tum/cit/aet/artemis/quiz/service/QuizQuestionProgressService.java:130-137
Timestamp: 2025-09-20T16:43:32.823Z
Learning: The findAllDueQuestions method exists in QuizQuestionRepository and accepts Set<Long> ids, Long courseId, and Pageable parameters, returning Page<QuizQuestion>. The method has a Query annotation that filters by courseId, isOpenForPractice = TRUE, and excludes questions with IDs in the provided set using NOT IN.

Applied to files:

  • src/main/java/de/tum/cit/aet/artemis/lecture/repository/LectureRepository.java
📚 Learning: 2025-09-20T16:43:32.823Z
Learnt from: MoritzSpengler
Repo: ls1intum/Artemis PR: 11382
File: src/main/java/de/tum/cit/aet/artemis/quiz/service/QuizQuestionProgressService.java:130-137
Timestamp: 2025-09-20T16:43:32.823Z
Learning: The findAllDueQuestions method exists in QuizQuestionRepository and accepts Set<Long> ids, Long courseId, and Pageable parameters, returning Page<QuizQuestion>. This method is properly implemented and available for use in QuizQuestionProgressService.

Applied to files:

  • src/main/java/de/tum/cit/aet/artemis/lecture/repository/LectureRepository.java
📚 Learning: 2025-10-10T13:22:16.754Z
Learnt from: marlonnienaber
Repo: ls1intum/Artemis PR: 11436
File: src/main/java/de/tum/cit/aet/artemis/iris/web/IrisLectureChatSessionResource.java:79-81
Timestamp: 2025-10-10T13:22:16.754Z
Learning: The `visibleDate` property of the `Lecture` entity in the Artemis codebase is deprecated and no longer supported. Visibility checks based on `lecture.isVisibleToStudents()` or `lecture.getVisibleDate()` should not be flagged as missing security controls, as this functionality has been intentionally removed across the codebase (tracked in issue #11479).

Applied to files:

  • src/main/java/de/tum/cit/aet/artemis/lecture/repository/LectureRepository.java
  • src/main/webapp/i18n/en/lecture.json
  • src/main/webapp/i18n/de/lecture.json
📚 Learning: 2024-10-08T15:35:42.972Z
Learnt from: Strohgelaender
Repo: ls1intum/Artemis PR: 8574
File: src/main/java/de/tum/in/www1/artemis/service/tutorialgroups/TutorialGroupService.java:0-0
Timestamp: 2024-10-08T15:35:42.972Z
Learning: The `tryToFindMatchingUsers` method in `TutorialGroupService.java` has been updated to skip registrations without a student, enhancing the method's robustness. This change was implemented in commit `bef30f9751de0913143e8cb28cc0088264052261`.

Applied to files:

  • src/main/java/de/tum/cit/aet/artemis/lecture/repository/LectureRepository.java
📚 Learning: 2025-10-10T13:22:13.454Z
Learnt from: marlonnienaber
Repo: ls1intum/Artemis PR: 11436
File: src/main/java/de/tum/cit/aet/artemis/iris/web/IrisLectureChatSessionResource.java:138-140
Timestamp: 2025-10-10T13:22:13.454Z
Learning: In the IrisLectureChatSessionResource.java file, the checkWhetherLectureIsVisibleToStudentsElseThrow visibility checks are intentionally commented out as part of deprecating the Lecture.visibleDate property. This deprecation is temporary to monitor user feedback before full removal (tracked in issue #11479).

Applied to files:

  • src/main/java/de/tum/cit/aet/artemis/lecture/repository/LectureRepository.java
📚 Learning: 2025-09-18T20:55:38.115Z
Learnt from: marlonnienaber
Repo: ls1intum/Artemis PR: 11350
File: src/main/java/de/tum/cit/aet/artemis/tutorialgroup/repository/TutorialGroupRepository.java:145-168
Timestamp: 2025-09-18T20:55:38.115Z
Learning: In tutorial groups, every TutorialGroup is guaranteed to have a teachingAssistant (non-null constraint), so teaching assistant associations don't require LEFT JOINs in JPQL queries. Only optional associations like tutorialGroupSchedule and tutorialGroupChannel need LEFT JOINs.

Applied to files:

  • src/main/java/de/tum/cit/aet/artemis/lecture/repository/LectureRepository.java
📚 Learning: 2025-05-24T16:06:41.454Z
Learnt from: tobias-lippert
Repo: ls1intum/Artemis PR: 10812
File: src/main/java/de/tum/cit/aet/artemis/atlas/repository/CompetencyRepository.java:70-88
Timestamp: 2025-05-24T16:06:41.454Z
Learning: In CompetencyRepository JPQL queries that join from LearningPath to course competencies, DISTINCT is not necessary because a learning path belongs to exactly one course, preventing duplicate competencies in the result set.

Applied to files:

  • src/main/java/de/tum/cit/aet/artemis/lecture/repository/LectureRepository.java
📚 Learning: 2025-09-05T15:13:32.171Z
Learnt from: MoritzSpengler
Repo: ls1intum/Artemis PR: 11345
File: src/main/java/de/tum/cit/aet/artemis/quiz/repository/QuizTrainingLeaderboardRepository.java:22-23
Timestamp: 2025-09-05T15:13:32.171Z
Learning: The derived query method name `findByLeagueAndCourseIdOrderByScoreDescUserAscId` in QuizTrainingLeaderboardRepository correctly references the `user` entity field directly in the OrderBy clause, not requiring `userId`. Spring Data JPA supports sorting by entity references directly in derived query method names.

Applied to files:

  • src/main/java/de/tum/cit/aet/artemis/lecture/repository/LectureRepository.java
📚 Learning: 2025-09-27T19:02:50.543Z
Learnt from: tobias-lippert
Repo: ls1intum/Artemis PR: 11400
File: src/main/webapp/i18n/de/nebula.json:4-4
Timestamp: 2025-09-27T19:02:50.543Z
Learning: German translations in Artemis should use informal language (du/dein) rather than formal language (Sie/Ihr), as confirmed by maintainer tobias-lippert. This applies to all German i18n files in src/main/webapp/i18n/de/.

Applied to files:

  • src/main/webapp/i18n/de/lecture.json
📚 Learning: 2024-11-02T22:57:57.717Z
Learnt from: florian-glombik
Repo: ls1intum/Artemis PR: 9656
File: src/main/webapp/app/lecture/lecture-unit/lecture-unit-management/attachment-unit-form/attachment-unit-form.component.ts:69-71
Timestamp: 2024-11-02T22:57:57.717Z
Learning: In the `src/main/webapp/app/lecture/lecture-unit/lecture-unit-management/attachment-unit-form/attachment-unit-form.component.ts`, the `isFormValid` computed property intentionally uses a logical OR between `this.statusChanges() === 'VALID'` and `this.fileName()` to mirror the original `isSubmitPossible` getter, ensuring consistent form validation behavior.

Applied to files:

  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts
📚 Learning: 2025-10-10T17:12:35.471Z
Learnt from: marlonnienaber
Repo: ls1intum/Artemis PR: 11436
File: src/main/webapp/app/lecture/manage/lecture-series-create/lecture-series-create.component.ts:356-361
Timestamp: 2025-10-10T17:12:35.471Z
Learning: In the LectureSeriesCreateComponent (src/main/webapp/app/lecture/manage/lecture-series-create/lecture-series-create.component.ts), the rawExistingLectures input contains only persisted Lecture entities from the database, so their id field is guaranteed to be non-null despite the Lecture type having id?: number. The cast to ExistingLecture at line 359 is therefore safe.

Applied to files:

  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts
📚 Learning: 2024-10-20T21:59:11.630Z
Learnt from: pzdr7
Repo: ls1intum/Artemis PR: 9505
File: src/main/webapp/app/exercises/programming/shared/code-editor/monaco/code-editor-monaco.component.html:9-9
Timestamp: 2024-10-20T21:59:11.630Z
Learning: In Angular templates within the Artemis project (e.g., `src/main/webapp/app/exercises/programming/shared/code-editor/monaco/code-editor-monaco.component.html`), properties like `selectedFile()`, `readOnlyManualFeedback()`, `highlightDifferences()`, and `course()` are signals. It is appropriate to call these signals directly in the template.

Applied to files:

  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts
📚 Learning: 2025-06-17T15:07:38.659Z
Learnt from: marlonnienaber
Repo: ls1intum/Artemis PR: 11017
File: src/main/webapp/app/lecture/overview/course-lectures/details/course-lecture-details.component.html:12-21
Timestamp: 2025-06-17T15:07:38.659Z
Learning: In the lecture detail header (course-lecture-details.component.html), the margin utility "my-2" is used instead of "mb-0" (like in exercise details) for intentional layout reasons, as clarified by marlonnienaber.

Applied to files:

  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts
📚 Learning: 2025-08-21T17:30:20.530Z
Learnt from: MoritzSpengler
Repo: ls1intum/Artemis PR: 11297
File: src/main/webapp/app/quiz/shared/questions/drag-and-drop-question/drag-and-drop-question.component.spec.ts:34-34
Timestamp: 2025-08-21T17:30:20.530Z
Learning: FitTextDirective in src/main/webapp/app/quiz/shared/fit-text/fit-text.directive.ts is a standalone directive marked with standalone: true, so it should be imported in TestBed imports array, not declarations array.

Applied to files:

  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts
📚 Learning: 2024-10-08T15:35:42.972Z
Learnt from: iyannsch
Repo: ls1intum/Artemis PR: 9379
File: src/main/webapp/app/shared/components/code-button/code-button.component.ts:143-170
Timestamp: 2024-10-08T15:35:42.972Z
Learning: In `code-button.component.ts`, `this.exercise.id` is checked before use, so it's acceptable to use the non-null assertion operator `!` on `this.exercise.id!`.

Applied to files:

  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts
📚 Learning: 2024-10-08T18:07:58.425Z
Learnt from: iyannsch
Repo: ls1intum/Artemis PR: 9379
File: src/main/webapp/app/shared/components/code-button/code-button.component.ts:364-372
Timestamp: 2024-10-08T18:07:58.425Z
Learning: In the `initTheia` method of `CodeButtonComponent` (`code-button.component.ts`), removing the null check for `this.exercise` inside the `subscribe` callback causes a compile-time error, so it should be kept.

Applied to files:

  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts
📚 Learning: 2025-08-08T22:22:20.043Z
Learnt from: SamuelRoettgermann
Repo: ls1intum/Artemis PR: 11111
File: src/main/webapp/app/core/admin/exam-rooms/exam-rooms.component.ts:70-79
Timestamp: 2025-08-08T22:22:20.043Z
Learning: In the Artemis Angular components (such as `exam-rooms.component.ts`), error handling for data loading failures can be implemented by setting the data signal to `undefined`. The template then automatically displays appropriate error messages through conditional rendering with if/else blocks and translation keys, without requiring explicit error status management in the component logic.

Applied to files:

  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts
📚 Learning: 2024-08-01T09:26:26.610Z
Learnt from: rabeatwork
Repo: ls1intum/Artemis PR: 9112
File: src/main/webapp/app/exam/participate/exam-bar/exam-bar.component.ts:45-50
Timestamp: 2024-08-01T09:26:26.610Z
Learning: In the context of PR ls1intum/Artemis#9112, avoid using non-null assertions and instead use nullish coalescing operators to provide default values.

Applied to files:

  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts
📚 Learning: 2025-08-19T19:26:01.232Z
Learnt from: MoritzSpengler
Repo: ls1intum/Artemis PR: 11297
File: src/main/webapp/app/quiz/shared/questions/multiple-choice-question/visual-question/multiple-choice-visual-question.component.ts:84-86
Timestamp: 2025-08-19T19:26:01.232Z
Learning: In Angular signals migration, calling a signal function like `this.question()` returns a reference to the actual object, not a copy. Direct mutations of properties on the returned object (like `this.question().answerOptions?.push(...)`) do modify the original data, though this violates signal immutability principles.

Applied to files:

  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts
📚 Learning: 2024-07-09T19:07:38.801Z
Learnt from: florian-glombik
Repo: ls1intum/Artemis PR: 8858
File: src/main/webapp/app/shared/exercise-filter/exercise-filter-modal.component.ts:185-188
Timestamp: 2024-07-09T19:07:38.801Z
Learning: For the PR ls1intum/Artemis#8858, avoid suggesting moving assignments out of expressions within the `resetFilter` method in `exercise-filter-modal.component.ts`.

Applied to files:

  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts
📚 Learning: 2024-07-09T19:08:59.795Z
Learnt from: florian-glombik
Repo: ls1intum/Artemis PR: 8858
File: src/main/webapp/app/shared/sidebar/sidebar.component.ts:0-0
Timestamp: 2024-07-09T19:08:59.795Z
Learning: In the context of PR ls1intum/Artemis#8858, avoid suggesting the removal of non-null assertions.

Applied to files:

  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts
📚 Learning: 2024-10-08T15:35:48.768Z
Learnt from: florian-glombik
Repo: ls1intum/Artemis PR: 8858
File: src/test/javascript/spec/component/shared/exercise-filter/exercise-filter-modal.component.spec.ts:201-225
Timestamp: 2024-10-08T15:35:48.768Z
Learning: Non-null assertions should not be flagged or suggested for removal in the context of PR ls1intum/Artemis#8858.

Applied to files:

  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts
📚 Learning: 2024-07-09T19:06:18.665Z
Learnt from: florian-glombik
Repo: ls1intum/Artemis PR: 8858
File: src/main/webapp/app/shared/exercise-filter/exercise-filter-modal.component.ts:97-111
Timestamp: 2024-07-09T19:06:18.665Z
Learning: In the context of PR ls1intum/Artemis#8858, non-null assertions should not be flagged or suggested for removal.

Applied to files:

  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts
📚 Learning: 2025-05-27T15:39:30.592Z
Learnt from: eylulnc
Repo: ls1intum/Artemis PR: 10910
File: src/main/webapp/app/core/user/settings/global-notifications-settings/global-notifications-settings.component.ts:101-101
Timestamp: 2025-05-27T15:39:30.592Z
Learning: In Angular components, constants defined at module level (even if exported) are not accessible in templates. To use constants in templates for conditional rendering or comparisons, they must be assigned to a protected or public property of the component class, like `protected readonly CONSTANT_NAME = CONSTANT_NAME;`.

Applied to files:

  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts
📚 Learning: 2025-08-15T02:30:19.063Z
Learnt from: SamuelRoettgermann
Repo: ls1intum/Artemis PR: 11111
File: src/main/webapp/app/core/admin/exam-rooms/exam-rooms.component.ts:148-152
Timestamp: 2025-08-15T02:30:19.063Z
Learning: In Artemis Angular components, the DeleteDialogService uses an EventEmitter-based pattern rather than direct Observable subscription. The correct usage is: 1) Create an EventEmitter<{ [key: string]: boolean }>, 2) Subscribe to the emitter to perform the actual delete operation, 3) Call deleteDialogService.openDeleteDialog() with a configuration object containing the emitter, deleteQuestion translation key, buttonType, actionType, dialogError observable, and other options. The service handles the dialog lifecycle and emits through the provided emitter when the user confirms the deletion.

Applied to files:

  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts
📚 Learning: 2024-10-28T11:34:03.750Z
Learnt from: isabellagessl
Repo: ls1intum/Artemis PR: 9615
File: src/main/webapp/app/overview/exercise-details/course-exercise-details.module.ts:75-75
Timestamp: 2024-10-28T11:34:03.750Z
Learning: In Angular, when a non-standalone component declared in an NgModule needs to use a standalone component, the standalone component should be imported into the NgModule's `imports` array. This allows the non-standalone component to utilize the standalone component in its template.

Applied to files:

  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts
📚 Learning: 2025-09-01T10:20:40.706Z
Learnt from: Michael-Breu-UIbk
Repo: ls1intum/Artemis PR: 10989
File: src/main/webapp/app/programming/manage/detail/programming-exercise-detail.component.with-sharing.spec.ts:132-149
Timestamp: 2025-09-01T10:20:40.706Z
Learning: In the Artemis codebase, Angular component test files for ProgrammingExerciseDetailComponent follow a pattern where the component is imported but not explicitly declared in TestBed.configureTestingModule(), yet TestBed.createComponent() still works successfully. This pattern is consistently used across test files like programming-exercise-detail.component.spec.ts and programming-exercise-detail.component.with-sharing.spec.ts.

Applied to files:

  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts
📚 Learning: 2025-04-22T10:19:41.546Z
Learnt from: tobias-lippert
Repo: ls1intum/Artemis PR: 10714
File: src/main/webapp/app/quiz/manage/create-buttons/quiz-exercise-create-buttons.component.ts:11-15
Timestamp: 2025-04-22T10:19:41.546Z
Learning: In Angular 19, standalone components are the default, so components with an `imports` array don't need to explicitly declare `standalone: true` property in the component decorator.

Applied to files:

  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts
📚 Learning: 2024-10-04T15:18:01.419Z
Learnt from: pzdr7
Repo: ls1intum/Artemis PR: 9407
File: src/main/webapp/app/shared/monaco-editor/monaco-diff-editor.component.ts:48-52
Timestamp: 2024-10-04T15:18:01.419Z
Learning: In Angular components, effects created using the `effect()` function are automatically disposed when the component is destroyed, so manual cleanup in `ngOnDestroy` is not necessary.

Applied to files:

  • src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts
🧬 Code graph analysis (1)
src/main/java/de/tum/cit/aet/artemis/lecture/repository/LectureRepository.java (1)
src/main/webapp/app/lecture/manage/services/lecture.service.ts (1)
  • findAllTutorialLecturesByCourseId (90-100)
⏰ 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). (13)
  • GitHub Check: Codacy Static Code Analysis
  • GitHub Check: client-style
  • GitHub Check: server-style
  • GitHub Check: client-tests
  • GitHub Check: server-tests
  • GitHub Check: client-tests-selected
  • 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: bean-instantiation-check
  • GitHub Check: Analyse
  • GitHub Check: bean-instantiation-check
  • GitHub Check: Analyse
🔇 Additional comments (6)
src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts (2)

177-179: LGTM: Proper nullish coalescing.

The nullish coalescing operator ensures the signal always receives a boolean value, preventing undefined propagation. This correctly addresses the past review feedback.


229-230: LGTM: Change detection and tooltip implementation.

The isTutorialLecture field is correctly integrated into change detection logic, and the tooltip method properly tracks locale changes by calling this.currentLocale() within the computed function.

Also applies to: 400-403

src/main/webapp/i18n/en/lecture.json (1)

94-98: LGTM: Clear and accurate English translations.

The tutorial lecture translations are clear, grammatically correct, and provide appropriate context for users.

src/main/webapp/i18n/de/lecture.json (1)

94-98: LGTM: German translations follow informal style.

The German translations correctly use informal language where applicable and are clear and accurate.

src/main/java/de/tum/cit/aet/artemis/lecture/repository/LectureRepository.java (2)

48-48: LGTM! Tutorial lecture filtering correctly applied.

The addition of AND NOT lecture.isTutorialLecture correctly excludes tutorial lectures from calendar events, aligning with the PR objective that tutorial lectures should appear in the tutorial groups tab rather than the student lecture tab.


76-81: Code is correct—no eager loading variant needed.

The query properly returns tutorial lectures without eager loading. Verification shows that only basic lecture properties (title, id, isTutorialLecture, startDate) are accessed when displaying tutorials in the UI. The mapLectureToSidebarCardElement method and component caching logic never access associations like lectureUnits or attachments, so there is no N+1 query risk.

The implementation follows the repository's consistent pattern of providing simple queries for cases where associations are not required.

coderabbitai[bot]
coderabbitai bot previously approved these changes Nov 19, 2025
@github-actions
Copy link

End-to-End (E2E) Test Results Summary

TestsPassed ✅Skipped ⚠️FailedTime ⏱
End-to-End (E2E) Test Report205 ran202 passed3 skipped0 failed1h 6m 42s 117ms
TestResultTime ⏱
No test annotations available

Yhmidi
Yhmidi previously approved these changes Nov 21, 2025
Copy link
Contributor

@Yhmidi Yhmidi left a comment

Choose a reason for hiding this comment

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

Code

Copy link
Contributor

@rabeatwork rabeatwork left a comment

Choose a reason for hiding this comment

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

re-approve

Copy link
Contributor

@Yhmidi Yhmidi left a comment

Choose a reason for hiding this comment

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

Code re-approval

Copy link

@ValentinHerrmann ValentinHerrmann left a comment

Choose a reason for hiding this comment

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

re-approve without testing based on re-approves by @rabeatwork and @Yhmidi

@github-actions
Copy link

End-to-End (E2E) Test Results Summary

TestsPassed ☑️Skipped ⚠️Failed ❌️Time ⏱
End-to-End (E2E) Test Report215 ran211 passed3 skipped1 failed1h 11m 50s 472ms
TestResultTime ⏱
End-to-End (E2E) Test Report
e2e/exam/ExamParticipation.spec.ts
ts.Exam participation › Early hand-in with continue and reload page › Participates in the exam, hand-in early, but instead continues❌ failure56s 991ms

@krusche krusche added this to the 8.5.1 milestone Nov 22, 2025
@krusche krusche merged commit d0cdb40 into develop Nov 22, 2025
30 of 33 checks passed
@krusche krusche deleted the feature/tutorial-groups/tutorial-lectures branch November 22, 2025 08:44
@github-project-automation github-project-automation bot moved this from Ready For Review to Merged in Artemis Development Nov 22, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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 database Pull requests that update the database. (Added Automatically!). Require a CRITICAL deployment. iris Pull requests that affect the corresponding module lecture Pull requests that affect the corresponding module ready for review server Pull requests that update Java code. (Added Automatically!) tests tutorialgroup Pull requests that affect the corresponding module

Projects

Status: Merged

Development

Successfully merging this pull request may close these issues.