Skip to content

Conversation

@matyasht
Copy link
Contributor

@matyasht matyasht commented Jan 24, 2026

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 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.
  • I added authorities to all new routes and checked the course groups for displaying navigation elements (links, buttons).
  • I documented the TypeScript code using JSDoc style.
  • I added multiple screenshots/screencasts of my UI changes.
  • I translated all newly inserted strings into English and German.

Motivation and Context

Currently, only programming exercises show a deletion summary, other exercise types do not.
This PR makes it consistent so that all exercise types have a deletion summary, indicating activity, and potentially avoiding accidental deletions.

Description

This PR extends the exercise deletion summary feature to all exercise types:

  • Unified deletion summary endpoint: Refactored from GET /programming-exercises/{id}/deletion-summary to GET /exercises/{id}/deletion-summary that works for all exercise types
  • Dynamic Summary fields: The ExerciseDeletionSummaryDTO now includes:
    • numberOfStudentParticipations (all exercises)
    • numberOfBuilds (programming exercises only)
    • numberOfAssessments (text, modeling, file upload exercises only - excludes programming and quiz)
    • numberOfCommunicationPosts and numberOfAnswerPosts (all exercises)
  • Course type indication: All exercise deletion dialogs now display whether the exercise belongs to a "test course" or "real course"

Steps for Testing

Prerequisites:

  • 1 Instructor
  • 1 Student
  • 1 Course with exercises of each type (Text, Modeling, File Upload, Quiz, Programming)
  • At least one student participation and/or submission per exercise type
  1. Log in as Instructor
  2. Navigate to Course Management > Exercises
  3. For each exercise type (Text, Modeling, File Upload, Quiz, Programming):
    • Click the delete button on an exercise
    • Verify the deletion dialog shows the course name and course type (test/real)
    • Verify the deletion summary is present with a table of numbers
  4. Test multiple deletion:
    • Select multiple exercises of any type (can also be just one exercise)
    • Try to delete them by the delete button that popped up and check if it mentions whether the exercises are part of a real or test course.
    • No deletion summary was implemented for multi-deletion
  5. Click on an exercise of each type to see if the deletion dialog in the details behaves the same.
  6. Create an exam and import your exercises into an exercise group
  7. Add some activity to your exercises in the exam as well
  8. Check if the summaries and text are displayed

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

Screenshots

image image

Summary by CodeRabbit

  • New Features

    • Unified deletion-summary preview across exercise types showing participations, assessments, posts, and builds before confirming deletion.
  • Localization

    • Deletion dialogs include course context (type and title) and stronger irreversible-warning messaging; new/updated translation keys.
  • UI

    • Delete confirmation dialogs and buttons now use a shared summary fetch and consistent translation keys across exercise types.
  • Tests

    • Added integration tests covering deletion-summary reporting and updated unit tests for the new behavior.

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

@matyasht matyasht self-assigned this Jan 24, 2026
@github-project-automation github-project-automation bot moved this to Work In Progress in Artemis Development Jan 24, 2026
@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!) exercise Pull requests that affect the corresponding module fileupload Pull requests that affect the corresponding module modeling Pull requests that affect the corresponding module programming Pull requests that affect the corresponding module quiz Pull requests that affect the corresponding module text Pull requests that affect the corresponding module labels Jan 24, 2026
@matyasht matyasht changed the title Exercises: Deletion summaries for all exercises Programming exercises: Deletion summaries for all exercises Jan 24, 2026
@github-actions
Copy link

End-to-End (E2E) Test Results Summary

TestsPassed ☑️Skipped ⚠️Failed ❌️Time ⏱
End-to-End (E2E) Test Report223 ran221 passed1 skipped1 failed1h 28m 25s 279ms
TestResultTime ⏱
End-to-End (E2E) Test Report
e2e/atlas/LearningPathManagement.spec.ts
ts.Learning Path Management › Create simple learning path❌ failure31s 786ms

@matyasht matyasht changed the title Programming exercises: Deletion summaries for all exercises Programming exercises: Deletion summaries for all exercises Jan 24, 2026
@github-actions
Copy link

End-to-End (E2E) Test Results Summary

TestsPassed ☑️Skipped ⚠️Failed ❌️Time ⏱
End-to-End (E2E) Test Report223 ran220 passed2 skipped1 failed1h 49m 33s 996ms
TestResultTime ⏱
End-to-End (E2E) Test Report
e2e/exam/ExamAssessment.spec.ts
ts.Exam assessment › Text exercise assessment › Complaints about text exercises assessment❌ failure4m 24s 648ms

@matyasht matyasht force-pushed the feature/exercises/non-programming-deletion-summaries branch from 9e50a5e to c4fdd52 Compare January 24, 2026 19:28
@github-actions github-actions bot added the core Pull requests that affect the corresponding module label Jan 24, 2026
@github-actions
Copy link

End-to-End (E2E) Test Results Summary

TestsPassed ☑️Skipped ⚠️Failed ❌️Time ⏱
End-to-End (E2E) Test Report223 ran220 passed1 skipped2 failed1h 44m 35s 901ms
TestResultTime ⏱
End-to-End (E2E) Test Report
e2e/course/CourseMessages.spec.ts
ts.Course messages › Channel messages › Write/edit/delete message in channel › Student should be able to write message in channel❌ failure2m 19s 803ms
e2e/exam/test-exam/TestExamParticipation.spec.ts
ts.Test exam participation › Early Hand-in › Using exercise sidebar to navigate within exam❌ failure3m 58s 565ms

@helios-aet helios-aet bot temporarily deployed to artemis-test2.artemis.cit.tum.de January 25, 2026 17:55 Inactive
@helios-aet helios-aet bot temporarily deployed to artemis-test4.artemis.cit.tum.de January 25, 2026 18:06 Inactive
@matyasht matyasht force-pushed the feature/exercises/non-programming-deletion-summaries branch from c460c9c to af61da0 Compare January 25, 2026 19:30
@github-actions github-actions bot removed the core Pull requests that affect the corresponding module label Jan 25, 2026
@github-actions
Copy link

End-to-End (E2E) Test Results Summary

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

@github-actions
Copy link

End-to-End (E2E) Test Results Summary

TestsPassed ✅Skipped ⚠️FailedTime ⏱
End-to-End (E2E) Test Report223 ran222 passed1 skipped0 failed1h 29m 50s 631ms
TestResultTime ⏱
No test annotations available

@matyasht matyasht marked this pull request as ready for review January 26, 2026 13:31
@matyasht matyasht requested review from a team and krusche as code owners January 26, 2026 13:31
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 26, 2026

Walkthrough

Adds a generic exercise-level deletion-summary DTO and endpoint, implements a service to aggregate deletion counts across repositories, removes programming-specific deletion-summary types/endpoints, updates frontend wiring to use the generic endpoint, and adds integration tests and translations.

Changes

Cohort / File(s) Summary
Backend DTO & Service
src/main/java/de/tum/cit/aet/artemis/exercise/dto/ExerciseDeletionSummaryDTO.java, src/main/java/de/tum/cit/aet/artemis/exercise/service/ExerciseDeletionService.java, src/main/java/de/tum/cit/aet/artemis/exercise/web/ExerciseResource.java
Added ExerciseDeletionSummaryDTO; implemented ExerciseDeletionService.getDeletionSummary(exerciseId) aggregating counts (participations, builds, assessments, communication/answer posts); wired new repositories; added GET /exercises/{exerciseId}/deletion-summary.
Backend Repository
src/main/java/de/tum/cit/aet/artemis/exercise/repository/StudentParticipationRepository.java
Added long countByExerciseId(long exerciseId).
Backend Cleanup (programming-specific)
src/main/java/de/tum/cit/aet/artemis/programming/dto/ProgrammingExerciseDeletionSummaryDTO.java, src/main/java/de/tum/cit/aet/artemis/programming/service/ProgrammingExerciseDeletionService.java, src/main/java/de/tum/cit/aet/artemis/programming/web/ProgrammingExerciseDeletionResource.java
Removed programming-specific deletion-summary DTO, removed programming-specific service method and REST endpoint.
Frontend Service & Model
src/main/webapp/app/exercise/services/exercise.service.ts, src/main/webapp/app/exercise/services/exercise.service.spec.ts, src/main/webapp/app/exercise/shared/entities/exercise-deletion-summary.model.ts
Added getDeletionSummary() in ExerciseService calling new endpoint and mapping DTO→EntitySummary; added TS interface for DTO and tests for mapping/edge-cases.
Frontend Components — generic wiring
multiple files under src/main/webapp/app/** (e.g., exam-exercise-row-buttons, non-programming-exercise-detail-common-actions, file-upload, modeling, quiz, text, programming components)
Replaced programming-specific calls with ExerciseService.getDeletionSummary, added fetchExerciseDeletionSummary() methods, added delete-button inputs (entitySummaryTitle, fetchEntitySummary, translateValues), updated imports (ArtemisTranslatePipe, EntitySummary) and some component inputs.
Frontend Programming Cleanup
src/main/webapp/app/programming/manage/services/programming-exercise.service.ts, src/main/webapp/app/programming/shared/utils/programming-exercise.utils.ts and tests
Removed programming-specific deletion-summary method, helper, and associated tests/imports.
Frontend Localization (EN/DE)
src/main/webapp/i18n/en/exercise.json, src/main/webapp/i18n/en/exercise-actions.json, src/main/webapp/i18n/de/exercise.json, src/main/webapp/i18n/de/exercise-actions.json, src/main/webapp/i18n/en/programmingExercise.json, src/main/webapp/i18n/de/programmingExercise.json
Added generic exercise delete translation keys (testCourse, realCourse, summary fields), updated delete confirmation messages to include course context and stronger warning; removed programmingExercise-specific summary/testCourse/realCourse keys.
Backend Tests
src/test/java/de/tum/cit/aet/artemis/exercise/ExerciseDeletionSummaryIntegrationTest.java
Added comprehensive integration tests covering multiple exercise types and permission scenarios for the new endpoint.
Backend Test Cleanup
src/test/java/de/tum/cit/aet/artemis/programming/web/ProgrammingExerciseDeletionResourceTest.java
Removed programming-specific deletion-summary test class.
Architecture Test
src/test/java/de/tum/cit/aet/artemis/shared/architecture/ArchitectureTest.java
Relaxed JsonInclude enforcement to allow NON_EMPTY or NON_NULL values.
Housekeeping
src/main/java/de/tum/cit/aet/artemis/fileupload/service/FileUploadExerciseService.java
Minor formatting change (removed blank line).

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant ExerciseResource
    participant ExerciseDeletionService
    participant StudentParticipationRepository
    participant BuildJobRepository
    participant ResultRepository
    participant ChannelRepository
    participant PostRepository
    participant AnswerPostRepository

    Client->>ExerciseResource: GET /exercises/{id}/deletion-summary
    ExerciseResource->>ExerciseDeletionService: getDeletionSummary(exerciseId)
    ExerciseDeletionService->>StudentParticipationRepository: countByExerciseId(id)
    StudentParticipationRepository-->>ExerciseDeletionService: participationCount
    alt isProgrammingExercise
        ExerciseDeletionService->>BuildJobRepository: countByExerciseId(id)
        BuildJobRepository-->>ExerciseDeletionService: buildCount
    end
    alt isNotProgrammingAndNotQuiz
        ExerciseDeletionService->>ResultRepository: countFinishedByExerciseId(id)
        ResultRepository-->>ExerciseDeletionService: assessmentCount
    end
    ExerciseDeletionService->>ChannelRepository: findExerciseChannelByExerciseId(id)
    ChannelRepository-->>ExerciseDeletionService: channel?
    alt channelExists
        ExerciseDeletionService->>PostRepository: countByChannelId(channelId)
        PostRepository-->>ExerciseDeletionService: communicationPosts
        ExerciseDeletionService->>AnswerPostRepository: countByChannelId(channelId)
        AnswerPostRepository-->>ExerciseDeletionService: answerPosts
    end
    ExerciseDeletionService-->>ExerciseResource: ExerciseDeletionSummaryDTO
    ExerciseResource-->>Client: 200 OK + DTO
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~35 minutes

Possibly related PRs

Suggested labels

ready for review

Suggested reviewers

  • krusche
  • theblobinthesky
  • florian-glombik
  • AjayvirS
  • HawKhiem
🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 25.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: extending deletion summaries from programming exercises to all exercise types.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 feature/exercises/non-programming-deletion-summaries

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: 5

Caution

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

⚠️ Outside diff range comments (2)
src/test/java/de/tum/cit/aet/artemis/shared/architecture/ArchitectureTest.java (1)

306-319: Fix JsonInclude condition/violation message text.
The condition still advertises only NON_EMPTY, and the violation message repeats NON_EMPTY and misses a space before “or”, which makes diagnostics misleading.

🛠️ Suggested fix
-        return new ArchCondition<>("Use `@JsonInclude`(JsonInclude.Include.NON_EMPTY)") {
+        return new ArchCondition<>("Use `@JsonInclude`(JsonInclude.Include.NON_EMPTY) or `@JsonInclude`(JsonInclude.Include.NON_NULL)") {
@@
-                if (!value.name().equals("NON_EMPTY") && !value.name().equals("NON_NULL")) {
-                    events.add(violated(item, item + " should be annotated with `@JsonInclude`(JsonInclude.Include.NON_EMPTY)" + "or `@JsonInclude`(JsonInclude.Include.NON_EMPTY)"));
+                if (!value.name().equals("NON_EMPTY") && !value.name().equals("NON_NULL")) {
+                    events.add(violated(item, item + " should be annotated with `@JsonInclude`(JsonInclude.Include.NON_EMPTY) or `@JsonInclude`(JsonInclude.Include.NON_NULL)"));
                 }
src/main/webapp/app/modeling/manage/modeling-exercise/modeling-exercise.component.html (1)

149-165: Incorrect element ID for modeling exercises bulk delete button.

The id attribute is set to "delete-all-quiz" but this is the modeling exercises component. This appears to be a copy-paste error and should be "delete-all-modeling" for consistency and accurate element identification in tests.

Proposed fix
                         (delete)="deleteMultipleExercises(selectedExercises, modelingExerciseService)"
                         [dialogError]="dialogError$"
-                        id="delete-all-quiz"
+                        id="delete-all-modeling"
                         class="mb-1"
🤖 Fix all issues with AI agents
In
`@src/main/java/de/tum/cit/aet/artemis/exercise/service/ExerciseDeletionService.java`:
- Around line 124-144: The participation count in getDeletionSummary is using
participationRepository.countByExerciseId(exerciseId) which counts all
participation types; replace it with a student-only count by either calling
studentParticipationRepository.findByExerciseId(exerciseId).size() or,
preferably, add and use a new StudentParticipationRepository method
countStudentParticipationsByExerciseId(exerciseId) and call that from
getDeletionSummary to populate numberOfStudentParticipations so only
StudentParticipation rows are counted.

In
`@src/main/webapp/app/exercise/exercise-detail-common-actions/non-programming-exercise-detail-common-actions.component.html`:
- Around line 85-88: The template accesses course.title and course.testCourse
inside the delete button block guarded only by exercise.isAtLeastInstructor,
which can cause runtime errors if course is undefined; update the delete-button
block to also guard for course (e.g., wrap the block with an `@if` (course)) or
change usages to optional chaining (course?.title and course?.testCourse) so
references in the translateValues object are safe; ensure you update the block
that contains exercise.isAtLeastInstructor to include this additional course
presence check or replace direct course property access with course?.property.

In `@src/main/webapp/app/quiz/manage/detail/quiz-exercise-detail.component.html`:
- Line 10: Replace the unsafe non-null assertion quizExercise.course! used in
the jhi-quiz-exercise-manage-buttons input with a safe resolution that handles
both course and exam exercises: either use nullish coalescing to pass
quizExercise.course ?? quizExercise.exerciseGroup?.exam?.course, or call the
existing utility getCourseFromExercise(quizExercise) and pass its result as
[course]; update the template binding for jhi-quiz-exercise-manage-buttons to
use that safe expression so the component always receives a valid Course object.

In
`@src/main/webapp/app/text/manage/text-exercise/exercise/text-exercise.component.html`:
- Line 82: Replace the incorrect id value "delete-all-quiz" in the text exercise
template with "delete-all-text" and update any code that references the old id
string (e.g., querySelector or test selectors referencing
"delete-all-quiz")—look for occurrences in the TextExerciseComponent class and
related unit/e2e tests and change them to "delete-all-text" so the template id
and all consumers match.

In `@src/main/webapp/i18n/de/exercise.json`:
- Around line 25-35: The JSON translation contains a typo in the "summary.title"
key of the German exercise translations; change the value for "summary.title"
from "Aufaben-Zusammenfassung" to the correct "Aufgaben‑Zusammenfassung" (note
the missing "g" and use of a non-breaking hyphen if preferred) so the
user-facing string displays correctly.
🧹 Nitpick comments (4)
src/main/webapp/app/exercise/exercise-detail-common-actions/non-programming-exercise-detail-common-actions.component.html (1)

84-84: Refactor to avoid creating new Observable instances on each change detection cycle.

Calling fetchExerciseDeletionSummary(exercise.id!) in the template binding creates a new Observable on every change detection cycle. While the actual subscription only occurs on button click, this pattern is inefficient and wastes memory. Instead, pre-compute the Observable as a component property or use shareReplay() to cache the Observable across multiple accesses:

deletionSummary$ = this.exerciseService.getDeletionSummary(this.exercise.id!);

Then bind to the pre-computed property:

[fetchEntitySummary]="deletionSummary$"
src/test/java/de/tum/cit/aet/artemis/exercise/ExerciseDeletionSummaryIntegrationTest.java (3)

195-219: Consider adding assertions for communication posts.

The test validates participations, assessments, and builds correctly, but unlike the programming and text exercise tests, it doesn't assert numberOfCommunicationPosts and numberOfAnswerPosts. Consider adding these assertions for completeness:

         assertThat(summary.numberOfStudentParticipations()).isEqualTo(2);
         assertThat(summary.numberOfAssessments()).isEqualTo(1);
         assertThat(summary.numberOfBuilds()).isNull();
+        assertThat(summary.numberOfCommunicationPosts()).isEqualTo(0);
+        assertThat(summary.numberOfAnswerPosts()).isEqualTo(0);

221-247: Consider adding assertions for communication posts.

Same as the modeling exercise test - consider adding assertions for numberOfCommunicationPosts and numberOfAnswerPosts for completeness.


249-265: Consider improving variable naming for clarity.

The test logic is correct, but quizExercise2 obtained from submission.getParticipation().getExercise() could be named more descriptively to clarify that it's a different exercise created by the utility method:

         Submission submission = quizExerciseUtilService.addQuizExerciseToCourseWithParticipationAndSubmissionForUser(course, TEST_PREFIX + "student1", false);
-        Exercise quizExercise2 = submission.getParticipation().getExercise();
+        Exercise quizExerciseWithParticipation = submission.getParticipation().getExercise();

@github-project-automation github-project-automation bot moved this from Work In Progress to Ready For Review in Artemis Development Jan 26, 2026
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

🤖 Fix all issues with AI agents
In
`@src/main/java/de/tum/cit/aet/artemis/exercise/service/ExerciseDeletionService.java`:
- Around line 132-133: In ExerciseDeletionService, rename the misspelled local
variable hasAssesments to hasAssessments and update all usages (e.g., in the
ternary that sets numberOfAssessments) to the new name; ensure the declaration
"final boolean hasAssessments = !(exercise instanceof ProgrammingExercise ||
exercise instanceof QuizExercise);" replaces the old one and any references
elsewhere in the method/class are adjusted accordingly.

@github-actions
Copy link

End-to-End (E2E) Test Results Summary

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

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

🤖 Fix all issues with AI agents
In
`@src/main/webapp/app/quiz/manage/manage-buttons/quiz-exercise-manage-buttons.component.ts`:
- Around line 101-103: The navigation call uses this.course()?.id which can be
undefined and produce an invalid route; change the logic in isDetailPage()
handling to use the guaranteed route-derived this.courseId (or guard against
undefined): obtain courseId from this.courseId (or const courseId =
this.course()?.id and check it), then only call
this.router.navigate(['course-management', courseId, 'exercises']) when courseId
is truthy; update the block around isDetailPage(), this.course(), this.courseId
and router.navigate accordingly.

@matyasht matyasht force-pushed the feature/exercises/non-programming-deletion-summaries branch from 51bad90 to 8fea9b6 Compare January 26, 2026 16:29
@github-actions
Copy link

End-to-End (E2E) Test Results Summary

TestsPassed ✅SkippedFailedTime ⏱
End-to-End (E2E) Test Report1 ran1 passed0 skipped0 failed2s 310ms
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 Report223 ran220 passed1 skipped2 failed1h 41m 45s 546ms
TestResultTime ⏱
End-to-End (E2E) Test Report
e2e/exam/ExamTestRun.spec.ts
ts.Exam test run › Delete a test run › Deletes a test run❌ failure3m 3s 396ms
e2e/exam/test-exam/TestExamParticipation.spec.ts
ts.Test exam participation › Early Hand-in › Using exercise overview to navigate within exam❌ failure4m 41s 293ms

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!) exercise Pull requests that affect the corresponding module fileupload Pull requests that affect the corresponding module modeling Pull requests that affect the corresponding module programming Pull requests that affect the corresponding module quiz Pull requests that affect the corresponding module server Pull requests that update Java code. (Added Automatically!) tests text Pull requests that affect the corresponding module

Projects

Status: Ready For Review

Development

Successfully merging this pull request may close these issues.

2 participants