-
Notifications
You must be signed in to change notification settings - Fork 301
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
Plagiarism checks
: Enhance navigation to plagiarism cases from detection page
#10078
base: develop
Are you sure you want to change the base?
Plagiarism checks
: Enhance navigation to plagiarism cases from detection page
#10078
Conversation
WalkthroughThis pull request introduces modifications to the plagiarism cases management interface in the Artemis application. Key changes include the addition of a template reference variable and a dynamic ID to the HTML structure of the plagiarism cases instructor view, as well as the introduction of an Changes
Assessment against linked issues
Possibly related PRs
Suggested Labels
Suggested Reviewers
Finishing Touches
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
Documentation and Community
|
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: 1
🧹 Nitpick comments (3)
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts (3)
18-18
: Use inline documentation to clarify purpose of exerciseId.
It's helpful to describe why we store exerciseId, especially since it’s only optionally defined.
23-24
: Ensure consistency in variable naming.
“exerciseWithPlagCasesElements” is descriptive but quite long. If used in multiple places, consider consolidating or making the name more concise.
43-43
: Initialize exerciseId conditionally if query parameter is absent.
Consider checking if the query parameter is defined before assigning.- this.exerciseId = Number(this.route.snapshot.queryParamMap?.get('exerciseId')); + const exerciseQueryParam = this.route.snapshot.queryParamMap?.get('exerciseId'); + if (exerciseQueryParam) { + this.exerciseId = Number(exerciseQueryParam); + }
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (6)
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.html
(1 hunks)src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts
(3 hunks)src/main/webapp/app/exercises/shared/plagiarism/plagiarism-header/plagiarism-header.component.html
(1 hunks)src/main/webapp/i18n/de/plagiarism.json
(1 hunks)src/main/webapp/i18n/en/plagiarism.json
(1 hunks)src/test/javascript/spec/component/plagiarism/plagiarism-cases-instructor-view.component.spec.ts
(2 hunks)
🧰 Additional context used
📓 Path-based instructions (5)
src/main/webapp/i18n/de/plagiarism.json (1)
Pattern src/main/webapp/i18n/de/**/*.json
: 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".
src/main/webapp/app/exercises/shared/plagiarism/plagiarism-header/plagiarism-header.component.html (1)
Pattern src/main/webapp/**/*.html
: @if and @for are new and valid Angular syntax replacing *ngIf and *ngFor. They should always be used over the old style.
src/test/javascript/spec/component/plagiarism/plagiarism-cases-instructor-view.component.spec.ts (1)
Pattern src/test/javascript/spec/**/*.ts
: 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}}
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.html (1)
Pattern src/main/webapp/**/*.html
: @if and @for are new and valid Angular syntax replacing *ngIf and *ngFor. They should always be used over the old style.
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts (1)
🔇 Additional comments (9)
src/main/webapp/app/exercises/shared/plagiarism/plagiarism-header/plagiarism-header.component.html (2)
10-12
: LGTM! Modern Angular syntax used correctly.
The conditional rendering uses the new @if
syntax as per coding guidelines, replacing the older *ngIf
directive.
13-20
: Verify the router navigation parameters.
The implementation looks good, but let's ensure the navigation parameters are properly handled when exercise.course?.id
is undefined.
Run this script to check for proper error handling of undefined course IDs:
✅ Verification successful
Based on the search results, I can now generate the final response:
The router navigation with optional course ID is consistently handled across the codebase
The search results show that the pattern exercise.course?.id
is used consistently throughout the application in router navigation. In cases where the course ID might be undefined:
- The optional chaining operator (
?.
) is properly used - Some components even have fallback paths (e.g., in example-modeling-submission.component.ts:
exercise.course?.id || exercise.exerciseGroup?.exam?.course?.id
) - The Angular router handles undefined segments gracefully by design
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for similar router navigation patterns to verify consistent handling
ast-grep --pattern '[routerLink]="[_, $course, _]"'
# Check for any error handling patterns around course navigation
rg -A 3 'exercise\.course\?\.id'
Length of output: 6971
src/main/webapp/i18n/en/plagiarism.json (1)
6-6
: LGTM! Clear and consistent translation.
The English translation "View Case(s)" is clear, properly handles pluralization, and maintains consistent capitalization with other UI elements.
src/main/webapp/i18n/de/plagiarism.json (1)
6-6
: LGTM! Translation follows German language guidelines.
The German translation "Fälle ansehen" is appropriate and follows the informal language requirement (dutzen) as per coding guidelines.
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts (2)
2-2
: Consider verifying the compatibility of 'effect' and 'viewChildren' usage across Angular versions.
These are relatively new features in Angular signals. Ensure the application’s Angular version supports them and there are no browser compatibility issues.
✅ Verification successful
Let me gather information about the Angular version and usage of these features in the codebase.
The usage of 'effect' and 'viewChildren' is compatible with the current Angular version
The codebase is using Angular v18.2.13, which fully supports both the effect
and viewChildren
signals features. The search results show these features are widely used across multiple components in the application:
effect
is used in 45 different filesviewChildren
is used in 3 different files
This consistent usage pattern and the modern Angular version indicate there are no compatibility concerns.
🏁 Scripts executed
The following scripts were executed for the analysis:
Error: No shell scripts found
Script:
#!/bin/bash
# Check package.json for Angular version
cat package.json | jq '.dependencies["@angular/core"]'
# Search for other usages of effect and viewChildren
rg "import.*effect.*from '@angular/core'" -g '*.ts'
rg "import.*viewChildren.*from '@angular/core'" -g '*.ts'
# Check if there are any browser compatibility configurations
fd "browserslist" --type f
cat browserslist 2>/dev/null || true
Length of output: 11094
32-38
: Validate that the reactive effect is unsubscribed or cleaned up if needed.
Using an effect in a constructor can lead to potential memory leaks if the component is destroyed frequently. Make sure Angular’s built-in signals or the environment handle this automatically.
✅ Verification successful
Let me gather more information about how the effect is being used and if there are any cleanup mechanisms in place.
Let me search for more specific information about the effect usage and Angular's signal implementation.
Effects in Angular 18+ are automatically cleaned up
The code is using Angular 18.2.13, which includes the new signals and effects system. Angular's effect()
automatically handles cleanup when the component is destroyed. The effect is being used correctly in the constructor to handle scrolling when exerciseId
changes, and there's no need for manual cleanup.
🏁 Scripts executed
The following scripts were executed for the analysis:
Error: No shell scripts found
Script:
#!/bin/bash
# Search for the component class implementation to understand the context
ast-grep --pattern 'export class PlagiarismCasesInstructorViewComponent {
$$$
}'
# Search for any cleanup methods or ngOnDestroy implementation
ast-grep --pattern 'ngOnDestroy() {
$$$
}'
# Look for any signal or effect related imports
rg "import.*effect" src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts
Length of output: 468
Script:
#!/bin/bash
# Search for the entire file content to understand the component implementation
cat src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts
# Search for any Angular documentation or configuration files that might indicate the version
rg "\"@angular/core\":" package.json
Length of output: 9083
src/test/javascript/spec/component/plagiarism/plagiarism-cases-instructor-view.component.spec.ts (2)
203-222
: Great test coverage for scrollToExercise.
Verifies that the correct element is scrolled into view. This ensures robust coverage of the new logic.
19-19
: Check if signal usage requires additional test bed configuration.
Signals in Angular might need certain compiler settings. Confirm your test environment is configured properly for the new Angular APIs.
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.html (1)
14-14
: Excellent approach to dynamic element referencing.
The addition of the ID and template reference variable ensures that scrollToExercise can target the correct element. This aligns with Angular’s recommended patterns for interactive UIs.
Plagiarism checks
: Enhance nvaigation to plagiarism cases from detection pagePlagiarism checks
: Enhance navigation to plagiarism cases from detection page
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 (3)
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts (3)
38-44
: Consider cleanup handling for the effectWhile the effect implementation is clean, consider handling cleanup to prevent memory leaks in case the component is destroyed while scrolling is in progress.
constructor( private plagiarismCasesService: PlagiarismCasesService, private route: ActivatedRoute, private alertService: AlertService, ) { - effect(() => { + const scrollEffect = effect(() => { if (this.exerciseId) { this.scrollToExercise(); } }); + + // Cleanup effect when component is destroyed + this.destroyRef.onDestroy(() => { + scrollEffect.destroy(); + }); }
49-49
: Add validation for exerciseId query parameterConsider adding validation to handle invalid exerciseId values in the query parameters.
- this.exerciseId = Number(this.route.snapshot.queryParamMap?.get('exerciseId')); + const rawExerciseId = this.route.snapshot.queryParamMap?.get('exerciseId'); + this.exerciseId = rawExerciseId ? Number(rawExerciseId) : undefined; + if (rawExerciseId && isNaN(this.exerciseId!)) { + this.alertService.warning('artemisApp.plagiarism.invalidExerciseId'); + this.exerciseId = undefined; + }
63-72
: Enhance scrollToExercise with error handling and accessibilityWhile the implementation is functional, consider these improvements:
- Add error handling for element not found
- Handle scroll completion
- Add accessibility attributes
scrollToExercise() { const element = this.exerciseWithPlagCasesElements().find((elem) => elem.nativeElement.id === 'exercise-with-plagiarism-case-' + this.exerciseId); if (element) { + // Add aria-live to announce scroll action + element.nativeElement.setAttribute('aria-live', 'polite'); + element.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest', - }); + }).then(() => { + // Handle scroll completion + element.nativeElement.focus(); + }).catch((error) => { + console.error('Scroll failed:', error); + this.alertService.warning('artemisApp.plagiarism.scrollError'); + }); + } else { + this.alertService.warning('artemisApp.plagiarism.exerciseNotFound'); } }
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (5)
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.html
(1 hunks)src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts
(4 hunks)src/main/webapp/i18n/de/plagiarism.json
(1 hunks)src/main/webapp/i18n/en/plagiarism.json
(1 hunks)src/test/javascript/spec/component/plagiarism/plagiarism-cases-instructor-view.component.spec.ts
(2 hunks)
🚧 Files skipped from review as they are similar to previous changes (4)
- src/main/webapp/i18n/de/plagiarism.json
- src/main/webapp/i18n/en/plagiarism.json
- src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.html
- src/test/javascript/spec/component/plagiarism/plagiarism-cases-instructor-view.component.spec.ts
🧰 Additional context used
📓 Path-based instructions (1)
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts (1)
🔇 Additional comments (1)
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts (1)
2-2
: LGTM! Clean implementation of view children and propertiesThe additions follow Angular's style guide and best practices:
- Proper typing of properties
- Correct usage of viewChildren for DOM references
- Consistent naming conventions
Also applies to: 20-20, 25-25
|
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: 1
🧹 Nitpick comments (2)
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts (2)
2-2
: LGTM! Consider adding property documentation.The imports and viewChildren implementation follow Angular's style guide correctly.
Add JSDoc documentation for the
exerciseWithPlagCasesElements
property to explain its purpose:/** Reference to exercise elements in the template for scroll functionality */ exerciseWithPlagCasesElements = viewChildren<ElementRef>('plagExerciseElement');Also applies to: 24-24
63-75
: Complete the JSDoc documentation and enhance error handling.The method's documentation is incomplete and could benefit from better error handling.
/** - * scroll to the exercise with + * Scrolls to the exercise element with the specified ID using smooth scrolling + * @param exerciseId - The ID of the exercise to scroll to + * @returns void */ scrollToExerciseAfterViewInit(exerciseId: number) { const element = this.exerciseWithPlagCasesElements().find((elem) => elem.nativeElement.id === 'exercise-with-plagiarism-case-' + exerciseId); if (element) { element.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest', }); + } else { + console.warn(`Exercise element with ID ${exerciseId} not found`); } }
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.html
(1 hunks)src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts
(4 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.html
🧰 Additional context used
📓 Path-based instructions (1)
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts (1)
⏰ Context from checks skipped due to timeout of 90000ms (4)
- GitHub Check: Build and Push Docker Image
- GitHub Check: server-tests
- GitHub Check: Analyse
- GitHub Check: Build .war artifact
...pp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts
Outdated
Show resolved
Hide resolved
|
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
♻️ Duplicate comments (1)
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts (1)
67-74
:⚠️ Potential issueMove effect to constructor and add proper cleanup.
The effect should be in the constructor as indicated by the comment. Also, add proper cleanup to prevent memory leaks.
Additionally, consider moving this logic to the constructor:
- ngOnInit(): void { - this.courseId = Number(this.route.snapshot.paramMap.get('courseId')); - this.examId = Number(this.route.snapshot.paramMap.get('examId')); - const plagiarismCasesForInstructor$ = this.examId - ? this.plagiarismCasesService.getExamPlagiarismCasesForInstructor(this.courseId, this.examId) - : this.plagiarismCasesService.getCoursePlagiarismCasesForInstructor(this.courseId); - - plagiarismCasesForInstructor$.subscribe({ - next: (res: HttpResponse<PlagiarismCase[]>) => { - this.plagiarismCases = res.body!; - this.groupedPlagiarismCases = this.getGroupedPlagiarismCasesByExercise(this.plagiarismCases); - }, - }); - effect(() => { + constructor() { + this.courseId = Number(this.route.snapshot.paramMap.get('courseId')); + this.examId = Number(this.route.snapshot.paramMap.get('examId')); + + effect((onCleanup) => { const exerciseId = Number(this.route.snapshot.queryParamMap?.get('exerciseId')); if (exerciseId) { this.scrollToExerciseAfterViewInit(exerciseId); } + onCleanup(() => { + // Cleanup any subscriptions or side effects + }); }); + + const plagiarismCasesForInstructor$ = this.examId + ? this.plagiarismCasesService.getExamPlagiarismCasesForInstructor(this.courseId, this.examId) + : this.plagiarismCasesService.getCoursePlagiarismCasesForInstructor(this.courseId); + + plagiarismCasesForInstructor$.subscribe({ + next: (res: HttpResponse<PlagiarismCase[]>) => { + this.plagiarismCases = res.body!; + this.groupedPlagiarismCases = this.getGroupedPlagiarismCasesByExercise(this.plagiarismCases); + }, + }); }
🧹 Nitpick comments (2)
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts (2)
2-2
: Sort import members alphabetically.Reorder the import members to follow the style guidelines.
-import { Component, ElementRef, OnInit, effect, viewChildren, inject } from '@angular/core'; +import { Component, ElementRef, inject, OnInit, effect, viewChildren } from '@angular/core';🧰 Tools
🪛 eslint
[error] 2-2: Member 'inject' of the import declaration should be sorted alphabetically.
(sort-imports)
🪛 GitHub Check: client-style
[failure] 2-2:
Member 'inject' of the import declaration should be sorted alphabetically
77-79
: Complete the JSDoc comment.The JSDoc comment is incomplete. Please add the parameter description and return type if applicable.
- /** - * scroll to the exercise with - */ + /** + * Scrolls to the exercise element with the specified ID using smooth scrolling behavior + * @param exerciseId - The ID of the exercise to scroll to + */
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts
(3 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts (1)
🪛 eslint
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts
[error] 2-2: Member 'inject' of the import declaration should be sorted alphabetically.
(sort-imports)
🪛 GitHub Check: client-style
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts
[failure] 2-2:
Member 'inject' of the import declaration should be sorted alphabetically
⏰ Context from checks skipped due to timeout of 90000ms (5)
- GitHub Check: Codacy Static Code Analysis
- GitHub Check: server-tests
- GitHub Check: client-tests
- GitHub Check: Build and Push Docker Image
- GitHub Check: Analyse
🔇 Additional comments (2)
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts (2)
45-45
: LGTM! Well-structured DOM reference implementation.The viewChildren implementation follows Angular best practices for accessing template elements.
80-88
: LGTM! Well-implemented smooth scrolling.The scroll implementation follows Angular best practices for DOM manipulation and provides a good user experience with smooth scrolling behavior.
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
♻️ Duplicate comments (1)
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts (1)
67-75
:⚠️ Potential issueAddress potential issues in the effect implementation.
- The effect should be cleaned up when the component is destroyed.
- The Number conversion needs proper error handling.
- Consider moving the comment to JSDoc format for better documentation.
- // effect needs to be in constructor context, due to the possibility of ngOnInit being called from a non-injection - //context - effect(() => { + /** + * Effect must be in constructor context as ngOnInit might be called from non-injection context. + * Handles scrolling to specific exercise when exerciseId is present in query params. + */ + effect((onCleanup) => { + const exerciseIdParam = this.route.snapshot.queryParamMap?.get('exerciseId'); + if (!exerciseIdParam) return; const exerciseId = Number(exerciseIdParam); + if (isNaN(exerciseId)) { + console.warn('Invalid exerciseId in query params'); + return; + } if (exerciseId) { this.scrollToExerciseAfterViewInit(exerciseId); } + onCleanup(() => { + // Clean up any subscriptions or side effects + }); });
🧹 Nitpick comments (2)
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts (2)
45-45
: Consider adding JSDoc documentation for the view children property.The property is well-implemented using
viewChildren
for DOM access. Consider adding JSDoc documentation to explain its purpose and usage.+ /** + * References to exercise elements in the view for scrolling functionality + */ exerciseWithPlagCasesElements = viewChildren<ElementRef>('plagExerciseElement');
77-88
: Complete the documentation and enhance error handling.
- The JSDoc comment is incomplete.
- Consider adding error handling for when the element is not found.
/** - * scroll to the exercise with + * Scrolls to the exercise element with the specified ID using smooth scrolling. + * @param exerciseId - The ID of the exercise to scroll to + * @returns void */ scrollToExerciseAfterViewInit(exerciseId: number) { const element = this.exerciseWithPlagCasesElements().find((elem) => elem.nativeElement.id === 'exercise-with-plagiarism-case-' + exerciseId); + if (!element) { + console.warn(`Exercise element with ID ${exerciseId} not found`); + return; + } - if (element) { - element.nativeElement.scrollIntoView({ - behavior: 'smooth', - block: 'start', - inline: 'nearest', - }); - } + element.nativeElement.scrollIntoView({ + behavior: 'smooth', + block: 'start', + inline: 'nearest', + }); }
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts
(3 hunks)src/test/javascript/spec/component/plagiarism/plagiarism-cases-instructor-view.component.spec.ts
(2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- src/test/javascript/spec/component/plagiarism/plagiarism-cases-instructor-view.component.spec.ts
🧰 Additional context used
📓 Path-based instructions (1)
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts (1)
⏰ Context from checks skipped due to timeout of 90000ms (7)
- GitHub Check: Codacy Static Code Analysis
- GitHub Check: client-tests-selected
- GitHub Check: client-tests
- GitHub Check: server-tests
- GitHub Check: Build and Push Docker Image
- GitHub Check: Analyse
- GitHub Check: Build .war artifact
🔇 Additional comments (1)
src/main/webapp/app/course/plagiarism-cases/instructor-view/plagiarism-cases-instructor-view.component.ts (1)
2-2
: LGTM! Good use of modern Angular features.The imports are well-organized and utilize modern Angular features like
effect
andviewChildren
for reactive view manipulation.
Checklist
General
Server
Client
Motivation and Context
The ‘Confirm’ button does not directly send a notification to the students. That has to be done manually from the ‘Plagiarism Cases‘ page. However this is not very clear from the UI
Navigating to that one has to be done via
The change replaces the Confirm button with "View Cases" which leads you to the cases of the exercise and scrolls to it if need be.
(Fixes #6596)
Description
Added a routerlink to plagiarism detection page. Also added a scrollIntoView to scroll to the exercise table if it is necessary.
Steps for Testing
Prerequisites:
Exam Mode Testing
Testserver States
Note
These badges show the state of the test servers.
Green = Currently available, Red = Currently locked
Click on the badges to get to the test servers.
Review Progress
Performance Review
Code Review
Manual Tests
Test Coverage
Screenshots
After pressing on Confirm:
Summary by CodeRabbit
Summary by CodeRabbit
New Features
Localization
Bug Fixes
Tests