-
Notifications
You must be signed in to change notification settings - Fork 350
Tutorial groups: Introduce tutorial lectures
#11552
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Tutorial groups: Introduce tutorial group lectures
ValentinHerrmann
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
MaximilianAnzinger
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd suggest resolving the merge conflicts first and then continue the reviewing process. Otherwise all the approvals will drop again.
460efed
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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, usingthis.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
⛔ Files ignored due to path filters (1)
src/main/resources/config/liquibase/master.xmlis 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
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.javasrc/main/webapp/i18n/en/lecture.jsonsrc/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
isTutorialLecturefield is correctly integrated into change detection logic, and the tooltip method properly tracks locale changes by callingthis.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.isTutorialLecturecorrectly 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. ThemapLectureToSidebarCardElementmethod and component caching logic never access associations likelectureUnitsorattachments, 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.
End-to-End (E2E) Test Results Summary
|
||||||||||||||||||
Yhmidi
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code
bc96e87
rabeatwork
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
re-approve
Yhmidi
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code re-approval
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
re-approve without testing based on re-approves by @rabeatwork and @Yhmidi
End-to-End (E2E) Test Results Summary
|
||||||||||||||||||||||||
Checklist
General
Server
Client
authoritiesto all new routes and checked the course groups for displaying navigation elements (links, buttons).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:
The following code changes were made on the server:
Steps for Testing
Prerequisites:
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
Manual Tests
Test Coverage
Client
Server
Screenshots
Summary by CodeRabbit
New Features
Bug Fixes
Improvements