Skip to content

Conversation

HawKhiem
Copy link
Contributor

@HawKhiem HawKhiem commented Aug 31, 2025

Checklist

General

Client

  • Important: I implemented the changes with a very good performance, prevented unnecessary REST calls, and kept the UI responsive (debounced preview updates).
  • I strictly followed the client coding and design guidelines.
  • Following the theming guidelines, I specified colors only via theme variables and verified light/dark consistency.
  • I added integration/unit tests (Jest) for the affected components (file tree entry + smart preview behavior).
  • I documented the TypeScript code using JSDoc style where appropriate.
  • I added screenshots/screencasts of the UI changes.
  • I translated newly inserted strings into English and German.

Changes affecting Programming Exercises

  • Client-side changes only; CI/VC and server behavior are unchanged.

Motivation and Context

Instructors editing programming exercises previously had to switch contexts to modify the problem statement. This PR addresses the issue #10968 and integrates the Problem Statement directly into the editor’s file tree as a selectable item, enabling a unified editing experience in Monaco with a live preview.

Description

  • File tree
    • Adds a persistent “Problem Statement” pseudo-file pinned at the top.
    • Distinct icon and visual styling to differentiate it from repository files (template/solution/tests).
    • Always visible (also when the repository is empty or loading), hidden only in explicit repository-only views.
  • Main editor
    • Selecting Problem Statement opens markdown in Monaco with syntax highlighting.
    • Live preview updates with a short debounce to handle large content (e.g., PlantUML).
  • Persistence
    • Saving (button or Ctrl/Cmd+S) persists content via the existing mechanism; no model changes.

Steps for Testing

Prerequisites:

  • 1 Instructor
  • 1 Student
  • 1 Programming Exercise which allows online code editor

I. Test 1:

  1. Log in as instructor and open Edit in Editor for the exercise.
  2. Verify the file tree shows Problem Statement at the top with distinct styling.
  3. Click Problem Statement:
    • Monaco displays markdown with proper syntax highlighting.
  4. Type in the markdown:
    • Preview updates after a short debounce.
  5. Save via button or Ctrl/Cmd+S:
    • Reload to confirm persistence.
  6. Click on Go to Repository
    • Confirm there is no Problem Statement entry in the file tree

II. Test 2:

  1. Log in as student/instructor and open any programming exercise which allows online editor.
  2. Start the exercise and click on Open code editor
  3. Verify the file tree does not contain Problem Statement entry.
  4. Solve the exercise
  5. Log in again as an instructor and assess the exercise
  6. Verify that the file tree does not contain Problem Statement entry.

Exam Mode Testing

Prerequisites:

  • 1 Instructor
  • 1 Students
  • 1 Exam with a Programming Exercise which allows online code editor
  1. Log in to Artemis
  2. Participate in the exam as a student
  3. Start the exercise and click on Open code editor
  4. Wait till the exam is finished
  5. Log in again as an instructor and assess the exercise
  6. Verify that the file tree does not contain Problem Statement entry.

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

Performance Review

  • I (as a reviewer) confirm that the client changes (in particular related to REST calls and UI responsiveness) are implemented with a very good performance even for very large courses with more than 2000 students.
  • I (as a reviewer) confirm that the server changes (in particular related to database calls) are implemented with a very good performance even for very large courses with more than 2000 students.

Code Review

  • Code Review 1
  • Code Review 2

Manual Tests

  • Test 1
  • Test 2

Test Coverage

Screenshots

  1. Problem statement entry on top of the file tree (when click on Edit in Editor)
image
  1. Problem statement entry should not be visible when clicking on Go to Repository
image
  1. Problem statement entry should not be visible when solving the exercise via the online editor
image
  1. Problem statement entry should not be visible when assessing students' submissions

  2. All of the above requirements should be applicable for programming exercise in exam

Summary by CodeRabbit

  • New Features

    • Repository-view toggle for the code editor (student, exam, tutor); show-editor-instructions option; Problem Statement added as a top, protected file with dedicated UI and inline creation. Center editor supports editable instructions with debounced live-preview and a preview-only right panel.
  • Bug Fixes

    • Prevent saving/deleting/renaming Problem Statement; improved null-safety and guarded file operations.
  • Style

    • Problem Statement visuals, layout/resizer UX tweaks, and a shrinkable center area.
  • Tests

    • Expanded coverage for Problem Statement and tree interactions.
  • Chores

    • Added editor-specific i18n keys.

@HawKhiem HawKhiem self-assigned this Aug 31, 2025
@HawKhiem HawKhiem added feature client Pull requests that update TypeScript code. (Added Automatically!) labels Aug 31, 2025
@github-project-automation github-project-automation bot moved this to Work In Progress in Artemis Development Aug 31, 2025
@github-actions github-actions bot added exam Pull requests that affect the corresponding module programming Pull requests that affect the corresponding module labels Aug 31, 2025
@HawKhiem HawKhiem changed the title Programming Exercises: Add problem statement as a selectable file in the editor with live preview Programming exercises: Add problem statement as a selectable file in the editor with live preview Aug 31, 2025
@helios-aet helios-aet bot temporarily deployed to artemis-test1.artemis.cit.tum.de August 31, 2025 12:21 Inactive
Copy link

End-to-End (E2E) Test Results Summary

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

Copy link

End-to-End (E2E) Test Results Summary

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

Copy link

End-to-End (E2E) Test Results Summary

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

@HawKhiem HawKhiem marked this pull request as ready for review August 31, 2025 14:02
@HawKhiem HawKhiem requested review from a team and krusche as code owners August 31, 2025 14:02
@helios-aet helios-aet bot temporarily deployed to artemis-test1.artemis.cit.tum.de August 31, 2025 14:05 Inactive
Copy link
Contributor

coderabbitai bot commented Aug 31, 2025

Caution

Review failed

The pull request is closed.

Walkthrough

Introduce a Problem Statement pseudo-file type and UI node, prevent repository operations on it, add repository-view flag to the code-editor container, conditionally render instructions (with debounced preview) for the Problem Statement, update file-browser behavior/styles/tests, filter PS updates from repository saves, and adjust layout/resizing for the center area.

Changes

Cohort / File(s) Summary of edits
Repository view flag bindings
src/main/webapp/app/exam/overview/exercises/programming/programming-exam-submission.component.html, src/main/webapp/app/programming/manage/assess/code-editor-tutor-assessment-container/code-editor-tutor-assessment-container.component.html, src/main/webapp/app/programming/overview/code-editor-student-container/code-editor-student-container.component.html, src/main/webapp/app/shared/code-editor-container/jhi-code-editor-container.component.ts
Added [forRepositoryView]="true" to several jhi-code-editor-container usages and introduced a forRepositoryView input on the container component.
Problem Statement model
src/main/webapp/app/programming/shared/code-editor/model/code-editor.model.ts
Added FileType.PROBLEM_STATEMENT and exported PROBLEM_STATEMENT_IDENTIFIER = '__problem_statement__'.
File browser: PS integration, component, template, styles, tests
src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.component.ts, .../code-editor-file-browser.component.html, .../code-editor-file-browser.component.spec.ts, .../code-editor-file-browser.scss, .../problem-statement/code-editor-file-browser-problem-statement.component.ts, .../problem-statement/code-editor-file-browser-problem-statement.component.html
Treat Problem Statement as a first-class pseudo-file: inject PS into repositoryFiles when appropriate, show PS first in the tree, add participation and filesTreeViewItem, prevent PS rename/delete, add standalone PS node component/template and styles, update tests to cover PS scenarios, add inline create-node branch, and improve null-safety.
Center editor conditional rendering & API changes
src/main/webapp/app/programming/manage/code-editor/container/code-editor-container.component.html, src/main/webapp/app/programming/manage/code-editor/container/code-editor-container.component.ts
When selectedFile === problemStatementIdentifier && showEditorInstructions && !forRepositoryView render jhi-code-editor-instructions instead of Monaco; introduced private backing selectedFileValue with public get/set selectedFile, added problemStatementIdentifier getter, used optional chaining for monaco interactions, and added showEditorInstructions input passed to file-browser.
Monaco / repository / delete guards
src/main/webapp/app/programming/shared/code-editor/monaco/code-editor-monaco.component.ts, src/main/webapp/app/programming/shared/code-editor/services/code-editor-repository.service.ts, src/main/webapp/app/programming/manage/code-editor/file-browser/delete/code-editor-file-browser-delete.ts
Monaco: ignore DeleteFileChange events for PROBLEM_STATEMENT. Repository service: filter out updates referencing PROBLEM_STATEMENT_IDENTIFIER before sending PUT. Delete modal: early-return and close modal when attempting to delete PS (skip server delete).
Instructions, instructor/editor containers, preview pipeline
src/main/webapp/app/programming/shared/code-editor/instructions/code-editor-instructions.component.ts, .../code-editor-instructions.component.html, src/main/webapp/app/programming/manage/code-editor/instructor-and-editor-container/code-editor-instructor-and-editor-container.component.html, .../code-editor-instructor-and-editor-container.component.ts, .../code-editor-instructor-base-container.component.ts, src/main/webapp/app/programming/manage/instructions-editor/programming-exercise-editable-instruction.component.html, .../programming-exercise-editable-instruction.scss
Added signal inputs disableCollapse and isEditor to instructions component and gate collapse; moved editable instructions to center and added preview-only right pane; introduced previewEvents$ debounced observable and onInstructionChanged(markdown) to drive preview updates; simplified editable-instruction template and adjusted styles/bindings.
Layout / grid / resizing changes
src/main/webapp/app/programming/shared/code-editor/layout/code-editor-grid/code-editor-grid.scss
Make center area shrinkable (min-width: 0 / min-height: 0), improve resizer grab usability, and reorganize collapsed-sidebar rules to prevent overflow and support center shrinking.
i18n
src/main/webapp/i18n/en/exercise.json, src/main/webapp/i18n/de/exercise.json
Added exercise.problemStatementEditor translation key in English and German.
Monaco safety & repository filtering
src/main/webapp/app/programming/shared/code-editor/monaco/code-editor-monaco.component.ts, src/main/webapp/app/programming/shared/code-editor/services/code-editor-repository.service.ts
Added guard to skip handling DeleteFileChange for PROBLEM_STATEMENT; repository file updates are filtered to exclude PS updates before HTTP save.
Delete modal guard
src/main/webapp/app/programming/manage/code-editor/file-browser/delete/code-editor-file-browser-delete.ts
Prevent deletion flow for PS by early return and closing modal.
Misc — tests & tooling
supporting_scripts/code-coverage/module-coverage-client/check-client-module-coverage.mjs, plus test updates in file-browser spec
Adjusted coverage thresholds slightly; extended file-browser tests to exercise PS scenarios and wired the PS component into the test module.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant User
  participant FileBrowser
  participant EditorContainer as CodeEditorContainer
  participant Instructions as Instructions (center)
  participant Monaco as Monaco Editor

  User->>FileBrowser: click node (path or __problem_statement__)
  FileBrowser-->>EditorContainer: set selectedFile(path)
  EditorContainer->>EditorContainer: evaluate selectedFile === problemStatementIdentifier && showEditorInstructions && !forRepositoryView
  alt Problem Statement selected (instructions shown)
    EditorContainer-->>Instructions: render (isEditor: false, disableCollapse: true)
  else Regular file or repository view
    EditorContainer-->>Monaco: render Monaco editor with sessionId and file events
  end
Loading
sequenceDiagram
  autonumber
  participant User
  participant RepoService as CodeEditorRepositoryFileService
  participant Server

  User->>RepoService: updateFiles(fileUpdates[])
  RepoService->>RepoService: filtered = fileUpdates.filter(u => !u.fileName.includes(PROBLEM_STATEMENT_IDENTIFIER))
  RepoService->>Server: PUT /api/repository/files with filtered
  Server-->>RepoService: 200 OK
  RepoService-->>User: complete
  Note over RepoService: Problem Statement pseudo-file updates excluded from save
Loading
sequenceDiagram
  autonumber
  participant Editor as InstructorBase
  participant User
  participant Preview as Instructions Preview

  User->>Editor: edit problemStatement markdown
  Editor->>Editor: onInstructionChanged(markdown) -> push to subject
  Editor->>Editor: debounce 200ms, map to void, shareReplay
  Editor-->>Preview: previewEvents$ triggers preview render
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed The title clearly and concisely summarizes the primary client change: adding the Problem Statement as a selectable file in the editor and providing a live preview. It matches the PR objectives and the file-level changes (problem-statement file/tree entry, preview event pipeline, UI wiring, translations, and tests) and is specific enough for teammates scanning history.
Docstring Coverage ✅ Passed No functions found in the changes. Docstring coverage check skipped.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5b422d8 and fa94aed.

📒 Files selected for processing (3)
  • src/main/webapp/app/programming/manage/code-editor/container/code-editor-container.component.ts (6 hunks)
  • src/main/webapp/app/programming/shared/code-editor/monaco/code-editor-monaco.component.ts (1 hunks)
  • supporting_scripts/code-coverage/module-coverage-client/check-client-module-coverage.mjs (1 hunks)

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

Caution

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

⚠️ Outside diff range comments (4)
src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.component.html (1)

124-131: Fix: pass correct parent folder to create-node

When creating inside a folder, [folder] should be the folder path, not empty. Otherwise the create component cannot derive the correct target path.

Apply this diff:

-            [folder]="''"
+            [folder]="item.value"
src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.component.spec.ts (2)

274-279: Fix unsupported Jest matcher

toHaveBeenCalledExactlyOnceWith is not standard in Jest/Jest-Extended and will likely fail CI. Use a combination of toHaveBeenCalledTimes(1) and toHaveBeenCalledWith.

-        expect(transformTreeToTreeViewItemStub).toHaveBeenCalledExactlyOnceWith([treeNode]);
+        expect(transformTreeToTreeViewItemStub).toHaveBeenCalledTimes(1);
+        expect(transformTreeToTreeViewItemStub).toHaveBeenCalledWith([treeNode]);

807-837: Test bug: renaming a folder is flagged as FILE

The setup uses FileType.FILE for a folder rename. This can mask logic errors and reduce test fidelity.

-        comp.renamingFile = [folderName, folderName, FileType.FILE];
+        comp.renamingFile = [folderName, folderName, FileType.FOLDER];
src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.component.ts (1)

642-651: Block destructive/invalid operations on the Problem Statement node.

Prevent rename/delete/create using the reserved identifier; otherwise backend calls will fail or corrupt state.

 openDeleteFileModal(item: TreeViewItem<string>) {
     const { value: filePath } = item;
     const fileType = this.repositoryFiles[filePath];
-    if (filePath) {
+    if (filePath && fileType !== FileType.PROBLEM_STATEMENT) {
         const modalRef = this.modalService.open(CodeEditorFileBrowserDeleteComponent, { keyboard: true, size: 'lg' });
         modalRef.componentInstance.parent = this;
         modalRef.componentInstance.fileNameToDelete = filePath;
         modalRef.componentInstance.fileType = fileType;
     }
 }
@@
 setRenamingFile(item: TreeViewItem<string>) {
-    this.renamingFile = [item.value, item.text, this.repositoryFiles[item.value]];
+    if (this.repositoryFiles[item.value] === FileType.PROBLEM_STATEMENT) {
+        return;
+    }
+    this.renamingFile = [item.value, item.text, this.repositoryFiles[item.value]];
 }
@@
 onRenameFile(event: any) {
     const newFileNamePath = event as string;
@@
-    const [filePath, , fileType] = this.renamingFile;
+    const [filePath, , fileType] = this.renamingFile;
+    if (this.isProblemStatement(filePath) || newFileName === this.PROBLEM_STATEMENT_IDENTIFIER) {
+        this.onError.emit('unsupportedFile');
+        return;
+    }
@@
 onCreateFile(fileName: string) {
@@
-    const file = folderPath ? `${folderPath}/${fileName}` : fileName;
+    const file = folderPath ? `${folderPath}/${fileName}` : fileName;
+    if (this.isProblemStatement(file)) {
+        this.onError.emit('unsupportedFile');
+        return;
+    }

Also applies to: 535-537, 523-530, 549-582

🧹 Nitpick comments (20)
src/main/webapp/app/programming/shared/code-editor/instructions/code-editor-instructions.component.ts (1)

56-66: Type the event and simplify stopPropagation call

Use the base Event type and optional chaining for stopPropagation; keeps the API tighter without changing behavior.

-    toggleEditorCollapse(event: any) {
+    toggleEditorCollapse(event: Event) {
         // make instructions monaco editor in the main editor not collapsible
         if (this.disableCollapse) {
-            if (event?.stopPropagation) {
-                event.stopPropagation();
-            }
+            event?.stopPropagation?.();
             return;
         }
src/main/webapp/app/programming/manage/code-editor/instructor-and-editor-container/code-editor-instructor-base-container.component.ts (3)

22-24: Consolidate RxJS imports

Minor style: merge duplicate rxjs/operators imports into the existing lines to reduce import churn.


82-86: Debounce is good; add distinctUntilChanged to avoid redundant renders

Avoid issuing preview ticks when the markdown text hasn’t changed (helps with frequent cursor movements or identical saves).

-    previewEvents$ = this.problemStatementChanges$.pipe(
-        debounceTime(200), // TODO: consider to prune to 300–500ms for PlantUML-heavy content
-        map(() => void 0), // Observable<void>
-        shareReplay({ bufferSize: 1, refCount: true }), // replay latest for late subscribers
-    );
+    previewEvents$ = this.problemStatementChanges$.pipe(
+        debounceTime(200), // TODO: consider 300–500ms for PlantUML-heavy content
+        distinctUntilChanged(),
+        map(() => void 0),
+        shareReplay({ bufferSize: 1, refCount: true }),
+    );

Note: add distinctUntilChanged import from rxjs/operators.


159-162: Public bridge method is clear; consider completing the Subject on destroy

Completing the Subject is a tiny safety to release references after teardown.

     ngOnDestroy() {
+        this.problemStatementChanges$.complete();
         if (this.domainChangeSubscription) {
             this.domainChangeSubscription.unsubscribe();
         }
         if (this.paramSub) {
             this.paramSub.unsubscribe();
         }
     }
src/main/webapp/app/programming/manage/instructions-editor/programming-exercise-editable-instruction.scss (3)

8-11: Make tooltip width responsive instead of fixed 500px.

Use max-width and allow wrapping to avoid overflow on small screens.

-    .tooltip-inner {
-        width: 500px;
-    }
+    .tooltip-inner {
+        max-width: min(500px, 90vw);
+        white-space: normal;
+        word-wrap: break-word;
+    }

31-35: Avoid !important if possible.

If this is to beat overly-scoped third-party styles, consider a slightly more specific selector instead of !important.

-    .markdown-editor-wrapper {
-        /* override scoped styling */
-        background-color: var(--markdown-preview-editor-background) !important;
+    .editable-instruction-container .markdown-editor-wrapper {
+        /* override scoped styling without !important */
+        background-color: var(--markdown-preview-editor-background);
     }

81-83: Use theme border variable instead of hard-coded rgba.

Improves dark-mode/theming consistency.

-                border-left: 1px solid rgba(0, 0, 0, 0.125);
+                border-left: 1px solid var(--border-color);
src/main/webapp/app/programming/shared/code-editor/layout/code-editor-grid/code-editor-grid.scss (2)

279-283: Stylelint no-descending-specificity notice: consider placement or annotate.

Your .editor-center .instructions-wrapper__content comes after a more specific right-pane selector targeting the same class; while they don't overlap, the linter warns. Either move the center block above the right-pane block or locally disable the rule.

-/* allow all layers in the center to shrink instead of pushing the right pane */
-.editor-center .instructions-wrapper,
+/* allow all layers in the center to shrink instead of pushing the right pane */
+/* stylelint-disable-next-line no-descending-specificity */
+.editor-center .instructions-wrapper,
-/* contain the markdown editor’s inner flow (it defaults to overflow: visible) */
-.editor-center jhi-markdown-editor-monaco .markdown-editor-wrapper {
+/* contain the markdown editor’s inner flow (it defaults to overflow: visible) */
+/* stylelint-disable-next-line no-descending-specificity */
+.editor-center jhi-markdown-editor-monaco .markdown-editor-wrapper {

Also applies to: 297-302


97-143: Consider extracting shared “collapsed width” into a CSS variable.

Avoids magic 50px in multiple places and eases future changes.

+ :root {
+   --editor-collapsed-width: 50px;
+ }
-    width: 50px !important;
+    width: var(--editor-collapsed-width) !important;
...
-        width: 50px;
+        width: var(--editor-collapsed-width);

Also applies to: 170-227

src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.scss (1)

109-115: Fix stylelint “rule-empty-line-before” notices

Codacy flagged missing empty lines before rules. Insert blank lines to satisfy the rule.

                 .problem-statement-icon {
                     color: var(--bs-primary);
                 }
+
                 .list-group-item__fileName {
                     color: var(--bs-primary);
                     font-weight: 600;
                 }
@@
-            &.node-selected .problem-statement-icon,
+            
+            &.node-selected .problem-statement-icon,
             &.node-selected .list-group-item__fileName {
                 color: inherit;
                 font-weight: inherit;
             }

Also applies to: 120-124

src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.component.html (2)

89-105: Avoid calling methods from templates (perf + guideline)

[getFolderBadges(item)] is invoked per CD cycle. Our guidelines state methods_in_html:false. Precompute badges per folder in the TS (e.g., cache on collapse/expand) or use a pure pipe.


83-86: Event payload: prefer forwarding $event

Minor simplification: let the child emit the selected node and forward it directly instead of closing over item.

-    <jhi-code-editor-file-browser-problem-statement [item]="item" (onNodeSelect)="handleNodeSelected(item)" />
+    <jhi-code-editor-file-browser-problem-statement [item]="item" (onNodeSelect)="handleNodeSelected($event)" />
src/main/webapp/app/programming/manage/code-editor/container/code-editor-container.component.ts (2)

58-60: Two ViewChilds for instructions may be ambiguous

You now have both @ViewChild('rightInstructions') rightInstructions and @ViewChild(CodeEditorInstructionsComponent) instructions. With two instances in the template, the type-based query can bind to an unintended one. Either remove the type-based query or scope both with template refs for determinism.


58-58: Deduplicate PROBLEM_STATEMENT_IDENTIFIER

This magic string is defined in multiple components. Extract a shared constant (e.g., code-editor.constants.ts) and import it to avoid drift.

src/main/webapp/app/programming/manage/code-editor/container/code-editor-container.component.html (2)

83-92: Hide right-side instructions while editing Problem Statement in center

When the center shows instructions (PS selected), also rendering the right panel duplicates content and reduces editor space. Gate the right panel on PS not being selected.

-        @if (showEditorInstructions) {
+        @if (showEditorInstructions && selectedFile !== PROBLEM_STATEMENT_IDENTIFIER) {

64-66: Avoid methods in template (perf guideline)

[feedbacks]="feedbackForSubmission()" violates methods_in_html:false and can trigger extra work per CD. Expose a cached property updated on relevant inputs (participation/result changes) instead.

src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.component.spec.ts (1)

538-587: Add an assertion to verify correct parent folder is passed to create-node

To prevent regressions (e.g., binding the folder as ''), assert that the create-node receives the expected folder input when creating inside a folder.

I can extend this test to query the component instance and check its folder input equals 'folder2'.

src/main/webapp/app/programming/shared/code-editor/instructions/code-editor-instructions.component.html (1)

12-17: Deduplicate the two conditional label blocks using a single dynamic translation.

This avoids repetition and keeps the collapsed/expanded headers consistent.

-                        @if (!isEditor) {
-                            <span class="header" jhiTranslate="artemisApp.exercise.problemStatement"></span>
-                        }
-                        @if (isEditor) {
-                            <span class="header" jhiTranslate="artemisApp.exercise.problemStatementEditor"></span>
-                        }
+                        <span class="header">
+                            {{ (isEditor ? 'artemisApp.exercise.problemStatementEditor' : 'artemisApp.exercise.problemStatement') | artemisTranslate }}
+                        </span>

Apply the same change in the collapsed header block. Ensure ArtemisTranslatePipe is available to this component.

Also applies to: 31-36

src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.component.ts (2)

306-311: Showing PS on load error is good; also suppress file ops for PS.

Follow-up: ensure PS cannot be renamed/deleted/opened via repository service in error states.


377-388: Top-pinning sort is fine; exclude PS from consumer-facing file lists.

Some consumers of onFileChange and similar APIs expect real repository files only. Filter PS out when emitting file lists to avoid accidental commit/status side-effects.

-        this.onFileChange.emit([Object.keys(this.repositoryFiles), fileChange]);
+        const realFiles = Object.keys(this.repositoryFiles).filter((k) => k !== this.PROBLEM_STATEMENT_IDENTIFIER);
+        this.onFileChange.emit([realFiles, fileChange]);

Apply in any other places where a raw key list is emitted.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 6b53b17 and fd92600.

📒 Files selected for processing (22)
  • src/main/webapp/app/exam/overview/exercises/programming/programming-exam-submission.component.html (1 hunks)
  • src/main/webapp/app/programming/manage/assess/code-editor-tutor-assessment-container/code-editor-tutor-assessment-container.component.html (1 hunks)
  • src/main/webapp/app/programming/manage/code-editor/container/code-editor-container.component.html (1 hunks)
  • src/main/webapp/app/programming/manage/code-editor/container/code-editor-container.component.ts (2 hunks)
  • src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.component.html (2 hunks)
  • src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.component.spec.ts (10 hunks)
  • src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.component.ts (10 hunks)
  • src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.scss (1 hunks)
  • src/main/webapp/app/programming/manage/code-editor/file-browser/problem-statement/code-editor-file-browser-problem-statement.component.html (1 hunks)
  • src/main/webapp/app/programming/manage/code-editor/file-browser/problem-statement/code-editor-file-browser-problem-statement.component.ts (1 hunks)
  • src/main/webapp/app/programming/manage/code-editor/instructor-and-editor-container/code-editor-instructor-and-editor-container.component.html (1 hunks)
  • src/main/webapp/app/programming/manage/code-editor/instructor-and-editor-container/code-editor-instructor-and-editor-container.component.ts (2 hunks)
  • src/main/webapp/app/programming/manage/code-editor/instructor-and-editor-container/code-editor-instructor-base-container.component.ts (5 hunks)
  • src/main/webapp/app/programming/manage/instructions-editor/programming-exercise-editable-instruction.component.html (1 hunks)
  • src/main/webapp/app/programming/manage/instructions-editor/programming-exercise-editable-instruction.scss (3 hunks)
  • src/main/webapp/app/programming/overview/code-editor-student-container/code-editor-student-container.component.html (1 hunks)
  • src/main/webapp/app/programming/shared/code-editor/instructions/code-editor-instructions.component.html (2 hunks)
  • src/main/webapp/app/programming/shared/code-editor/instructions/code-editor-instructions.component.ts (2 hunks)
  • src/main/webapp/app/programming/shared/code-editor/layout/code-editor-grid/code-editor-grid.scss (8 hunks)
  • src/main/webapp/app/programming/shared/code-editor/model/code-editor.model.ts (1 hunks)
  • src/main/webapp/i18n/de/exercise.json (1 hunks)
  • src/main/webapp/i18n/en/exercise.json (1 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
src/main/webapp/**/*.html

⚙️ CodeRabbit configuration file

@if and @for are new and valid Angular syntax replacing *ngIf and *ngFor. They should always be used over the old style.

Files:

  • src/main/webapp/app/programming/manage/code-editor/file-browser/problem-statement/code-editor-file-browser-problem-statement.component.html
  • src/main/webapp/app/programming/shared/code-editor/instructions/code-editor-instructions.component.html
  • src/main/webapp/app/programming/manage/assess/code-editor-tutor-assessment-container/code-editor-tutor-assessment-container.component.html
  • src/main/webapp/app/programming/overview/code-editor-student-container/code-editor-student-container.component.html
  • src/main/webapp/app/exam/overview/exercises/programming/programming-exam-submission.component.html
  • src/main/webapp/app/programming/manage/code-editor/container/code-editor-container.component.html
  • src/main/webapp/app/programming/manage/instructions-editor/programming-exercise-editable-instruction.component.html
  • src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.component.html
  • src/main/webapp/app/programming/manage/code-editor/instructor-and-editor-container/code-editor-instructor-and-editor-container.component.html
src/main/webapp/**/*.ts

⚙️ CodeRabbit configuration file

angular_style:https://angular.io/guide/styleguide;methods_in_html:false;lazy_loading:true;code_reuse:true;tests:meaningful;types:PascalCase;enums:PascalCase;funcs:camelCase;props:camelCase;no_priv_prefix:true;strings:single_quotes;localize:true;btns:functionality;links:navigation;icons_text:newline;labels:associate;code_style:arrow_funcs,curly_braces,open_braces_same_line,indent_4;memory_leak_prevention:true;routes:naming_schema;chart_framework:ngx-charts;responsive_layout:true

Files:

  • src/main/webapp/app/programming/manage/code-editor/file-browser/problem-statement/code-editor-file-browser-problem-statement.component.ts
  • src/main/webapp/app/programming/manage/code-editor/instructor-and-editor-container/code-editor-instructor-and-editor-container.component.ts
  • src/main/webapp/app/programming/shared/code-editor/model/code-editor.model.ts
  • src/main/webapp/app/programming/manage/code-editor/instructor-and-editor-container/code-editor-instructor-base-container.component.ts
  • src/main/webapp/app/programming/shared/code-editor/instructions/code-editor-instructions.component.ts
  • src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.component.spec.ts
  • src/main/webapp/app/programming/manage/code-editor/container/code-editor-container.component.ts
  • src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.component.ts
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/exercise.json
🧠 Learnings (6)
📚 Learning: 2024-10-14T10:27:58.500Z
Learnt from: florian-glombik
PR: ls1intum/Artemis#8858
File: src/main/webapp/i18n/de/student-dashboard.json:36-37
Timestamp: 2024-10-14T10:27:58.500Z
Learning: Avoid suggesting the translation change for "noExercisesFoundWithAppliedFilter" in the PR ls1intum/Artemis#8858. The preferred translation is "Keine Aufgaben passen zu den gewählten Filtern."

Applied to files:

  • src/main/webapp/i18n/de/exercise.json
📚 Learning: 2024-10-08T15:35:52.595Z
Learnt from: florian-glombik
PR: ls1intum/Artemis#8858
File: src/main/webapp/i18n/de/student-dashboard.json:0-0
Timestamp: 2024-10-08T15:35:52.595Z
Learning: Avoid suggesting the phrase "Keine Aufgaben passen zu den gewählten Filtern" for the translation key `noExercisesFoundWithAppliedFilter` in the PR ls1intum/Artemis#8858.

Applied to files:

  • src/main/webapp/i18n/de/exercise.json
📚 Learning: 2024-10-08T15:35:52.595Z
Learnt from: pzdr7
PR: ls1intum/Artemis#9407
File: src/main/webapp/app/shared/monaco-editor/monaco-editor.service.ts:66-66
Timestamp: 2024-10-08T15:35:52.595Z
Learning: In the `MonacoDiffEditorComponent` (`src/main/webapp/app/shared/monaco-editor/monaco-diff-editor.component.ts`), the diff editor is always set to read-only (`readOnly: true`), and there are currently no use cases that require editing in the diff view.

Applied to files:

  • src/main/webapp/app/programming/manage/code-editor/container/code-editor-container.component.html
📚 Learning: 2024-10-20T21:59:11.630Z
Learnt from: pzdr7
PR: ls1intum/Artemis#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/programming/manage/code-editor/container/code-editor-container.component.html
  • src/main/webapp/app/programming/manage/instructions-editor/programming-exercise-editable-instruction.component.html
  • src/main/webapp/app/programming/manage/code-editor/instructor-and-editor-container/code-editor-instructor-and-editor-container.component.html
📚 Learning: 2025-02-11T15:46:35.616Z
Learnt from: Wallenstein61
PR: ls1intum/Artemis#9909
File: src/main/webapp/app/sharing/search-result-dto.model.ts:50-55
Timestamp: 2025-02-11T15:46:35.616Z
Learning: The `IExerciseType` enum in `src/main/webapp/app/sharing/search-result-dto.model.ts` must maintain its current naming (with 'I' prefix) and lowercase string values to ensure compatibility with the external sharing platform connector interface. This is an intentional exception to our TypeScript naming conventions.

Applied to files:

  • src/main/webapp/app/programming/manage/code-editor/instructor-and-editor-container/code-editor-instructor-base-container.component.ts
📚 Learning: 2024-09-30T08:34:49.363Z
Learnt from: iyannsch
PR: ls1intum/Artemis#9379
File: src/main/webapp/app/shared/components/code-button/code-button.component.ts:143-170
Timestamp: 2024-09-30T08:34:49.363Z
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/programming/manage/code-editor/instructor-and-editor-container/code-editor-instructor-base-container.component.ts
🧬 Code graph analysis (3)
src/main/webapp/app/programming/manage/code-editor/file-browser/problem-statement/code-editor-file-browser-problem-statement.component.ts (2)
src/main/webapp/app/programming/manage/code-editor/container/code-editor-container.component.ts (1)
  • Component (36-343)
src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.component.ts (1)
  • Component (65-702)
src/main/webapp/app/programming/manage/code-editor/instructor-and-editor-container/code-editor-instructor-base-container.component.ts (1)
src/main/webapp/app/shared/markdown-editor/monaco/markdown-editor-monaco.component.ts (1)
  • markdown (165-168)
src/main/webapp/app/programming/manage/code-editor/container/code-editor-container.component.ts (1)
src/main/webapp/app/programming/shared/code-editor/model/code-editor.model.ts (1)
  • FileBadge (133-138)
🪛 GitHub Check: Codacy Static Code Analysis
src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.scss

[notice] 111-111: src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.scss#L111
Expected empty line before rule (rule-empty-line-before)


[notice] 120-120: src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.scss#L120
Expected empty line before rule (rule-empty-line-before)

src/main/webapp/app/programming/shared/code-editor/layout/code-editor-grid/code-editor-grid.scss

[notice] 279-279: src/main/webapp/app/programming/shared/code-editor/layout/code-editor-grid/code-editor-grid.scss#L279
Expected selector ".editor-center .instructions-wrapper__content" to come before selector ".editor-wrapper .editor-main .editor-sidebar-right .instructions-wrapper__content", at line 59 (no-descending-specificity)


[notice] 297-297: src/main/webapp/app/programming/shared/code-editor/layout/code-editor-grid/code-editor-grid.scss#L297
Expected selector ".editor-center .instructions-wrapper__content" to come before selector ".editor-wrapper .editor-main .editor-sidebar-right .instructions-wrapper__content", at line 59 (no-descending-specificity)

⏰ 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). (1)
  • GitHub Check: Codacy Static Code Analysis
🔇 Additional comments (28)
src/main/webapp/i18n/en/exercise.json (1)

61-61: LGTM: added translation key

“problemStatementEditor” reads well and matches the intended mode switch in the UI.

src/main/webapp/app/programming/shared/code-editor/instructions/code-editor-instructions.component.ts (1)

23-29: Inputs for editor/preview behavior look good

disableCollapse and isEditor defaults are sensible; matches the template’s conditional behavior.

src/main/webapp/app/programming/manage/code-editor/instructor-and-editor-container/code-editor-instructor-base-container.component.ts (3)

49-51: Good: scoped Subject for PS changes

Private Subject is appropriate; no external writes.


93-97: Initial emissions look fine; ensure no double initial tick

You already guard with != null. With distinctUntilChanged (above), duplicate identical initial emissions won’t re-render.

Also applies to: 111-115


80-86: previewEvents$ and onInstructionChanged wiring verified
Everything is correctly bound—(instructionChange)="onInstructionChanged($event)" and [generateHtmlEvents]="previewEvents$" are in place.

src/main/webapp/app/programming/manage/instructions-editor/programming-exercise-editable-instruction.scss (3)

31-41: Confirm z-index for sticky .nav is sufficient.

z-index: 1 might fall under other sticky headers/overlays (e.g., Monaco). Bump to 2–3 if you notice overlap.

-        .nav {
-            position: sticky;
-            top: 0;
-            z-index: 1;
+        .nav {
+            position: sticky;
+            top: 0;
+            z-index: 3;
             background-color: var(--markdown-preview-editor-background);
         }

60-71: Status grid changes look good; min-width: 0 prevents overflow.

The 1fr 2fr split and min-width: 0 fixes are solid for shrink behavior.

Also applies to: 73-89


84-87: Re-evaluate forced center alignment in status cells.

Centering all direct children may hurt readability of multi-line texts. Consider left-align for textual content.

-                > * {
-                    justify-self: center;
-                    text-align: center;
-                }
+                > * {
+                    justify-self: center;
+                }
+                > *:where(p, span, .text, .label) {
+                    text-align: left;
+                }
src/main/webapp/app/programming/shared/code-editor/layout/code-editor-grid/code-editor-grid.scss (3)

27-31: Good addition of min-width: 0 to allow center strip to shrink.

Prevents right pane from being pushed; matches the PR goal.

Also applies to: 44-51


255-267: Resizer UX improvements look right.

Padding + user-select/touch-action tweaks help grabbing without side effects.


169-227: Right-pane collapsed state hides status; verify a11y.

Hiding with display: none is fine; ensure keyboard focus isn’t trapped on hidden elements and aria-expanded on the toggle reflects state.

src/main/webapp/i18n/de/exercise.json (2)

61-62: German key added is fine and informal requirement is respected.

“Aufgabenstellung (Editor)” introduces no formal address; consistent with the style guide.


61-62: Cross-check EN translation and usage.

Ensure the corresponding English key exists (“Problem Statement (Editor)”) and all templates switch between problemStatement and problemStatementEditor as intended.

src/main/webapp/app/exam/overview/exercises/programming/programming-exam-submission.component.html (2)

19-20: Binding forRepositoryView=true aligns with “hide PS in repository-only views”.

Looks correct for exam online editor; confirm that JhiCodeEditorContainer exposes this @input and defaults remain backward compatible elsewhere.


61-69: Ensure instructions sidebar respects repository-only mode.

Verify that when forRepositoryView=true, the Problem Statement pseudo-file isn’t injected/pinned in the file tree, and the sidebar still renders exercise instructions as before.

src/main/webapp/app/programming/overview/code-editor-student-container/code-editor-student-container.component.html (2)

23-24: forRepositoryView=true is appropriate for student editor view.

Confirms repository-only presentation; ensure other usages of jhi-code-editor-container were updated consistently (e.g., tutor/instructor variants).


82-89: Check class stacking with new center shrink styles.

With the center shrink rules, ensure the .instructions-wrapper__content card-body p-0 still clips overflowing content as intended.

src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.scss (1)

89-127: Solid UX accent for the Problem Statement entry

The left accent bar + primary color treatment reads well and matches the tree’s selection model. No functional concerns.

src/main/webapp/app/programming/manage/code-editor/instructor-and-editor-container/code-editor-instructor-and-editor-container.component.ts (1)

8-8: LGTM: exposes render component to the template

Import + registration look correct for the standalone render component.

Also applies to: 37-37

src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.component.html (1)

110-112: LGTM: null-safe defaults for change indicators and badges

Using optional chaining with nullish coalescing prevents template errors during load and keeps the UI consistent.

src/main/webapp/app/programming/manage/code-editor/container/code-editor-container.component.ts (1)

116-125: LGTM: getter/setter wrapper for selectedFile

Encapsulating selectedFile behind accessors prepares for side effects without changing bindings.

src/main/webapp/app/programming/manage/code-editor/container/code-editor-container.component.html (1)

48-57: LGTM: conditional center-pane rendering for PS

The switch to an instructions center when PS is selected is clean and keeps normal Monaco path intact.

src/main/webapp/app/programming/manage/code-editor/instructor-and-editor-container/code-editor-instructor-and-editor-container.component.html (2)

151-159: LGTM: move editable instructions to center + emit instructionChange

Centering the editable instructions and emitting instructionChange aligns with the new authoring flow.


161-169: LGTM: add preview-only instructions on the right

Right-hand preview wired to previewEvents$ matches the debounced live-preview objective.

src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.component.spec.ts (1)

175-199: LGTM: repository-empty still renders PS node

Good coverage for the empty-repo case with PS presence.

src/main/webapp/app/programming/shared/code-editor/instructions/code-editor-instructions.component.html (1)

51-53: Confirm layout/resize semantics after wrapper change.

Switching from display: contents to a wrapper class can affect the resizable container’s height calculations. Please verify RG/resizer behavior and overflow in narrow viewports.

src/main/webapp/app/programming/manage/code-editor/file-browser/code-editor-file-browser.component.ts (2)

287-289: Guard after backend load to avoid overriding a real file named like the PS.

initializeRepositoryFiles() should not overwrite a real file; the earlier fix covers it. Ensure tests cover this collision case.


30-31: Icon/component wiring LGTM.

Problem Statement component import and faListAlt usage look correct.

Also applies to: 77-81, 172-172

@github-project-automation github-project-automation bot moved this from Work In Progress to Ready For Review in Artemis Development Aug 31, 2025
Copy link

End-to-End (E2E) Test Results Summary

TestsPassed ☑️Skipped ⚠️Failed ❌️Time ⏱
End-to-End (E2E) Test Report205 ran188 passed4 skipped13 failed1h 58m 21s 573ms
TestResultTime ⏱
End-to-End (E2E) Test Report
e2e/exam/ExamTestRun.spec.ts
ts.Exam test run › Manage a test run › Conducts a test run❌ failure6m 5s 81ms
e2e/exam/ExamParticipation.spec.ts
ts.Exam participation › Early Hand-in › Participates as a student in a registered exam❌ failure6m 6s 295ms
e2e/exam/ExamResults.spec.ts
ts.Exam Results › Check exam exercise results › Check exam results for text exercise › Check exam text exercise results❌ failure3m 27s 232ms
e2e/exam/test-exam/TestExamTestRun.spec.ts
ts.Test exam test run › Manage a test run › Conducts a test run❌ failure6m 4s 375ms
e2e/exam/ExamAssessment.spec.ts
ts.Exam assessment › Programming exercise assessment › Assess a programming exercise submission (MANUAL)❌ failure
e2e/exam/ExamResults.spec.ts
ts.Exam Results › Check exam exercise results › Check exam results for programming exercise › Check exam programming exercise results❌ failure6m 5s 91ms
e2e/exercise/ExerciseImport.spec.ts
ts.Import exercises › Imports exercises › Imports programming exercise❌ failure6m 15s 448ms
e2e/exercise/programming/ProgrammingExerciseParticipation.spec.ts
ts.Programming exercise participation › Makes a failing Java submission › Makes a submission using code editor❌ failure6m 3s 642ms
ts.Programming exercise participation › Makes a partially successful Java submission › Makes a submission using code editor❌ failure6m 3s 880ms
ts.Programming exercise participation › Makes a successful Java submission › Makes a submission using code editor❌ failure6m 3s 375ms
ts.Programming exercise participation › Makes a successful C submission › Makes a submission using code editor❌ failure6m 3s 359ms
ts.Programming exercise participation › Makes a successful Python submission › Makes a submission using code editor❌ failure6m 3s 647ms
e2e/exercise/programming/ProgrammingExerciseStaticCodeAnalysis.spec.ts
ts.Static code analysis tests › Configures SCA grading and makes a successful submission with SCA errors❌ failure6m 4s 107ms

sawys777
sawys777 previously approved these changes Sep 1, 2025
Copy link

@sawys777 sawys777 left a comment

Choose a reason for hiding this comment

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

Tested in TS1 as both instructor and tutor, the visibility of the problem statement in the file tree is consistent with the expected behaviour.
review2
reviewa
reviewc

@helios-aet helios-aet bot temporarily deployed to artemis-test4.artemis.cit.tum.de September 4, 2025 11:12 Inactive
tobikli
tobikli previously approved these changes Sep 4, 2025
Copy link
Member

@tobikli tobikli left a comment

Choose a reason for hiding this comment

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

Tested on TS4

Image

Copy link

There hasn't been any activity on this pull request recently. Therefore, this pull request has been automatically marked as stale and will be closed if no further activity occurs within seven days. Thank you for your contributions.

@github-actions github-actions bot added the stale label Sep 11, 2025
@helios-aet helios-aet bot temporarily deployed to artemis-test1.artemis.cit.tum.de September 24, 2025 12:48 Inactive
@helios-aet helios-aet bot temporarily deployed to artemis-test2.artemis.cit.tum.de September 24, 2025 13:11 Inactive
Copy link
Contributor

@FelixTJDietrich FelixTJDietrich left a comment

Choose a reason for hiding this comment

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

Code looks good now, thanks for the changes!

Retested on TS2 and it works as expected.

  • Problem statement editor is now in the middle and has the problem statement toolbar
  • Problem statement live updates responsively after changes in the editor without performance issue thanks to the debouncing
image

The "Go to repository" view is also unchanged:
image

Thanks for the changes!

@Elfari1028
Copy link

@HawKhiem to check client test and see what to do with test coverage: check-module-coverage

Elfari1028
Elfari1028 previously approved these changes Sep 24, 2025
Copy link

@Elfari1028 Elfari1028 left a comment

Choose a reason for hiding this comment

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

walked through, lgtm

@HawKhiem HawKhiem dismissed stale reviews from Elfari1028 and FelixTJDietrich via 5b422d8 September 24, 2025 13:32
Copy link

End-to-End (E2E) Test Results Summary

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

Elfari1028
Elfari1028 previously approved these changes Sep 24, 2025
Copy link

@Elfari1028 Elfari1028 left a comment

Choose a reason for hiding this comment

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

reapprove

Copy link
Contributor

@FelixTJDietrich FelixTJDietrich left a comment

Choose a reason for hiding this comment

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

Reapprove after client coverage change

Copy link

End-to-End (E2E) Test Results Summary

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

KonstiAnon
KonstiAnon previously approved these changes Sep 24, 2025
Copy link
Contributor

@KonstiAnon KonstiAnon left a comment

Choose a reason for hiding this comment

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

Code re-approve

ekayandan
ekayandan previously approved these changes Sep 24, 2025
Copy link
Contributor

@ekayandan ekayandan left a comment

Choose a reason for hiding this comment

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

Code LGTM 👍

LeZhen1105
LeZhen1105 previously approved these changes Sep 25, 2025
Copy link
Contributor

@LeZhen1105 LeZhen1105 left a comment

Choose a reason for hiding this comment

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

reapprove

coderabbitai[bot]
coderabbitai bot previously approved these changes Sep 27, 2025
ShuaiweiYu
ShuaiweiYu previously approved these changes Sep 29, 2025
Copy link
Contributor

@ShuaiweiYu ShuaiweiYu left a comment

Choose a reason for hiding this comment

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

Code LGTM

@krusche krusche added this to the 8.4.1 milestone Oct 3, 2025
@krusche krusche merged commit f720927 into develop Oct 3, 2025
17 of 21 checks passed
@krusche krusche deleted the feature/programming-exercises/problem-statement-file-tree branch October 3, 2025 19:47
@github-project-automation github-project-automation bot moved this from Ready For Review to Merged in Artemis Development Oct 3, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
client Pull requests that update TypeScript code. (Added Automatically!) exam Pull requests that affect the corresponding module feature programming Pull requests that affect the corresponding module ready for review ready to merge
Projects
Status: Merged
Development

Successfully merging this pull request may close these issues.

10 participants