Skip to content

Programming exercises: Improve integration of Monaco code editor and Athena Preliminary Feedback #10442

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

Open
wants to merge 61 commits into
base: feature/programming-exercises/choose-preliminary-feedback-model
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 38 commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
539ab1d
improve integration of monaco code editor and preliminary feedback
dmytropolityka Nov 14, 2024
9452111
Merge branch 'feature/programming-exercises/choose-preliminary-feedba…
dmytropolityka Jan 5, 2025
6fa0d09
Merge branch 'feature/programming-exercises/choose-preliminary-feedba…
dmytropolityka Jan 5, 2025
3436aad
move reload feedback button
dmytropolityka Jan 12, 2025
24b5437
styling issues
dmytropolityka Jan 13, 2025
e764299
fix test
dmytropolityka Jan 13, 2025
d4e2569
add new tests
dmytropolityka Jan 16, 2025
0fca59f
eslint
dmytropolityka Jan 16, 2025
4122b29
eslint
dmytropolityka Jan 16, 2025
ef723dd
change component.item to partial
dmytropolityka Jan 16, 2025
61d4b38
change component.item to unknown
dmytropolityka Jan 16, 2025
34ccdd6
Merge remote-tracking branch 'origin/develop' into feature/programmin…
dmytropolityka Mar 3, 2025
27ba875
resolve merge conflict issues
dmytropolityka Mar 4, 2025
1c06eea
Merge branch 'feature/programming-exercises/choose-preliminary-feedba…
dmytropolityka Mar 4, 2025
e770a34
fix deployment issue
dmytropolityka Mar 4, 2025
b1d0035
Merge branch 'feature/programming-exercises/choose-preliminary-feedba…
dmytropolityka Mar 5, 2025
6fdf2b4
Merge branch 'feature/programming-exercises/choose-preliminary-feedba…
dmytropolityka Mar 5, 2025
e1ef392
Merge branch 'feature/programming-exercises/choose-preliminary-feedba…
dmytropolityka Mar 5, 2025
017c4f2
fix styling in tests
dmytropolityka Mar 5, 2025
5e42e1d
fix styling in tests
dmytropolityka Mar 5, 2025
1d25704
Update exercise.json
dmytropolityka Mar 5, 2025
e25d68f
increase test coverage and minor changes
dmytropolityka Mar 5, 2025
8c85f25
enable support for multiple existing feedback widgets at the same lin…
dmytropolityka Mar 7, 2025
a22cc0b
remove private method mock
dmytropolityka Mar 7, 2025
e2a8bd1
always set file badges to zero by default
dmytropolityka Mar 7, 2025
6fa70c9
remove console log
dmytropolityka Mar 7, 2025
c92380a
fix rendering of feedback suggestions
dmytropolityka Mar 8, 2025
ed2ebbd
reiterate the approach for multiple feedback boxes at the same line
dmytropolityka Mar 8, 2025
ed5096a
refactoring
dmytropolityka Mar 8, 2025
0345224
prettier
dmytropolityka Mar 8, 2025
fe7f759
Merge branch 'feature/programming-exercises/choose-preliminary-feedba…
dmytropolityka Mar 8, 2025
4200770
eslint
dmytropolityka Mar 8, 2025
6b67c04
Merge remote-tracking branch 'origin/feature/programming-exercises/at…
dmytropolityka Mar 8, 2025
9c6b334
fix query parameter name
dmytropolityka Mar 8, 2025
b4b20b5
don't show reopen feedback component anywhere except the student cont…
dmytropolityka Mar 9, 2025
88b591d
remove duplicating icon
dmytropolityka Mar 11, 2025
de0e836
self closing tag
dmytropolityka Mar 11, 2025
c9d010e
Merge branch 'feature/programming-exercises/choose-preliminary-feedba…
dmytropolityka Mar 13, 2025
91dec44
Merge branch 'feature/programming-exercises/choose-preliminary-feedba…
dmytropolityka Mar 19, 2025
039b05b
merge develop branch
dmytropolityka Mar 19, 2025
d9521ac
Merge remote-tracking branch 'origin/feature/programming-exercises/at…
dmytropolityka Mar 19, 2025
5bb324b
Merge branch 'feature/programming-exercises/choose-preliminary-feedba…
dmytropolityka Mar 19, 2025
74c1eff
Merge branch 'feature/programming-exercises/choose-preliminary-feedba…
dmytropolityka Mar 19, 2025
032b803
fix imports
dmytropolityka Mar 19, 2025
6bfd06d
Merge remote-tracking branch 'origin/feature/programming-exercises/at…
dmytropolityka Mar 19, 2025
8387065
prettier
dmytropolityka Mar 19, 2025
d25b85d
Merge branch 'feature/programming-exercises/choose-preliminary-feedba…
dmytropolityka Mar 23, 2025
42918b6
merge conflict
dmytropolityka Mar 23, 2025
1c62a9d
Merge branch 'feature/programming-exercises/choose-preliminary-feedba…
dmytropolityka Mar 24, 2025
f3e68b6
Merge base branch
dmytropolityka Apr 4, 2025
0c4d0ec
Merge remote-tracking branch 'origin/feature/programming-exercises/at…
dmytropolityka Apr 4, 2025
756018e
Merge branch 'feature/programming-exercises/choose-preliminary-feedba…
dmytropolityka Apr 4, 2025
e8b5644
fix merge conflict issues
dmytropolityka Apr 4, 2025
aa01e3f
Merge remote-tracking branch 'origin/feature/programming-exercises/at…
dmytropolityka Apr 4, 2025
b1697c6
fix another merge conflict issue
dmytropolityka Apr 4, 2025
65dcd57
Merge branch 'feature/programming-exercises/choose-preliminary-feedba…
dmytropolityka Apr 4, 2025
9f4985d
Merge branch 'feature/programming-exercises/choose-preliminary-feedba…
dmytropolityka Apr 4, 2025
ac6502d
increase test coverage
dmytropolityka Apr 7, 2025
0177640
Merge remote-tracking branch 'origin/feature/programming-exercises/at…
dmytropolityka Apr 7, 2025
84c6a2d
Merge branch 'feature/programming-exercises/athena-feedback-in-code-e…
dmytropolityka Apr 7, 2025
aabdf01
Create pre-commit
dmytropolityka Apr 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ public class ProgrammingExerciseCodeReviewFeedbackService {

private static final Logger log = LoggerFactory.getLogger(ProgrammingExerciseCodeReviewFeedbackService.class);

public static final String NON_GRADED_FEEDBACK_SUGGESTION = "NonGradedFeedbackSuggestion:";
// feedback.detailText prefix
public static final String PRELIMINARY_FEEDBACK_PREFIX = "NonGradedFeedbackSuggestion:";

private final GroupNotificationService groupNotificationService;

Expand Down Expand Up @@ -124,7 +125,7 @@ public void generateAutomaticNonGradedFeedback(ProgrammingExerciseStudentPartici
automaticResult.setScore(100.0);
automaticResult.setSuccessful(null);
automaticResult.setCompletionDate(ZonedDateTime.now().plusMinutes(5)); // we do not want to show dates without a completion date, but we want the students to know their
// feedback request is in work
// feedback request is in work
automaticResult = this.resultRepository.save(automaticResult);

try {
Expand All @@ -143,17 +144,17 @@ public void generateAutomaticNonGradedFeedback(ProgrammingExerciseStudentPartici
String feedbackText;
if (Objects.nonNull(individualFeedbackItem.lineStart())) {
if (Objects.nonNull(individualFeedbackItem.lineEnd()) && !individualFeedbackItem.lineStart().equals(individualFeedbackItem.lineEnd())) {
feedbackText = String.format(NON_GRADED_FEEDBACK_SUGGESTION + "File %s at lines %d-%d", individualFeedbackItem.filePath(),
individualFeedbackItem.lineStart(), individualFeedbackItem.lineEnd());
feedbackText = String.format(PRELIMINARY_FEEDBACK_PREFIX + "File %s at lines %d-%d", individualFeedbackItem.filePath(),
individualFeedbackItem.lineStart() + 1, individualFeedbackItem.lineEnd() + 1);
}
else {
feedbackText = String.format(NON_GRADED_FEEDBACK_SUGGESTION + "File %s at line %d", individualFeedbackItem.filePath(),
individualFeedbackItem.lineStart());
feedbackText = String.format(PRELIMINARY_FEEDBACK_PREFIX + "File %s at line %d", individualFeedbackItem.filePath(),
individualFeedbackItem.lineStart() + 1);
}
feedback.setReference(String.format("file:%s_line:%d", individualFeedbackItem.filePath(), individualFeedbackItem.lineStart()));
}
else {
feedbackText = String.format(NON_GRADED_FEEDBACK_SUGGESTION + "File %s", individualFeedbackItem.filePath());
feedbackText = String.format(PRELIMINARY_FEEDBACK_PREFIX + "File %s", individualFeedbackItem.filePath());
}
feedback.setText(feedbackText);
feedback.setDetailText(individualFeedbackItem.description());
Expand Down
12 changes: 9 additions & 3 deletions src/main/webapp/app/entities/feedback.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export const SUBMISSION_POLICY_FEEDBACK_IDENTIFIER = 'SubPolFeedbackIdentifier:'
export const FEEDBACK_SUGGESTION_IDENTIFIER = 'FeedbackSuggestion:';
export const FEEDBACK_SUGGESTION_ACCEPTED_IDENTIFIER = 'FeedbackSuggestion:accepted:';
export const FEEDBACK_SUGGESTION_ADAPTED_IDENTIFIER = 'FeedbackSuggestion:adapted:';
export const NON_GRADED_FEEDBACK_SUGGESTION_IDENTIFIER = 'NonGradedFeedbackSuggestion:';
export const PRELIMINARY_FEEDBACK_IDENTIFIER = 'NonGradedFeedbackSuggestion:';

export interface DropInfo {
instruction: GradingInstruction;
Expand Down Expand Up @@ -123,11 +123,11 @@ export class Feedback implements BaseEntity {
return that.text.startsWith(FEEDBACK_SUGGESTION_IDENTIFIER);
}

public static isNonGradedFeedbackSuggestion(that: Feedback): boolean {
public static isPreliminaryFeedback(that: Feedback): boolean {
if (!that.text) {
return false;
}
return that.text.startsWith(NON_GRADED_FEEDBACK_SUGGESTION_IDENTIFIER);
return that.text.startsWith(PRELIMINARY_FEEDBACK_IDENTIFIER);
}

/**
Expand Down Expand Up @@ -297,6 +297,12 @@ export const buildFeedbackTextForReview = (feedback: Feedback, addFeedbackText =
}
} else if (feedback.detailText) {
feedbackText = feedback.detailText;
if (feedback.text && feedback.text.includes('lines')) {
const linesInfo = feedback.text.match(/lines .*/);
if (linesInfo) {
feedbackText += ` (${linesInfo[0]})`;
}
}
} else if (addFeedbackText && feedback.text) {
feedbackText = feedback.text;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@
[translateValues]="{ text: this.feedback | feedbackContent | quoted: ' ' }"
deleteQuestion="artemisApp.feedback.delete.question"
type="submit"
(delete)="deleteFeedback()"
(delete)="deleteFeedback(false)"
[dialogError]="dialogError$"
class="btn btn-danger btn-sm me-1"
>
Expand All @@ -88,24 +88,31 @@
}
</div>
} @else {
<div class="p-1">
<div class="p-1 position-relative">
@if (Feedback.isPreliminaryFeedback(feedback)) {
<button
type="button"
class="btn-close cross position-absolute top-0 end-0 m-1 rounded-circle"
aria-label="Close"
(click)="deleteFeedback(true)"
[ngbTooltip]="'entity.action.close' | artemisTranslate"
></button>
}
<div class="row flex-nowrap align-items-top m-1">
<div class="col flex-grow-0 ps-0">
<h5 class="d-inline">
@if (!Feedback.isNonGradedFeedbackSuggestion(feedback)) {
<span
class="badge"
[class.bg-success]="feedback.credits! > 0 && feedback.isSubsequent === undefined"
[class.bg-danger]="feedback.credits! < 0 && feedback.isSubsequent === undefined"
[class.bg-warning]="feedback.credits === 0 && feedback.isSubsequent === undefined"
[class.bg-secondary]="readOnly && feedback.isSubsequent"
>{{ roundScoreSpecifiedByCourseSettings(feedback.credits, course) + 'P' }}</span
>
}
<span
class="badge"
[class.bg-success]="feedback.credits! > 0 && feedback.isSubsequent === undefined"
[class.bg-danger]="feedback.credits! < 0 && feedback.isSubsequent === undefined"
[class.bg-warning]="feedback.credits === 0 && feedback.isSubsequent === undefined"
[class.bg-secondary]="readOnly && feedback.isSubsequent"
>{{ roundScoreSpecifiedByCourseSettings(feedback.credits, course) + 'P' }}</span
>
</h5>
</div>
<div class="col-10 ps-0 flex-grow-1 flex-shrink-1">
@if (Feedback.isNonGradedFeedbackSuggestion(feedback)) {
@if (Feedback.isPreliminaryFeedback(feedback)) {
<h6 class="d-inline mb-1" jhiTranslate="artemisApp.assessment.detail.feedback"></h6>
<p [innerHTML]="buildFeedbackTextForCodeEditor(feedback)" class="mt-1 mb-0"></p>
} @else {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
.cross {
width: 20px;
height: 20px;
padding: 2px;
display: flex;
align-items: center;
justify-content: center;
border: 1px solid #000;

span {
font-size: 10px;
line-height: 1;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { cloneDeep } from 'lodash-es';
import { StructuredGradingCriterionService } from 'app/exercises/shared/structured-grading-criterion/structured-grading-criterion.service';
import { roundValueSpecifiedByCourseSettings } from 'app/shared/util/utils';
import { Course } from 'app/entities/course.model';
import { faBan, faExclamationTriangle, faPencilAlt, faQuestionCircle, faSave, faTrashAlt } from '@fortawesome/free-solid-svg-icons';
import { faBan, faExclamationTriangle, faPencilAlt, faQuestionCircle, faSave, faTimes, faTrashAlt } from '@fortawesome/free-solid-svg-icons';
import { Subject } from 'rxjs';
import { TranslateDirective } from 'app/shared/language/translate.directive';
import { FaIconComponent } from '@fortawesome/angular-fontawesome';
Expand All @@ -18,10 +18,12 @@ import { AssessmentCorrectionRoundBadgeComponent } from 'app/assessment/unrefere
import { ArtemisTranslatePipe } from 'app/shared/pipes/artemis-translate.pipe';
import { FeedbackContentPipe } from 'app/shared/pipes/feedback-content.pipe';
import { QuotePipe } from 'app/shared/pipes/quote.pipe';
import { AlertService } from 'app/core/util/alert.service';

@Component({
selector: 'jhi-code-editor-tutor-assessment-inline-feedback',
templateUrl: './code-editor-tutor-assessment-inline-feedback.component.html',
styleUrls: ['./code-editor-tutor-assessment-inline-feedback.component.scss'],
imports: [
FeedbackSuggestionBadgeComponent,
TranslateDirective,
Expand All @@ -41,7 +43,10 @@ export class CodeEditorTutorAssessmentInlineFeedbackComponent {
// Needed for the outer editor to access the DOM node of this component
public elementRef = inject(ElementRef);

@Input() get feedback(): Feedback {
private alertService = inject(AlertService);

@Input()
get feedback(): Feedback {
return this._feedback;
}
set feedback(feedback: Feedback | undefined) {
Expand Down Expand Up @@ -81,6 +86,7 @@ export class CodeEditorTutorAssessmentInlineFeedbackComponent {
faPencilAlt = faPencilAlt;
faTrashAlt = faTrashAlt;
faExclamationTriangle = faExclamationTriangle;
faTimes = faTimes;

/**
* Updates the current feedback and sets props and emits the feedback to parent component
Expand Down Expand Up @@ -111,9 +117,18 @@ export class CodeEditorTutorAssessmentInlineFeedbackComponent {
}

/**
* Deletes feedback after confirmation and emits to parent component
* Deletes feedback with a notification and emits to parent component
*/
deleteFeedback() {
deleteFeedback(preliminary: boolean) {
if (preliminary) {
const storageKey = 'jhi-code-editor-tutor-assessment-inline-feedback.showReopenHint';

if (!localStorage.getItem(storageKey)) {
this.alertService.success('artemisApp.editor.showReopenFeedbackHint');
localStorage.setItem(storageKey, 'true');
}
}

this.onDeleteFeedback.emit(this.feedback);
this.dialogErrorSource.next('');
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@
[showEditorInstructions]="showEditorInstructions"
[isTutorAssessment]="hasTutorAssessment"
[readOnlyManualFeedback]="true"
[latestResult]="latestResult"
[course]="course"
[disableReopenFeedbackButton]="false"
>
<div editorTitle>
<span>{{ exercise?.title }}</span>
Expand Down Expand Up @@ -63,17 +65,18 @@
<jhi-code-editor-repository-is-locked class="me-3" />
}
@if (participation) {
<jhi-updating-result
[exercise]="exercise"
[showUngradedResults]="true"
[showBadge]="true"
[participation]="participation"
[personalParticipation]="true"
(onParticipationChange)="receivedNewResult()"
[showProgressBar]="true"
[showProgressBarBorder]="true"
class="me-2"
/>
<jhi-updating-result
[exercise]="exercise"
[showUngradedResults]="true"
[showBadge]="true"
[participation]="participation"
[personalParticipation]="true"
(onParticipationChange)="receivedParticipationChange()"
(showResult)="receivedNewResult($event)"
[showProgressBar]="true"
[showProgressBarBorder]="true"
class="me-2"
/>
}
<jhi-programming-exercise-student-trigger-build-button
class="me-2"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,11 @@ export class CodeEditorStudentContainerComponent implements OnInit, OnDestroy {
return [];
}

receivedNewResult() {
receivedParticipationChange() {
this.getNumberOfSubmissionsForSubmissionPolicy();
}

receivedNewResult(result: Result) {
this.latestResult = result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,18 +36,20 @@ <h4 class="editor-title"><ng-content select="[editorTitle]" /></h4>
[highlightFileChanges]="highlightFileChanges"
[fileBadges]="fileBadges"
[allowHiddenFiles]="allowHiddenFiles"
[disableReopenFeedbackButton]="disableReopenFeedbackButton"
[(selectedFile)]="selectedFile"
[(commitState)]="commitState"
(onFileChange)="onFileChange($event)"
(onError)="onError($event)"
(onToggleCollapse)="onToggleCollapse($event, CollapsableCodeEditorElement.FileBrowser)"
(onReopenFeedback)="onReopenFeedback($event)"
/>
<ng-container editorCenter>
<jhi-code-editor-monaco
[commitState]="commitState"
[editorState]="editorState"
[course]="course"
[feedbacks]="showInlineFeedback ? (participation?.results?.[0]?.feedbacks ?? []) : []"
[feedbacks]="showInlineFeedback ? (this.latestResult?.feedbacks ?? participation?.results?.[0]?.feedbacks ?? []) : []"
[feedbackSuggestions]="feedbackSuggestions"
[readOnlyManualFeedback]="readOnlyManualFeedback"
[disableActions]="!editable"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,13 @@ import { CodeEditorActionsComponent } from 'app/exercises/programming/shared/cod
import { CodeEditorBuildOutputComponent } from 'app/exercises/programming/shared/code-editor/build-output/code-editor-build-output.component';
import { Participation } from 'app/entities/participation/participation.model';
import { CodeEditorInstructionsComponent } from 'app/exercises/programming/shared/code-editor/instructions/code-editor-instructions.component';
import { Feedback } from 'app/entities/feedback.model';
import { Feedback, PRELIMINARY_FEEDBACK_IDENTIFIER } from 'app/entities/feedback.model';
import { Course } from 'app/entities/course.model';
import { ConnectionError } from 'app/exercises/programming/shared/code-editor/service/code-editor-repository.service';
import { Annotation, CodeEditorMonacoComponent } from 'app/exercises/programming/shared/code-editor/monaco/code-editor-monaco.component';
import { KeysPipe } from 'app/shared/pipes/keys.pipe';
import { ComponentCanDeactivate } from 'app/shared/guard/can-deactivate.model';
import { Result } from 'app/entities/result.model';
import { AssessmentType } from 'app/entities/assessment-type.model';

export enum CollapsableCodeEditorElement {
FileBrowser,
Expand All @@ -47,7 +48,7 @@ export enum CollapsableCodeEditorElement {
KeysPipe,
],
})
export class CodeEditorContainerComponent implements OnChanges, ComponentCanDeactivate {
export class CodeEditorContainerComponent implements OnChanges {
private translateService = inject(TranslateService);
private alertService = inject(AlertService);
private fileService = inject(CodeEditorFileService);
Expand Down Expand Up @@ -87,6 +88,8 @@ export class CodeEditorContainerComponent implements OnChanges, ComponentCanDeac
highlightDifferences: boolean;
@Input()
disableAutoSave = false;
@Input()
disableReopenFeedbackButton = true;

@Output()
onCommitStateChange = new EventEmitter<CommitState>();
Expand All @@ -102,6 +105,8 @@ export class CodeEditorContainerComponent implements OnChanges, ComponentCanDeac
onDiscardSuggestion = new EventEmitter<Feedback>();
@Input()
course?: Course;
@Input()
latestResult?: Result;

/** Work in Progress: temporary properties needed to get first prototype working */

Expand All @@ -127,9 +132,12 @@ export class CodeEditorContainerComponent implements OnChanges, ComponentCanDeac
}

ngOnChanges(changes: SimpleChanges) {
// Update file badges when feedback suggestions change
// Update file badges when feedback or feedback suggestions change
if (changes.feedbackSuggestions) {
this.updateFileBadges();
this.updateFileBadgesForFeedbackSuggestions();
}
if (changes.latestResult) {
this.updateFileBadgesForPreliminaryFeedback();
}
}

Expand Down Expand Up @@ -160,9 +168,9 @@ export class CodeEditorContainerComponent implements OnChanges, ComponentCanDeac
}

/**
* Update the file badges for the code editor (currently only feedback suggestions)
* Update the file badges for the code editor for feedback suggestions
*/
updateFileBadges() {
updateFileBadgesForFeedbackSuggestions() {
this.fileBadges = {};
// Create badges for feedback suggestions
// Get file paths from feedback suggestions:
Expand All @@ -176,6 +184,27 @@ export class CodeEditorContainerComponent implements OnChanges, ComponentCanDeac
}
}

/**
* Update the file badges for the code editor for preliminary feedback
*/
updateFileBadgesForPreliminaryFeedback() {
this.fileBadges = {};
if (this.latestResult?.assessmentType !== AssessmentType.AUTOMATIC_ATHENA) {
return;
}
// Create badges for preliminary feedback
const feedbacks = this.latestResult?.feedbacks ?? [];
// Count only preliminary feedback
const filteredFeedbacks = feedbacks.filter((feedback) => feedback.text?.startsWith(PRELIMINARY_FEEDBACK_IDENTIFIER));
// Get file paths from feedback:
const filePaths = filteredFeedbacks.map((feedback) => Feedback.getReferenceFilePath(feedback)).filter((filePath) => filePath !== undefined) as string[];
for (const filePath of filePaths) {
// Count the number of feedback for this file
const feedbackCount = filteredFeedbacks.filter((feedback) => Feedback.getReferenceFilePath(feedback) === filePath).length;
this.fileBadges[filePath] = [new FileBadge(FileBadgeType.PRELIMINARY_FEEDBACK, feedbackCount)];
}
}

/**
* Resets all variables of this class.
* When a new variable is added, it needs to be added to this method!
Expand Down Expand Up @@ -322,4 +351,12 @@ export class CodeEditorContainerComponent implements OnChanges, ComponentCanDeac
}
return true;
}

/**
* Forces the code editor to refresh the feedback it shows.
* @param fileName The name of the file
*/
onReopenFeedback(fileName: string) {
this.monacoEditor.refreshFeedback(fileName);
}
}
Loading
Loading