From 9e842c68529438a31214af004439465caa64eb31 Mon Sep 17 00:00:00 2001 From: Florian Glombik Date: Wed, 4 Sep 2024 17:53:06 +0200 Subject: [PATCH 001/174] Hiding channel name --- ...programming-exercise-update.component.html | 1 + .../programming-exercise-update.component.ts | 59 +++++++++---------- ...amming-exercise-information.component.html | 1 + ...gramming-exercise-information.component.ts | 3 +- ...exercise-title-channel-name.component.html | 1 + .../exercise-title-channel-name.component.ts | 3 +- .../title-channel-name.component.html | 2 +- .../title-channel-name.component.ts | 3 +- 8 files changed, 39 insertions(+), 34 deletions(-) diff --git a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html index 264d317dcab7..1a40863c8e93 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html @@ -19,6 +19,7 @@


(true); private translationBasePath = 'artemisApp.programmingExercise.'; @@ -85,35 +108,11 @@ export class ProgrammingExerciseUpdateComponent implements AfterViewInit, OnDest notificationText?: string; courseId: number; - AssessmentType = AssessmentType; rerenderSubject = new Subject(); // This is used to revert the select if the user cancels to override the new selected programming language. private selectedProgrammingLanguageValue: ProgrammingLanguage; // This is used to revert the select if the user cancels to override the new selected project type. private selectedProjectTypeValue?: ProjectType; - maxPenaltyPattern = '^([0-9]|([1-9][0-9])|100)$'; - // Java package name Regex according to Java 14 JLS (https://docs.oracle.com/javase/specs/jls/se14/html/jls-7.html#jls-7.4.1), - // with the restriction to a-z,A-Z,_ as "Java letter" and 0-9 as digits due to JavaScript/Browser Unicode character class limitations - packageNamePatternForJavaKotlin = - '^(?!.*(?:\\.|^)(?:abstract|continue|for|new|switch|assert|default|if|package|synchronized|boolean|do|goto|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while|_|true|false|null)(?:\\.|$))[A-Z_a-z][0-9A-Z_a-z]*(?:\\.[A-Z_a-z][0-9A-Z_a-z]*)*$'; - // No dots allowed for the blackbox project type, because the folder naming works slightly different here. - packageNamePatternForJavaBlackbox = - '^(?!.*(?:\\.|^)(?:abstract|continue|for|new|switch|assert|default|if|package|synchronized|boolean|do|goto|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while|_|true|false|null)(?:\\.|$))[A-Z_a-z][0-9A-Z_a-z]*$'; - // Swift package name Regex derived from (https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#ID412), - // with the restriction to a-z,A-Z as "Swift letter" and 0-9 as digits where no separators are allowed - appNamePatternForSwift = - '^(?!(?:associatedtype|class|deinit|enum|extension|fileprivate|func|import|init|inout|internal|let|open|operator|private|protocol|public|rethrows|static|struct|subscript|typealias|var|break|case|continue|default|defer|do|else|fallthrough|for|guard|if|in|repeat|return|switch|where|while|as|Any|catch|false|is|nil|super|self|Self|throw|throws|true|try|_|[sS]wift)$)[A-Za-z][0-9A-Za-z]*$'; - packageNamePattern = ''; - - // Auxiliary Repository names must only include words or '-' characters. - invalidRepositoryNamePattern = RegExp('^(?!(solution|exercise|tests|auxiliary)\\b)\\b(\\w|-)+$'); - - // Auxiliary Repository checkout directories must be valid directory paths. Those must only include words, - // '-' or '/' characters. - invalidDirectoryNamePattern = RegExp('^[\\w-]+(/[\\w-]+)*$'); - - // length of < 3 is also accepted in order to provide more accurate validation error messages - readonly shortNamePattern = RegExp('(^(?![\\s\\S]))|^[a-zA-Z][a-zA-Z0-9]*$|' + SHORT_NAME_PATTERN); // must start with a letter and cannot contain special characters exerciseCategories: ExerciseCategory[]; existingCategories: ExerciseCategory[]; diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-information.component.html b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-information.component.html index 78be8ae11ee0..0631424dd547 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-information.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-information.component.html @@ -17,6 +17,7 @@ [hideTitleLabel]="true" [isExamMode]="isExamMode" [isImport]="isImport" + [isSimpleMode]="isSimpleMode()" />
diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-information.component.ts b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-information.component.ts index f60b0948a4c6..044311df0f73 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-information.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-information.component.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component, Input, OnDestroy, QueryList, ViewChild, ViewChildren } from '@angular/core'; +import { AfterViewInit, Component, Input, OnDestroy, QueryList, ViewChild, ViewChildren, input } from '@angular/core'; import { NgModel } from '@angular/forms'; import { ProgrammingExercise, ProjectType } from 'app/entities/programming/programming-exercise.model'; import { ProgrammingExerciseCreationConfig } from 'app/exercises/programming/manage/update/programming-exercise-creation-config'; @@ -20,6 +20,7 @@ export class ProgrammingExerciseInformationComponent implements AfterViewInit, O @Input() programmingExerciseCreationConfig: ProgrammingExerciseCreationConfig; @Input() isLocal: boolean; @Input() importOptions: ImportOptions; + isSimpleMode = input.required(); @ViewChild(ExerciseTitleChannelNameComponent) exerciseTitleChannelComponent: ExerciseTitleChannelNameComponent; @ViewChildren(TableEditableFieldComponent) tableEditableFields?: QueryList; diff --git a/src/main/webapp/app/exercises/shared/exercise-title-channel-name/exercise-title-channel-name.component.html b/src/main/webapp/app/exercises/shared/exercise-title-channel-name/exercise-title-channel-name.component.html index 64963ad0bbca..2ed60e93a33b 100644 --- a/src/main/webapp/app/exercises/shared/exercise-title-channel-name/exercise-title-channel-name.component.html +++ b/src/main/webapp/app/exercises/shared/exercise-title-channel-name/exercise-title-channel-name.component.html @@ -10,4 +10,5 @@ [hideChannelName]="hideChannelNameInput" [minTitleLength]="minTitleLength" [initChannelName]="isImport || exercise.id === undefined" + [isSimpleMode]="isSimpleMode()" /> diff --git a/src/main/webapp/app/exercises/shared/exercise-title-channel-name/exercise-title-channel-name.component.ts b/src/main/webapp/app/exercises/shared/exercise-title-channel-name/exercise-title-channel-name.component.ts index 6f13e110c42f..03813d883d0d 100644 --- a/src/main/webapp/app/exercises/shared/exercise-title-channel-name/exercise-title-channel-name.component.ts +++ b/src/main/webapp/app/exercises/shared/exercise-title-channel-name/exercise-title-channel-name.component.ts @@ -1,4 +1,4 @@ -import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges, ViewChild } from '@angular/core'; +import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges, ViewChild, input } from '@angular/core'; import { Course, isCommunicationEnabled } from 'app/entities/course.model'; import { Exercise } from 'app/entities/exercise.model'; import { TitleChannelNameComponent } from 'app/shared/form/title-channel-name/title-channel-name.component'; @@ -15,6 +15,7 @@ export class ExerciseTitleChannelNameComponent implements OnChanges { @Input() isExamMode: boolean; @Input() isImport: boolean; @Input() hideTitleLabel: boolean; + isSimpleMode = input(false); @ViewChild(TitleChannelNameComponent) titleChannelNameComponent: TitleChannelNameComponent; diff --git a/src/main/webapp/app/shared/form/title-channel-name/title-channel-name.component.html b/src/main/webapp/app/shared/form/title-channel-name/title-channel-name.component.html index e9d8c99f7374..d96c44237ba0 100644 --- a/src/main/webapp/app/shared/form/title-channel-name/title-channel-name.component.html +++ b/src/main/webapp/app/shared/form/title-channel-name/title-channel-name.component.html @@ -16,7 +16,7 @@ (ngModelChange)="updateTitle($event)" />
- @if (!hideChannelName) { + @if (!hideChannelName && !isSimpleMode()) {
diff --git a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.ts b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.ts index 39cc18bff833..c0c4a5ad82cc 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.ts @@ -25,7 +25,7 @@ import { ExerciseUpdateWarningService } from 'app/exercises/shared/exercise-upda import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { AuxiliaryRepository } from 'app/entities/programming/programming-exercise-auxiliary-repository-model'; import { SubmissionPolicyType } from 'app/entities/submission-policy.model'; -import { faExclamationCircle, faQuestionCircle } from '@fortawesome/free-solid-svg-icons'; +import { faExclamationCircle, faHandshakeAngle, faQuestionCircle } from '@fortawesome/free-solid-svg-icons'; import { ModePickerOption } from 'app/exercises/shared/mode-picker/mode-picker.component'; import { DocumentationType } from 'app/shared/components/documentation-button/documentation-button.component'; import { ProgrammingExerciseCreationConfig } from 'app/exercises/programming/manage/update/programming-exercise-creation-config'; @@ -72,6 +72,7 @@ export class ProgrammingExerciseUpdateComponent implements AfterViewInit, OnDest protected readonly invalidDirectoryNamePattern = RegExp('^[\\w-]+(/[\\w-]+)*$'); // length of < 3 is also accepted in order to provide more accurate validation error messages protected readonly shortNamePattern = RegExp('(^(?![\\s\\S]))|^[a-zA-Z][a-zA-Z0-9]*$|' + SHORT_NAME_PATTERN); // must start with a letter and cannot contain special characters + protected readonly faHandShakeAngle = faHandshakeAngle; @ViewChild(ProgrammingExerciseInformationComponent) exerciseInfoComponent?: ProgrammingExerciseInformationComponent; @ViewChild(ProgrammingExerciseDifficultyComponent) exerciseDifficultyComponent?: ProgrammingExerciseDifficultyComponent; @@ -803,6 +804,10 @@ export class ProgrammingExerciseUpdateComponent implements AfterViewInit, OnDest } } + protected switchEditMode() { + this.isSimpleMode.set(!this.isSimpleMode()); + } + /** * Change the selected programming language for the current exercise. If there are unsaved changes, the user * will see a confirmation dialog about switching to a new template diff --git a/src/main/webapp/i18n/de/programmingExercise.json b/src/main/webapp/i18n/de/programmingExercise.json index 9409c371c61a..1ba3acf32ea2 100644 --- a/src/main/webapp/i18n/de/programmingExercise.json +++ b/src/main/webapp/i18n/de/programmingExercise.json @@ -7,9 +7,8 @@ "editLabel": "Programmieraufgabe bearbeiten", "importLabel": "Programmieraufgabe importieren", "linkLabel": "Neue Programmieraufgabe verlinken", - "switchToGuidedModeLabel": "Zum geführten Modus wechseln", - "switchToTraditionalModeLabel": "Zum normalen Modus wechseln", - "nextStepLabel": "Weiter" + "switchToSimpleMode": "Zum einfachen Modus wechseln", + "switchToAdvancedMode": "Zum erweiterten Modus wechseln" }, "created": "Programmieraufgabe erstellt mit Titel {{ param }}", "updated": "Programmieraufgabe aktualisiert mit Titel {{ param }}", diff --git a/src/main/webapp/i18n/en/programmingExercise.json b/src/main/webapp/i18n/en/programmingExercise.json index 06f826607ba7..f4cda9cb1548 100644 --- a/src/main/webapp/i18n/en/programmingExercise.json +++ b/src/main/webapp/i18n/en/programmingExercise.json @@ -7,9 +7,8 @@ "editLabel": "Edit Programming Exercise", "importLabel": "Import Programming Exercise", "linkLabel": "Link new Programming Exercise", - "switchToGuidedModeLabel": "Switch to guided mode", - "switchToTraditionalModeLabel": "Switch to normal mode", - "nextStepLabel": "Next" + "switchToSimpleMode": "Switch to simple mode", + "switchToAdvancedMode": "Switch to advanced mode" }, "created": "Created new Programming Exercise with title {{ param }}", "updated": "Updated Programming Exercise with title {{ param }}", From 1ec32b4e52594a5c56892cf750257e045422c3b4 Mon Sep 17 00:00:00 2001 From: Florian Glombik Date: Wed, 4 Sep 2024 18:15:28 +0200 Subject: [PATCH 003/174] Hide presentation score setting in simple mode --- .../manage/update/programming-exercise-update.component.html | 1 + .../programming-exercise-grading.component.html | 4 +++- .../programming-exercise-grading.component.ts | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html index 6e41faf2f4e9..47369bbc2240 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html @@ -46,6 +46,7 @@

@if (!isExamMode) { diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.html b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.html index 596b6d8c38c7..8fb10fdea6ec 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.html @@ -120,7 +120,9 @@

} - + @if (!isSimpleMode()) { + + } @if (programmingExerciseCreationConfig.showSummary) {
{{ getGradingSummary() }}
} diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.ts b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.ts index 5a5c6a17c6d3..b07ce01be3a0 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component, Input, OnDestroy, ViewChild } from '@angular/core'; +import { AfterViewInit, Component, Input, OnDestroy, ViewChild, input } from '@angular/core'; import { ProgrammingExercise } from 'app/entities/programming/programming-exercise.model'; import { AssessmentType } from 'app/entities/assessment-type.model'; import { SubmissionPolicyType } from 'app/entities/submission-policy.model'; @@ -27,6 +27,7 @@ export class ProgrammingExerciseGradingComponent implements AfterViewInit, OnDes @Input() programmingExercise: ProgrammingExercise; @Input() programmingExerciseCreationConfig: ProgrammingExerciseCreationConfig; @Input() importOptions: ImportOptions; + isSimpleMode = input.required(); @ViewChild(SubmissionPolicyUpdateComponent) submissionPolicyUpdateComponent?: SubmissionPolicyUpdateComponent; @ViewChild(ProgrammingExerciseLifecycleComponent) lifecycleComponent?: ProgrammingExerciseLifecycleComponent; From 55c0049e638f40c042acb42e7d92966c50f1bf66 Mon Sep 17 00:00:00 2001 From: Florian Glombik Date: Wed, 4 Sep 2024 18:19:54 +0200 Subject: [PATCH 004/174] Hide plagiarism control --- .../manage/update/programming-exercise-update.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html index 47369bbc2240..70f7d0b26e5b 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html @@ -48,7 +48,7 @@

- @if (!isExamMode) { + @if (!isExamMode && !isSimpleMode()) { } Date: Wed, 4 Sep 2024 18:29:35 +0200 Subject: [PATCH 005/174] Simplify lifecycle timeline --- ...rogramming-exercise-grading.component.html | 1 + ...gramming-exercise-lifecycle.component.html | 6 +++--- ...rogramming-exercise-lifecycle.component.ts | 19 +++++++++---------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.html b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.html index 8fb10fdea6ec..4c16d7d6b7ae 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.html @@ -112,6 +112,7 @@

@if (programmingExercise.assessmentType === AssessmentType.SEMI_AUTOMATIC) { diff --git a/src/main/webapp/app/exercises/programming/shared/lifecycle/programming-exercise-lifecycle.component.html b/src/main/webapp/app/exercises/programming/shared/lifecycle/programming-exercise-lifecycle.component.html index 9a32bc2a7b66..aee96bc9be1f 100644 --- a/src/main/webapp/app/exercises/programming/shared/lifecycle/programming-exercise-lifecycle.component.html +++ b/src/main/webapp/app/exercises/programming/shared/lifecycle/programming-exercise-lifecycle.component.html @@ -11,7 +11,7 @@ tooltipText="artemisApp.programmingExercise.timeline.releaseDateTooltip" /> } - @if (!isExamMode) { + @if (!isExamMode && !isSimpleMode()) { } - @if (isExamMode || exercise.dueDate) { + @if (isExamMode || (exercise.dueDate && !isSimpleMode())) { } - @if (!isExamMode) { + @if (!isExamMode && !isSimpleMode()) {
(false); @ViewChildren(ProgrammingExerciseTestScheduleDatePickerComponent) datePickerComponents: QueryList; - readonly assessmentType = AssessmentType; - readonly IncludedInOverallScore = IncludedInOverallScore; - formValid: boolean; formEmpty: boolean; formValidChanges = new Subject(); @@ -37,11 +41,6 @@ export class ProgrammingExerciseLifecycleComponent implements AfterViewInit, OnD inputfieldSubscriptions: (Subscription | undefined)[] = []; datePickerChildrenSubscription?: Subscription; - // Icons - faCogs = faCogs; - faUserCheck = faUserCheck; - faUserSlash = faUserSlash; - isAthenaEnabled$: Observable | undefined; isImport: boolean = false; @@ -108,7 +107,7 @@ export class ProgrammingExerciseLifecycleComponent implements AfterViewInit, OnD calculateFormStatus() { const datePickers = this.datePickerComponents.toArray(); - this.formValid = every(datePickers, (picker) => picker.dateInput.valid); + this.formValid = every(datePickers, (picker) => picker?.dateInput?.valid); this.formEmpty = !every(datePickers, (picker) => picker.selectedDate); this.formValidChanges.next(this.formValid); } From 2cb960066bb25cadbb2e1b96f01f3c3ea83d2abc Mon Sep 17 00:00:00 2001 From: Florian Glombik Date: Wed, 4 Sep 2024 18:33:11 +0200 Subject: [PATCH 006/174] Hide submission policy selection --- .../programming-exercise-grading.component.html | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.html b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.html index 4c16d7d6b7ae..298f28ed091d 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.html @@ -86,12 +86,13 @@

- + @if (!isSimpleMode()) { + + } @if (programmingExerciseCreationConfig.isEdit) { From 188adce9f1362c5251e4ac08bbe8c7988b11a25a Mon Sep 17 00:00:00 2001 From: Florian Glombik Date: Wed, 4 Sep 2024 18:38:05 +0200 Subject: [PATCH 007/174] Hide static code analysis, sequential test runs, customize build script --- ...programming-exercise-update.component.html | 6 +++++- ...ogramming-exercise-language.component.html | 20 ++++++++++--------- ...programming-exercise-language.component.ts | 7 ++++--- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html index 70f7d0b26e5b..fa04b699c523 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html @@ -33,7 +33,11 @@


- +
- @if (programmingExercise.programmingLanguage && programmingExerciseCreationConfig.staticCodeAnalysisAllowed) { + @if (programmingExercise.programmingLanguage && programmingExerciseCreationConfig.staticCodeAnalysisAllowed && !isSimpleMode()) {
- @if (programmingExerciseCreationConfig.sequentialTestRunsAllowed) { + @if (programmingExerciseCreationConfig.sequentialTestRunsAllowed && !isSimpleMode()) {
} - @if (programmingExerciseCreationConfig.customBuildPlansSupported === PROFILE_LOCALCI) { - - } @else if (programmingExerciseCreationConfig.customBuildPlansSupported === PROFILE_AEOLUS) { - + @if (!isSimpleMode()) { + @if (programmingExerciseCreationConfig.customBuildPlansSupported === PROFILE_LOCALCI) { + + } @else if (programmingExerciseCreationConfig.customBuildPlansSupported === PROFILE_AEOLUS) { + + } } diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-language.component.ts b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-language.component.ts index 696d75ce185f..ff59a8ff6b86 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-language.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-language.component.ts @@ -1,4 +1,4 @@ -import { AfterViewChecked, AfterViewInit, Component, EventEmitter, Input, OnDestroy, ViewChild } from '@angular/core'; +import { AfterViewChecked, AfterViewInit, Component, EventEmitter, Input, OnDestroy, ViewChild, input } from '@angular/core'; import { ProgrammingExercise, ProgrammingLanguage, ProjectType } from 'app/entities/programming/programming-exercise.model'; import { faQuestionCircle } from '@fortawesome/free-solid-svg-icons'; import { ProgrammingExerciseCreationConfig } from 'app/exercises/programming/manage/update/programming-exercise-creation-config'; @@ -18,8 +18,9 @@ export class ProgrammingExerciseLanguageComponent implements AfterViewChecked, A readonly ProgrammingLanguage = ProgrammingLanguage; readonly ProjectType = ProjectType; - @Input() programmingExercise: ProgrammingExercise; - @Input() programmingExerciseCreationConfig: ProgrammingExerciseCreationConfig; + @Input({ required: true }) programmingExercise: ProgrammingExercise; + @Input({ required: true }) programmingExerciseCreationConfig: ProgrammingExerciseCreationConfig; + isSimpleMode = input.required(); @ViewChild('select') selectLanguageField: NgModel; @ViewChild('packageName') packageNameField?: NgModel; From 295d8bf960f47423d9812dd06a5dc3a213d936c8 Mon Sep 17 00:00:00 2001 From: Florian Glombik Date: Wed, 4 Sep 2024 18:43:02 +0200 Subject: [PATCH 008/174] Hide allow offline IDe and online editor settings --- ...programming-exercise-update.component.html | 1 + ...ramming-exercise-difficulty.component.html | 134 +++++++++--------- ...ogramming-exercise-difficulty.component.ts | 8 +- 3 files changed, 74 insertions(+), 69 deletions(-) diff --git a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html index fa04b699c523..09b921eaea62 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html @@ -30,6 +30,7 @@


diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-difficulty.component.html b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-difficulty.component.html index 8f66c32f99dd..b77b5e7c3eb9 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-difficulty.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-difficulty.component.html @@ -13,95 +13,97 @@
-
-
- -
- @if (ProjectType.XCODE !== programmingExerciseCreationConfig.selectedProjectType) { + @if (!isSimpleMode()) { +
-
- } - - @if (!programmingExercise.exerciseGroup && theiaEnabled) { -
-
- } -
+ + @if (!programmingExerciseCreationConfig.validIdeSelection()) { + @if (theiaEnabled) { + + } @else { + + } + } + +
+ } + + @if (!programmingExercise.exerciseGroup && theiaEnabled) { +
+ +
+ } +

+ } diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-difficulty.component.ts b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-difficulty.component.ts index 9b90e235dcec..5e2af9ff14f3 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-difficulty.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-difficulty.component.ts @@ -1,4 +1,4 @@ -import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; +import { Component, EventEmitter, Input, OnInit, Output, ViewChild, input } from '@angular/core'; import { ProgrammingExercise, ProjectType } from 'app/entities/programming/programming-exercise.model'; import { faQuestionCircle } from '@fortawesome/free-solid-svg-icons'; import { ProgrammingExerciseCreationConfig } from 'app/exercises/programming/manage/update/programming-exercise-creation-config'; @@ -12,8 +12,10 @@ import { ProfileService } from 'app/shared/layouts/profiles/profile.service'; styleUrls: ['../../programming-exercise-form.scss'], }) export class ProgrammingExerciseDifficultyComponent implements OnInit { - @Input() programmingExercise: ProgrammingExercise; - @Input() programmingExerciseCreationConfig: ProgrammingExerciseCreationConfig; + @Input({ required: true }) programmingExercise: ProgrammingExercise; + @Input({ required: true }) programmingExerciseCreationConfig: ProgrammingExerciseCreationConfig; + isSimpleMode = input.required(); + @ViewChild(TeamConfigFormGroupComponent) teamConfigComponent: TeamConfigFormGroupComponent; @Output() triggerValidation = new EventEmitter(); From af8ccb70e3ce3d44953325e9410563126f478916 Mon Sep 17 00:00:00 2001 From: Florian Glombik Date: Wed, 4 Sep 2024 18:45:13 +0200 Subject: [PATCH 009/174] Hide participation team mode --- .../programming-exercise-difficulty.component.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-difficulty.component.html b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-difficulty.component.html index b77b5e7c3eb9..466478d30ae3 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-difficulty.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-difficulty.component.html @@ -10,10 +10,10 @@
-
- -
@if (!isSimpleMode()) { +
+ +
- @if (programmingExercise.programmingLanguage && programmingExerciseCreationConfig.projectTypes?.length && programmingExerciseCreationConfig.modePickerOptions) { + @if ( + !isSimpleMode() && programmingExercise.programmingLanguage && programmingExerciseCreationConfig.projectTypes?.length && programmingExerciseCreationConfig.modePickerOptions + ) {
Date: Wed, 4 Sep 2024 18:57:34 +0200 Subject: [PATCH 011/174] Hide assessment options --- .../programming-exercise-grading.component.ts | 6 +++--- .../lifecycle/programming-exercise-lifecycle.component.html | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.ts b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.ts index b07ce01be3a0..9c7e0bbbae72 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.ts @@ -18,9 +18,9 @@ import { ImportOptions } from 'app/types/programming-exercises'; styleUrls: ['../../programming-exercise-form.scss'], }) export class ProgrammingExerciseGradingComponent implements AfterViewInit, OnDestroy { - readonly IncludedInOverallScore = IncludedInOverallScore; - readonly AssessmentType = AssessmentType; - readonly faQuestionCircle = faQuestionCircle; + protected readonly IncludedInOverallScore = IncludedInOverallScore; + protected readonly AssessmentType = AssessmentType; + protected readonly faQuestionCircle = faQuestionCircle; private translationBasePath = 'artemisApp.programmingExercise.wizardMode.gradingLabels.'; diff --git a/src/main/webapp/app/exercises/programming/shared/lifecycle/programming-exercise-lifecycle.component.html b/src/main/webapp/app/exercises/programming/shared/lifecycle/programming-exercise-lifecycle.component.html index aee96bc9be1f..8b62d1f810eb 100644 --- a/src/main/webapp/app/exercises/programming/shared/lifecycle/programming-exercise-lifecycle.component.html +++ b/src/main/webapp/app/exercises/programming/shared/lifecycle/programming-exercise-lifecycle.component.html @@ -116,7 +116,7 @@ }
- @if (!readOnly) { + @if (!readOnly && !isSimpleMode()) {
@if (isExamMode || exercise.course?.complaintsEnabled) {
From 2de94240a98830e999b398cb6029b7e82c6d6924 Mon Sep 17 00:00:00 2001 From: Florian Glombik Date: Wed, 4 Sep 2024 19:01:30 +0200 Subject: [PATCH 012/174] Hide competency selection in simple mode --- ...programming-exercise-update.component.html | 1 + ...rogramming-exercise-problem.component.html | 2 +- .../programming-exercise-problem.component.ts | 20 +++++++++---------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html index 09b921eaea62..ee38bffaef13 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html @@ -43,6 +43,7 @@


diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-problem.component.html b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-problem.component.html index 61cd41a42924..5be31260b4c5 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-problem.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-problem.component.html @@ -36,7 +36,7 @@

(); - @Input() programmingExerciseCreationConfig: ProgrammingExerciseCreationConfig; @Output() exerciseChange = new EventEmitter(); @Output() problemStatementChange = new EventEmitter(); + programmingExercise: ProgrammingExercise; + @Input() get exercise() { return this.programmingExercise; @@ -32,6 +34,4 @@ export class ProgrammingExerciseProblemComponent { this.programmingExercise = exercise; this.exerciseChange.emit(this.programmingExercise); } - - faQuestionCircle = faQuestionCircle; } From 5fda9b9ef724ed9e01c278432b09ef1548feb46c Mon Sep 17 00:00:00 2001 From: Florian Glombik Date: Wed, 4 Sep 2024 21:07:59 +0200 Subject: [PATCH 013/174] Fixing StatusBar component --- .../manage/update/programming-exercise-update.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.ts b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.ts index c0c4a5ad82cc..d7a2b4a1706a 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.ts @@ -503,7 +503,7 @@ export class ProgrammingExerciseUpdateComponent implements AfterViewInit, OnDest }, { title: 'artemisApp.programmingExercise.wizardMode.detailedSteps.difficultyStepTitle', - valid: (this.exerciseDifficultyComponent?.teamConfigComponent.formValid && this.validIdeSelection()) ?? false, + valid: (this.exerciseDifficultyComponent?.teamConfigComponent?.formValid && this.validIdeSelection()) ?? false, }, { title: 'artemisApp.programmingExercise.wizardMode.detailedSteps.languageStepTitle', From 3a630bdce7b49e1a275cdf474a9d59cc4db5c8f6 Mon Sep 17 00:00:00 2001 From: Florian Glombik Date: Wed, 4 Sep 2024 21:25:31 +0200 Subject: [PATCH 014/174] Adding component for difficulty selection and introducing folder structure --- .../programming-exercise-update.component.html | 2 +- .../programming-exercise-update.component.ts | 10 +++++----- .../update/programming-exercise-update.module.ts | 14 ++++++++------ ...rogramming-exercise-difficulty.component.html | 7 +++++++ .../programming-exercise-difficulty.component.ts | 16 ++++++++++++++++ .../programming-exercise-grading.component.html | 0 .../programming-exercise-grading.component.ts | 2 +- ...ogramming-exercise-information.component.html | 0 ...ogramming-exercise-information.component.scss | 0 ...programming-exercise-information.component.ts | 2 +- .../programming-exercise-language.component.html | 0 .../programming-exercise-language.component.ts | 2 +- .../programming-exercise-mode.component.html} | 8 +------- .../programming-exercise-mode.component.ts} | 15 +++++++-------- .../programming-exercise-problem.component.html | 0 .../programming-exercise-problem.component.ts | 2 +- ...programming-exercise-update.component.spec.ts | 14 +++++++------- ...ramming-exercise-difficulty.component.spec.ts | 10 +++++----- ...rogramming-exercise-grading.component.spec.ts | 2 +- ...amming-exercise-information.component.spec.ts | 2 +- ...ogramming-exercise-language.component.spec.ts | 2 +- ...rogramming-exercise-problem.component.spec.ts | 2 +- 22 files changed, 65 insertions(+), 47 deletions(-) create mode 100644 src/main/webapp/app/exercises/programming/manage/update/update-components/difficulty/programming-exercise-difficulty.component.html create mode 100644 src/main/webapp/app/exercises/programming/manage/update/update-components/difficulty/programming-exercise-difficulty.component.ts rename src/main/webapp/app/exercises/programming/manage/update/update-components/{ => grading}/programming-exercise-grading.component.html (100%) rename src/main/webapp/app/exercises/programming/manage/update/update-components/{ => grading}/programming-exercise-grading.component.ts (99%) rename src/main/webapp/app/exercises/programming/manage/update/update-components/{ => information}/programming-exercise-information.component.html (100%) rename src/main/webapp/app/exercises/programming/manage/update/update-components/{ => information}/programming-exercise-information.component.scss (100%) rename src/main/webapp/app/exercises/programming/manage/update/update-components/{ => information}/programming-exercise-information.component.ts (97%) rename src/main/webapp/app/exercises/programming/manage/update/update-components/{ => language}/programming-exercise-language.component.html (100%) rename src/main/webapp/app/exercises/programming/manage/update/update-components/{ => language}/programming-exercise-language.component.ts (98%) rename src/main/webapp/app/exercises/programming/manage/update/update-components/{programming-exercise-difficulty.component.html => mode/programming-exercise-mode.component.html} (94%) rename src/main/webapp/app/exercises/programming/manage/update/update-components/{programming-exercise-difficulty.component.ts => mode/programming-exercise-mode.component.ts} (82%) rename src/main/webapp/app/exercises/programming/manage/update/update-components/{ => problem}/programming-exercise-problem.component.html (100%) rename src/main/webapp/app/exercises/programming/manage/update/update-components/{ => problem}/programming-exercise-problem.component.ts (96%) diff --git a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html index ee38bffaef13..bdb73fd333dc 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html @@ -27,7 +27,7 @@


-

+
+ +
+ +
+
diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/difficulty/programming-exercise-difficulty.component.ts b/src/main/webapp/app/exercises/programming/manage/update/update-components/difficulty/programming-exercise-difficulty.component.ts new file mode 100644 index 000000000000..799efe743255 --- /dev/null +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/difficulty/programming-exercise-difficulty.component.ts @@ -0,0 +1,16 @@ +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { ProgrammingExercise } from 'app/entities/programming/programming-exercise.model'; +import { ArtemisDifficultyPickerModule } from 'app/exercises/shared/difficulty-picker/difficulty-picker.module'; + +@Component({ + selector: 'jhi-programming-exercise-difficulty', + standalone: true, + templateUrl: './programming-exercise-difficulty.component.html', + styleUrls: ['../../../programming-exercise-form.scss'], + imports: [ArtemisDifficultyPickerModule], +}) +export class ProgrammingExerciseDifficultyComponent { + @Input({ required: true }) programmingExercise: ProgrammingExercise; + + @Output() triggerValidation = new EventEmitter(); +} diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.html b/src/main/webapp/app/exercises/programming/manage/update/update-components/grading/programming-exercise-grading.component.html similarity index 100% rename from src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.html rename to src/main/webapp/app/exercises/programming/manage/update/update-components/grading/programming-exercise-grading.component.html diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.ts b/src/main/webapp/app/exercises/programming/manage/update/update-components/grading/programming-exercise-grading.component.ts similarity index 99% rename from src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.ts rename to src/main/webapp/app/exercises/programming/manage/update/update-components/grading/programming-exercise-grading.component.ts index 9c7e0bbbae72..d4a5edf674b4 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-grading.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/grading/programming-exercise-grading.component.ts @@ -15,7 +15,7 @@ import { ImportOptions } from 'app/types/programming-exercises'; @Component({ selector: 'jhi-programming-exercise-grading', templateUrl: './programming-exercise-grading.component.html', - styleUrls: ['../../programming-exercise-form.scss'], + styleUrls: ['../../../programming-exercise-form.scss'], }) export class ProgrammingExerciseGradingComponent implements AfterViewInit, OnDestroy { protected readonly IncludedInOverallScore = IncludedInOverallScore; diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-information.component.html b/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.html similarity index 100% rename from src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-information.component.html rename to src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.html diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-information.component.scss b/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.scss similarity index 100% rename from src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-information.component.scss rename to src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.scss diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-information.component.ts b/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts similarity index 97% rename from src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-information.component.ts rename to src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts index 044311df0f73..637cc7455593 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-information.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts @@ -11,7 +11,7 @@ import { ImportOptions } from 'app/types/programming-exercises'; @Component({ selector: 'jhi-programming-exercise-info', templateUrl: './programming-exercise-information.component.html', - styleUrls: ['../../programming-exercise-form.scss', 'programming-exercise-information.component.scss'], + styleUrls: ['../../../programming-exercise-form.scss', 'programming-exercise-information.component.scss'], }) export class ProgrammingExerciseInformationComponent implements AfterViewInit, OnDestroy { @Input() isImport: boolean; diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-language.component.html b/src/main/webapp/app/exercises/programming/manage/update/update-components/language/programming-exercise-language.component.html similarity index 100% rename from src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-language.component.html rename to src/main/webapp/app/exercises/programming/manage/update/update-components/language/programming-exercise-language.component.html diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-language.component.ts b/src/main/webapp/app/exercises/programming/manage/update/update-components/language/programming-exercise-language.component.ts similarity index 98% rename from src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-language.component.ts rename to src/main/webapp/app/exercises/programming/manage/update/update-components/language/programming-exercise-language.component.ts index ff59a8ff6b86..eeb699ba148d 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-language.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/language/programming-exercise-language.component.ts @@ -12,7 +12,7 @@ import { ProgrammingExerciseTheiaComponent } from 'app/exercises/programming/man @Component({ selector: 'jhi-programming-exercise-language', templateUrl: './programming-exercise-language.component.html', - styleUrls: ['../../programming-exercise-form.scss'], + styleUrls: ['../../../programming-exercise-form.scss'], }) export class ProgrammingExerciseLanguageComponent implements AfterViewChecked, AfterViewInit, OnDestroy { readonly ProgrammingLanguage = ProgrammingLanguage; diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-difficulty.component.html b/src/main/webapp/app/exercises/programming/manage/update/update-components/mode/programming-exercise-mode.component.html similarity index 94% rename from src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-difficulty.component.html rename to src/main/webapp/app/exercises/programming/manage/update/update-components/mode/programming-exercise-mode.component.html index 466478d30ae3..f65dfa8306e2 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-difficulty.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/mode/programming-exercise-mode.component.html @@ -3,13 +3,7 @@ jhiTranslate="artemisApp.programmingExercise.wizardMode.detailedSteps.difficultyStepTitle" id="artemisApp.programmingExercise.wizardMode.detailedSteps.difficultyStepTitle" >

-

-
- -
- -
-
+ @if (!isSimpleMode()) {
diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-difficulty.component.ts b/src/main/webapp/app/exercises/programming/manage/update/update-components/mode/programming-exercise-mode.component.ts similarity index 82% rename from src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-difficulty.component.ts rename to src/main/webapp/app/exercises/programming/manage/update/update-components/mode/programming-exercise-mode.component.ts index 5e2af9ff14f3..482e0de864d6 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-difficulty.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/mode/programming-exercise-mode.component.ts @@ -7,11 +7,14 @@ import { PROFILE_THEIA } from 'app/app.constants'; import { ProfileService } from 'app/shared/layouts/profiles/profile.service'; @Component({ - selector: 'jhi-programming-exercise-difficulty', - templateUrl: './programming-exercise-difficulty.component.html', - styleUrls: ['../../programming-exercise-form.scss'], + selector: 'jhi-programming-exercise-mode', + templateUrl: './programming-exercise-mode.component.html', + styleUrls: ['../../../programming-exercise-form.scss'], }) -export class ProgrammingExerciseDifficultyComponent implements OnInit { +export class ProgrammingExerciseModeComponent implements OnInit { + protected readonly ProjectType = ProjectType; + protected readonly faQuestionCircle = faQuestionCircle; + @Input({ required: true }) programmingExercise: ProgrammingExercise; @Input({ required: true }) programmingExerciseCreationConfig: ProgrammingExerciseCreationConfig; isSimpleMode = input.required(); @@ -20,8 +23,6 @@ export class ProgrammingExerciseDifficultyComponent implements OnInit { @Output() triggerValidation = new EventEmitter(); - protected readonly ProjectType = ProjectType; - theiaEnabled: boolean = false; constructor(private profileService: ProfileService) {} @@ -31,6 +32,4 @@ export class ProgrammingExerciseDifficultyComponent implements OnInit { this.theiaEnabled = profileInfo.activeProfiles?.includes(PROFILE_THEIA); }); } - - faQuestionCircle = faQuestionCircle; } diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-problem.component.html b/src/main/webapp/app/exercises/programming/manage/update/update-components/problem/programming-exercise-problem.component.html similarity index 100% rename from src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-problem.component.html rename to src/main/webapp/app/exercises/programming/manage/update/update-components/problem/programming-exercise-problem.component.html diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-problem.component.ts b/src/main/webapp/app/exercises/programming/manage/update/update-components/problem/programming-exercise-problem.component.ts similarity index 96% rename from src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-problem.component.ts rename to src/main/webapp/app/exercises/programming/manage/update/update-components/problem/programming-exercise-problem.component.ts index 00228c9bd3e9..7824449caaac 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/programming-exercise-problem.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/problem/programming-exercise-problem.component.ts @@ -8,7 +8,7 @@ import { MarkdownEditorHeight } from 'app/shared/markdown-editor/monaco/markdown @Component({ selector: 'jhi-programming-exercise-problem', templateUrl: './programming-exercise-problem.component.html', - styleUrls: ['../../programming-exercise-form.scss'], + styleUrls: ['../../../programming-exercise-form.scss'], }) export class ProgrammingExerciseProblemComponent { protected readonly ProgrammingLanguage = ProgrammingLanguage; diff --git a/src/test/javascript/spec/component/programming-exercise/programming-exercise-update.component.spec.ts b/src/test/javascript/spec/component/programming-exercise/programming-exercise-update.component.spec.ts index 093df3a0508f..a524ef0bea19 100644 --- a/src/test/javascript/spec/component/programming-exercise/programming-exercise-update.component.spec.ts +++ b/src/test/javascript/spec/component/programming-exercise/programming-exercise-update.component.spec.ts @@ -53,11 +53,11 @@ import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { NgbTooltipMocksModule } from '../../helpers/mocks/directive/ngbTooltipMocks.module'; import { NgbAlertsMocksModule } from '../../helpers/mocks/directive/ngbAlertsMocks.module'; import { CompetencySelectionComponent } from 'app/shared/competency-selection/competency-selection.component'; -import { ProgrammingExerciseInformationComponent } from 'app/exercises/programming/manage/update/update-components/programming-exercise-information.component'; -import { ProgrammingExerciseDifficultyComponent } from 'app/exercises/programming/manage/update/update-components/programming-exercise-difficulty.component'; -import { ProgrammingExerciseLanguageComponent } from 'app/exercises/programming/manage/update/update-components/programming-exercise-language.component'; -import { ProgrammingExerciseGradingComponent } from 'app/exercises/programming/manage/update/update-components/programming-exercise-grading.component'; -import { ProgrammingExerciseProblemComponent } from 'app/exercises/programming/manage/update/update-components/programming-exercise-problem.component'; +import { ProgrammingExerciseInformationComponent } from 'app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component'; +import { ProgrammingExerciseModeComponent } from 'app/exercises/programming/manage/update/update-components/mode/programming-exercise-mode.component'; +import { ProgrammingExerciseLanguageComponent } from 'app/exercises/programming/manage/update/update-components/language/programming-exercise-language.component'; +import { ProgrammingExerciseGradingComponent } from 'app/exercises/programming/manage/update/update-components/grading/programming-exercise-grading.component'; +import { ProgrammingExerciseProblemComponent } from 'app/exercises/programming/manage/update/update-components/problem/programming-exercise-problem.component'; import { DocumentationButtonComponent } from 'app/shared/components/documentation-button/documentation-button.component'; import { ExerciseCategory } from 'app/entities/exercise-category.model'; import { ExerciseUpdateNotificationComponent } from 'app/exercises/shared/exercise-update-notification/exercise-update-notification.component'; @@ -119,7 +119,7 @@ describe('ProgrammingExerciseUpdateComponent', () => { MockComponent(ButtonComponent), MockComponent(CompetencySelectionComponent), MockComponent(ProgrammingExerciseInformationComponent), - MockComponent(ProgrammingExerciseDifficultyComponent), + MockComponent(ProgrammingExerciseModeComponent), MockComponent(ProgrammingExerciseLanguageComponent), MockComponent(ProgrammingExerciseGradingComponent), MockComponent(ProgrammingExerciseProblemComponent), @@ -1049,7 +1049,7 @@ describe('ProgrammingExerciseUpdateComponent', () => { formValidChanges: new Subject(), formValid: true, }, - } as ProgrammingExerciseDifficultyComponent; + } as ProgrammingExerciseModeComponent; comp.exerciseLanguageComponent = { formValidChanges: new Subject(), formValid: true } as ProgrammingExerciseLanguageComponent; comp.exerciseGradingComponent = { formValidChanges: new Subject(), formValid: true } as ProgrammingExerciseGradingComponent; comp.exercisePlagiarismComponent = { formValidChanges: new Subject(), formValid: true } as ExerciseUpdatePlagiarismComponent; diff --git a/src/test/javascript/spec/component/programming-exercise/update-components/programming-exercise-difficulty.component.spec.ts b/src/test/javascript/spec/component/programming-exercise/update-components/programming-exercise-difficulty.component.spec.ts index 70c70a17dd5b..de0ea88de243 100644 --- a/src/test/javascript/spec/component/programming-exercise/update-components/programming-exercise-difficulty.component.spec.ts +++ b/src/test/javascript/spec/component/programming-exercise/update-components/programming-exercise-difficulty.component.spec.ts @@ -4,7 +4,7 @@ import { DebugElement } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { of } from 'rxjs'; import { ArtemisTranslatePipe } from 'app/shared/pipes/artemis-translate.pipe'; -import { ProgrammingExerciseDifficultyComponent } from 'app/exercises/programming/manage/update/update-components/programming-exercise-difficulty.component'; +import { ProgrammingExerciseModeComponent } from 'app/exercises/programming/manage/update/update-components/mode/programming-exercise-mode.component'; import { CheckboxControlValueAccessor, DefaultValueAccessor, NgModel, NumberValueAccessor, SelectControlValueAccessor } from '@angular/forms'; import { DifficultyPickerComponent } from 'app/exercises/shared/difficulty-picker/difficulty-picker.component'; import { TeamConfigFormGroupComponent } from 'app/exercises/shared/team-config-form-group/team-config-form-group.component'; @@ -16,8 +16,8 @@ import { PROFILE_THEIA } from 'app/app.constants'; import { ArtemisTestModule } from '../../../test.module'; describe('ProgrammingExerciseDifficultyComponent', () => { - let fixture: ComponentFixture; - let comp: ProgrammingExerciseDifficultyComponent; + let fixture: ComponentFixture; + let comp: ProgrammingExerciseModeComponent; let debugElement: DebugElement; let profileService: ProfileService; let getProfileInfoSub: jest.SpyInstance; @@ -31,7 +31,7 @@ describe('ProgrammingExerciseDifficultyComponent', () => { SelectControlValueAccessor, NumberValueAccessor, NgModel, - ProgrammingExerciseDifficultyComponent, + ProgrammingExerciseModeComponent, MockComponent(DifficultyPickerComponent), MockComponent(TeamConfigFormGroupComponent), MockPipe(ArtemisTranslatePipe), @@ -46,7 +46,7 @@ describe('ProgrammingExerciseDifficultyComponent', () => { }) .compileComponents() .then(() => { - fixture = TestBed.createComponent(ProgrammingExerciseDifficultyComponent); + fixture = TestBed.createComponent(ProgrammingExerciseModeComponent); comp = fixture.componentInstance; comp.programmingExercise = new ProgrammingExercise(undefined, undefined); comp.programmingExerciseCreationConfig = programmingExerciseCreationConfigMock; diff --git a/src/test/javascript/spec/component/programming-exercise/update-components/programming-exercise-grading.component.spec.ts b/src/test/javascript/spec/component/programming-exercise/update-components/programming-exercise-grading.component.spec.ts index 8087a70b7cea..554065b94262 100644 --- a/src/test/javascript/spec/component/programming-exercise/update-components/programming-exercise-grading.component.spec.ts +++ b/src/test/javascript/spec/component/programming-exercise/update-components/programming-exercise-grading.component.spec.ts @@ -3,7 +3,7 @@ import { MockComponent, MockDirective, MockPipe } from 'ng-mocks'; import { ActivatedRoute } from '@angular/router'; import { Subject, of } from 'rxjs'; import { ArtemisTranslatePipe } from 'app/shared/pipes/artemis-translate.pipe'; -import { ProgrammingExerciseGradingComponent } from 'app/exercises/programming/manage/update/update-components/programming-exercise-grading.component'; +import { ProgrammingExerciseGradingComponent } from 'app/exercises/programming/manage/update/update-components/grading/programming-exercise-grading.component'; import { ProgrammingExercise } from 'app/entities/programming/programming-exercise.model'; import { IncludedInOverallScore } from 'app/entities/exercise.model'; import { AssessmentType } from 'app/entities/assessment-type.model'; diff --git a/src/test/javascript/spec/component/programming-exercise/update-components/programming-exercise-information.component.spec.ts b/src/test/javascript/spec/component/programming-exercise/update-components/programming-exercise-information.component.spec.ts index 963ef4c6ff37..446c2527c972 100644 --- a/src/test/javascript/spec/component/programming-exercise/update-components/programming-exercise-information.component.spec.ts +++ b/src/test/javascript/spec/component/programming-exercise/update-components/programming-exercise-information.component.spec.ts @@ -3,7 +3,7 @@ import { MockComponent, MockPipe } from 'ng-mocks'; import { ActivatedRoute } from '@angular/router'; import { Subject, of } from 'rxjs'; import { ArtemisTranslatePipe } from 'app/shared/pipes/artemis-translate.pipe'; -import { ProgrammingExerciseInformationComponent } from 'app/exercises/programming/manage/update/update-components/programming-exercise-information.component'; +import { ProgrammingExerciseInformationComponent } from 'app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component'; import { DefaultValueAccessor, NgModel } from '@angular/forms'; import { RemoveKeysPipe } from 'app/shared/pipes/remove-keys.pipe'; import { ProgrammingExercise } from 'app/entities/programming/programming-exercise.model'; diff --git a/src/test/javascript/spec/component/programming-exercise/update-components/programming-exercise-language.component.spec.ts b/src/test/javascript/spec/component/programming-exercise/update-components/programming-exercise-language.component.spec.ts index 55eefafd0162..b85e9ea9e978 100644 --- a/src/test/javascript/spec/component/programming-exercise/update-components/programming-exercise-language.component.spec.ts +++ b/src/test/javascript/spec/component/programming-exercise/update-components/programming-exercise-language.component.spec.ts @@ -6,7 +6,7 @@ import { ArtemisTranslatePipe } from 'app/shared/pipes/artemis-translate.pipe'; import { CheckboxControlValueAccessor, DefaultValueAccessor, NgModel, NumberValueAccessor, SelectControlValueAccessor } from '@angular/forms'; import { RemoveKeysPipe } from 'app/shared/pipes/remove-keys.pipe'; import { ProgrammingExercise } from 'app/entities/programming/programming-exercise.model'; -import { ProgrammingExerciseLanguageComponent } from 'app/exercises/programming/manage/update/update-components/programming-exercise-language.component'; +import { ProgrammingExerciseLanguageComponent } from 'app/exercises/programming/manage/update/update-components/language/programming-exercise-language.component'; import { programmingExerciseCreationConfigMock } from './programming-exercise-creation-config-mock'; import { ProgrammingExerciseTheiaComponent } from 'app/exercises/programming/manage/update/update-components/theia/programming-exercise-theia.component'; import { provideHttpClient } from '@angular/common/http'; diff --git a/src/test/javascript/spec/component/programming-exercise/update-components/programming-exercise-problem.component.spec.ts b/src/test/javascript/spec/component/programming-exercise/update-components/programming-exercise-problem.component.spec.ts index 51ded01756bf..4e506acfd7aa 100644 --- a/src/test/javascript/spec/component/programming-exercise/update-components/programming-exercise-problem.component.spec.ts +++ b/src/test/javascript/spec/component/programming-exercise/update-components/programming-exercise-problem.component.spec.ts @@ -3,7 +3,7 @@ import { MockComponent, MockDirective, MockModule, MockPipe } from 'ng-mocks'; import { ActivatedRoute } from '@angular/router'; import { of } from 'rxjs'; import { ArtemisTranslatePipe } from 'app/shared/pipes/artemis-translate.pipe'; -import { ProgrammingExerciseProblemComponent } from 'app/exercises/programming/manage/update/update-components/programming-exercise-problem.component'; +import { ProgrammingExerciseProblemComponent } from 'app/exercises/programming/manage/update/update-components/problem/programming-exercise-problem.component'; import { ProgrammingExercise } from 'app/entities/programming/programming-exercise.model'; import { FaIconComponent } from '@fortawesome/angular-fontawesome'; import { CompetencySelectionComponent } from 'app/shared/competency-selection/competency-selection.component'; From ab28e5013bbd8c9d6c623cf2e19f8b9ae057ab65 Mon Sep 17 00:00:00 2001 From: Florian Glombik Date: Wed, 4 Sep 2024 21:47:59 +0200 Subject: [PATCH 015/174] Moving the difficulty selection to the general section in simple mode --- ...programming-exercise-update.component.html | 17 ++- ...ogramming-exercise-difficulty.component.ts | 4 +- ...amming-exercise-information.component.html | 3 + .../programming-exercise-mode.component.html | 138 +++++++++--------- .../programming-exercise-mode.component.ts | 3 +- .../category-selector.component.scss | 5 + .../category-selector.component.ts | 23 +-- 7 files changed, 96 insertions(+), 97 deletions(-) diff --git a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html index bdb73fd333dc..21a8580b33ea 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html @@ -27,13 +27,16 @@


- -
+ @if (!isSimpleMode()) { + + +
+ } (); } diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.html b/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.html index 0631424dd547..b624a3298db9 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.html @@ -191,4 +191,7 @@ />

} + @if (isSimpleMode()) { + + } diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/mode/programming-exercise-mode.component.html b/src/main/webapp/app/exercises/programming/manage/update/update-components/mode/programming-exercise-mode.component.html index f65dfa8306e2..bee550049fff 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/mode/programming-exercise-mode.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/mode/programming-exercise-mode.component.html @@ -4,100 +4,98 @@ id="artemisApp.programmingExercise.wizardMode.detailedSteps.difficultyStepTitle" >

- @if (!isSimpleMode()) { -
- +
+ +
+
+
+
-
+ @if (ProjectType.XCODE !== programmingExerciseCreationConfig.selectedProjectType) {
-
- @if (ProjectType.XCODE !== programmingExerciseCreationConfig.selectedProjectType) { -
- -
- } - - @if (!programmingExercise.exerciseGroup && theiaEnabled) { -
-
- } + } + +
+ } +
diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/mode/programming-exercise-mode.component.ts b/src/main/webapp/app/exercises/programming/manage/update/update-components/mode/programming-exercise-mode.component.ts index 482e0de864d6..74b7103953ef 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/mode/programming-exercise-mode.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/mode/programming-exercise-mode.component.ts @@ -1,4 +1,4 @@ -import { Component, EventEmitter, Input, OnInit, Output, ViewChild, input } from '@angular/core'; +import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; import { ProgrammingExercise, ProjectType } from 'app/entities/programming/programming-exercise.model'; import { faQuestionCircle } from '@fortawesome/free-solid-svg-icons'; import { ProgrammingExerciseCreationConfig } from 'app/exercises/programming/manage/update/programming-exercise-creation-config'; @@ -17,7 +17,6 @@ export class ProgrammingExerciseModeComponent implements OnInit { @Input({ required: true }) programmingExercise: ProgrammingExercise; @Input({ required: true }) programmingExerciseCreationConfig: ProgrammingExerciseCreationConfig; - isSimpleMode = input.required(); @ViewChild(TeamConfigFormGroupComponent) teamConfigComponent: TeamConfigFormGroupComponent; diff --git a/src/main/webapp/app/shared/category-selector/category-selector.component.scss b/src/main/webapp/app/shared/category-selector/category-selector.component.scss index 8bc84a163235..f0c46a850a6e 100644 --- a/src/main/webapp/app/shared/category-selector/category-selector.component.scss +++ b/src/main/webapp/app/shared/category-selector/category-selector.component.scss @@ -51,3 +51,8 @@ jhi-category-selector { background: #ccc; } } + +/* This would otherwise add whitespace under the category selection that we do not need */ +.mat-mdc-form-field-subscript-wrapper.mat-mdc-form-field-bottom-align.ng-tns-c2400808035-1 { + display: none; +} diff --git a/src/main/webapp/app/shared/category-selector/category-selector.component.ts b/src/main/webapp/app/shared/category-selector/category-selector.component.ts index d899a7b034b3..1b55a06b7ae8 100644 --- a/src/main/webapp/app/shared/category-selector/category-selector.component.ts +++ b/src/main/webapp/app/shared/category-selector/category-selector.component.ts @@ -17,34 +17,27 @@ const DEFAULT_COLORS = ['#6ae8ac', '#9dca53', '#94a11c', '#691b0b', '#ad5658', ' encapsulation: ViewEncapsulation.None, }) export class CategorySelectorComponent implements OnChanges { - @ViewChild(ColorSelectorComponent, { static: false }) colorSelector: ColorSelectorComponent; + protected readonly faTimes = faTimes; + protected readonly separatorKeysCodes = [ENTER, COMMA, TAB]; + private readonly COLOR_SELECTOR_HEIGHT = 150; - /** - * the selected categories, which can be manipulated by the user in the UI - */ + /** the selected categories, which can be manipulated by the user in the UI */ @Input() categories: ExerciseCategory[]; - - /** - * the existing categories used for auto-completion, might include duplicates - */ + /** the existing categories used for auto-completion, might include duplicates */ @Input() existingCategories: ExerciseCategory[]; - @Output() selectedCategories = new EventEmitter(); - + @ViewChild(ColorSelectorComponent, { static: false }) colorSelector: ColorSelectorComponent; @ViewChild('categoryInput') categoryInput: ElementRef; - @ViewChild(MatAutocompleteTrigger) autocompleteTrigger: MatAutocompleteTrigger; + @Output() selectedCategories = new EventEmitter(); + categoryColors = DEFAULT_COLORS; selectedCategory: ExerciseCategory; uniqueCategoriesForAutocomplete: Observable; - private readonly COLOR_SELECTOR_HEIGHT = 150; - separatorKeysCodes = [ENTER, COMMA, TAB]; categoryCtrl = new FormControl(undefined); - readonly faTimes = faTimes; - ngOnChanges() { this.uniqueCategoriesForAutocomplete = this.categoryCtrl.valueChanges.pipe( startWith(undefined), From a66c2cf54be4f8df5a28b8b64f037e339dbbba5e Mon Sep 17 00:00:00 2001 From: Florian Glombik Date: Wed, 4 Sep 2024 21:51:49 +0200 Subject: [PATCH 016/174] Fixing translation for difficulty --- .../programming-exercise-difficulty.component.html | 1 - .../difficulty/programming-exercise-difficulty.component.ts | 3 ++- .../mode/programming-exercise-mode.component.html | 1 + .../category-selector/category-selector.component.scss | 5 ----- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/difficulty/programming-exercise-difficulty.component.html b/src/main/webapp/app/exercises/programming/manage/update/update-components/difficulty/programming-exercise-difficulty.component.html index e4a9d70003e1..4e53b75cd7aa 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/difficulty/programming-exercise-difficulty.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/difficulty/programming-exercise-difficulty.component.html @@ -1,4 +1,3 @@ -

diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/difficulty/programming-exercise-difficulty.component.ts b/src/main/webapp/app/exercises/programming/manage/update/update-components/difficulty/programming-exercise-difficulty.component.ts index f14f28484d7d..af91dea83488 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/difficulty/programming-exercise-difficulty.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/difficulty/programming-exercise-difficulty.component.ts @@ -1,13 +1,14 @@ import { Component, Input } from '@angular/core'; import { ProgrammingExercise } from 'app/entities/programming/programming-exercise.model'; import { ArtemisDifficultyPickerModule } from 'app/exercises/shared/difficulty-picker/difficulty-picker.module'; +import { ArtemisSharedCommonModule } from 'app/shared/shared-common.module'; @Component({ selector: 'jhi-programming-exercise-difficulty', standalone: true, templateUrl: './programming-exercise-difficulty.component.html', styleUrls: ['../../../programming-exercise-form.scss'], - imports: [ArtemisDifficultyPickerModule], + imports: [ArtemisDifficultyPickerModule, ArtemisSharedCommonModule], }) export class ProgrammingExerciseDifficultyComponent { @Input({ required: true }) programmingExercise: ProgrammingExercise; diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/mode/programming-exercise-mode.component.html b/src/main/webapp/app/exercises/programming/manage/update/update-components/mode/programming-exercise-mode.component.html index bee550049fff..034cd2c13ed5 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/mode/programming-exercise-mode.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/mode/programming-exercise-mode.component.html @@ -3,6 +3,7 @@ jhiTranslate="artemisApp.programmingExercise.wizardMode.detailedSteps.difficultyStepTitle" id="artemisApp.programmingExercise.wizardMode.detailedSteps.difficultyStepTitle" >

+

diff --git a/src/main/webapp/app/shared/category-selector/category-selector.component.scss b/src/main/webapp/app/shared/category-selector/category-selector.component.scss index f0c46a850a6e..8bc84a163235 100644 --- a/src/main/webapp/app/shared/category-selector/category-selector.component.scss +++ b/src/main/webapp/app/shared/category-selector/category-selector.component.scss @@ -51,8 +51,3 @@ jhi-category-selector { background: #ccc; } } - -/* This would otherwise add whitespace under the category selection that we do not need */ -.mat-mdc-form-field-subscript-wrapper.mat-mdc-form-field-bottom-align.ng-tns-c2400808035-1 { - display: none; -} From 1eb12ff1e25a82369d63a9879b9b448089479a2c Mon Sep 17 00:00:00 2001 From: Florian Glombik Date: Wed, 4 Sep 2024 22:08:51 +0200 Subject: [PATCH 017/174] Updating statusbar when edit mode changes --- .../programming-exercise-update.component.ts | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.ts b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.ts index 36514c298528..610cb050fdf6 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.ts @@ -1,5 +1,5 @@ import { ActivatedRoute, Params } from '@angular/router'; -import { AfterViewInit, Component, OnDestroy, OnInit, ViewChild, signal } from '@angular/core'; +import { AfterViewInit, Component, OnDestroy, OnInit, ViewChild, effect, signal } from '@angular/core'; import { HttpErrorResponse, HttpResponse } from '@angular/common/http'; import { AlertService, AlertType } from 'app/core/util/alert.service'; import { ProgrammingExerciseBuildConfig } from 'app/entities/programming/programming-exercise-build.config'; @@ -73,6 +73,8 @@ export class ProgrammingExerciseUpdateComponent implements AfterViewInit, OnDest // length of < 3 is also accepted in order to provide more accurate validation error messages protected readonly shortNamePattern = RegExp('(^(?![\\s\\S]))|^[a-zA-Z][a-zA-Z0-9]*$|' + SHORT_NAME_PATTERN); // must start with a letter and cannot contain special characters protected readonly faHandShakeAngle = faHandshakeAngle; + protected readonly faQuestionCircle = faQuestionCircle; + protected readonly faExclamationCircle = faExclamationCircle; @ViewChild(ProgrammingExerciseInformationComponent) exerciseInfoComponent?: ProgrammingExerciseInformationComponent; @ViewChild(ProgrammingExerciseModeComponent) exerciseDifficultyComponent?: ProgrammingExerciseModeComponent; @@ -152,10 +154,6 @@ export class ProgrammingExerciseUpdateComponent implements AfterViewInit, OnDest public modePickerOptions?: ModePickerOption[] = []; - // Icons - faQuestionCircle = faQuestionCircle; - faExclamationCircle = faExclamationCircle; - constructor( private programmingExerciseService: ProgrammingExerciseService, private modalService: NgbModal, @@ -171,7 +169,15 @@ export class ProgrammingExerciseUpdateComponent implements AfterViewInit, OnDest private programmingLanguageFeatureService: ProgrammingLanguageFeatureService, private navigationUtilService: ArtemisNavigationUtilService, private aeolusService: AeolusService, - ) {} + ) { + effect( + function updateStatusBarSectionsWhenEditModeChanges() { + if (this.isSimpleMode()) { + this.calculateFormStatusSections(); + } + }.bind(this), + ); + } /** * Updates the name of the editedAuxiliaryRepository. @@ -496,7 +502,7 @@ export class ProgrammingExerciseUpdateComponent implements AfterViewInit, OnDest } calculateFormStatusSections() { - this.formStatusSections = [ + const updatedFormStatusSections = [ { title: 'artemisApp.programmingExercise.wizardMode.detailedSteps.generalInfoStepTitle', valid: this.exerciseInfoComponent?.formValid ?? false, @@ -516,6 +522,15 @@ export class ProgrammingExerciseUpdateComponent implements AfterViewInit, OnDest empty: this.exerciseGradingComponent?.formEmpty, }, ]; + + if (this.isSimpleMode()) { + // the mode section would only contain the difficulty in the simple mode, + // which is why the difficulty is moved to the general section instead + const MODE_SECTION_INDEX = 1; + updatedFormStatusSections.splice(MODE_SECTION_INDEX, MODE_SECTION_INDEX); + } + + this.formStatusSections = updatedFormStatusSections; } private defineSupportedProgrammingLanguages() { From 8a6fb5c623a1c700051c2ed7915ed259a8fbb5ad Mon Sep 17 00:00:00 2001 From: Florian Glombik Date: Wed, 4 Sep 2024 22:54:19 +0200 Subject: [PATCH 018/174] Updating the short name when the title changes --- ...amming-exercise-information.component.html | 55 ++++++++++--------- ...gramming-exercise-information.component.ts | 35 ++++++++++-- 2 files changed, 60 insertions(+), 30 deletions(-) diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.html b/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.html index b624a3298db9..2e05fd38566b 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.html @@ -10,6 +10,7 @@

-
-
- - -
- - @for (error of shortName.errors! | keyvalue | removekeys: ['required']; track error) { - @if (shortName.invalid && (shortName.dirty || shortName.touched)) { -
-
-
+ @if (!isSimpleMode()) { +
+
+ + +
+ + @for (error of shortName.errors! | keyvalue | removekeys: ['required']; track error) { + @if (shortName.invalid && (shortName.dirty || shortName.touched)) { +
+
+
+ } } - } -
- @if (programmingExercise.shortName && !shortName.invalid) { +
+ } + @if (programmingExercise.shortName && !shortNameField?.invalid) {
diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts b/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts index 637cc7455593..14fb83dc1270 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component, Input, OnDestroy, QueryList, ViewChild, ViewChildren, input } from '@angular/core'; +import { AfterViewInit, Component, Input, OnChanges, OnDestroy, QueryList, SimpleChanges, ViewChild, ViewChildren, effect, input, signal } from '@angular/core'; import { NgModel } from '@angular/forms'; import { ProgrammingExercise, ProjectType } from 'app/entities/programming/programming-exercise.model'; import { ProgrammingExerciseCreationConfig } from 'app/exercises/programming/manage/update/programming-exercise-creation-config'; @@ -13,7 +13,9 @@ import { ImportOptions } from 'app/types/programming-exercises'; templateUrl: './programming-exercise-information.component.html', styleUrls: ['../../../programming-exercise-form.scss', 'programming-exercise-information.component.scss'], }) -export class ProgrammingExerciseInformationComponent implements AfterViewInit, OnDestroy { +export class ProgrammingExerciseInformationComponent implements AfterViewInit, OnChanges, OnDestroy { + protected readonly ProjectType = ProjectType; + @Input() isImport: boolean; @Input() isExamMode: boolean; @Input() programmingExercise: ProgrammingExercise; @@ -28,23 +30,48 @@ export class ProgrammingExerciseInformationComponent implements AfterViewInit, O @ViewChild('checkoutSolutionRepository') checkoutSolutionRepositoryField?: NgModel; @ViewChild('recreateBuildPlans') recreateBuildPlansField?: NgModel; @ViewChild('updateTemplateFiles') updateTemplateFilesField?: NgModel; + @ViewChild('titleChannelNameComponent') titleComponent?: ExerciseTitleChannelNameComponent; formValid: boolean; formValidChanges = new Subject(); inputFieldSubscriptions: (Subscription | undefined)[] = []; - protected readonly ProjectType = ProjectType; + exerciseTitle = signal(undefined); + + constructor() { + effect(() => { + const newShortName = this.exerciseTitle(); + console.log(newShortName); + this.programmingExercise.shortName = newShortName; + }); + } ngAfterViewInit() { this.inputFieldSubscriptions.push(this.exerciseTitleChannelComponent.titleChannelNameComponent?.formValidChanges.subscribe(() => this.calculateFormValid())); - this.inputFieldSubscriptions.push(this.shortNameField.valueChanges?.subscribe(() => this.calculateFormValid())); + this.inputFieldSubscriptions.push(this.shortNameField?.valueChanges?.subscribe(() => this.calculateFormValid())); this.inputFieldSubscriptions.push(this.checkoutSolutionRepositoryField?.valueChanges?.subscribe(() => this.calculateFormValid())); this.inputFieldSubscriptions.push(this.recreateBuildPlansField?.valueChanges?.subscribe(() => this.calculateFormValid())); this.inputFieldSubscriptions.push(this.updateTemplateFilesField?.valueChanges?.subscribe(() => this.calculateFormValid())); this.tableEditableFields?.changes.subscribe((fields: QueryList) => { fields.toArray().forEach((field) => this.inputFieldSubscriptions.push(field.editingInput.valueChanges?.subscribe(() => this.calculateFormValid()))); }); + + this.titleComponent?.titleChannelNameComponent?.field_title?.valueChanges?.subscribe((newTitle: string) => { + if (this.isSimpleMode()) { + this.updateShortName(newTitle); + } + }); + } + + updateShortName(newTitle: string) { + this.exerciseTitle.set(newTitle); + } + + ngOnChanges(changes: SimpleChanges) { + if (changes.programmingExercise) { + this.exerciseTitle.set(this.programmingExercise.title); + } } ngOnDestroy(): void { From bcac68b8a47387cec7b6c82c5166954ff3fd3e49 Mon Sep 17 00:00:00 2001 From: Florian Glombik Date: Wed, 4 Sep 2024 23:14:08 +0200 Subject: [PATCH 019/174] Deriving a shortname from the title --- .../programming-exercise-information.component.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts b/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts index 14fb83dc1270..9a1e4e80e20a 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts @@ -42,11 +42,16 @@ export class ProgrammingExerciseInformationComponent implements AfterViewInit, O constructor() { effect(() => { const newShortName = this.exerciseTitle(); - console.log(newShortName); - this.programmingExercise.shortName = newShortName; + // noinspection UnnecessaryLocalVariableJS: not inlined because the variable name improves readability + const sanitizedShortName = this.removeSpecialCharacters(newShortName ?? '').substring(0, 6); + this.programmingExercise.shortName = sanitizedShortName; }); } + removeSpecialCharacters(input: string): string { + return input.replace(/[^a-zA-Z0-9]/g, ''); + } + ngAfterViewInit() { this.inputFieldSubscriptions.push(this.exerciseTitleChannelComponent.titleChannelNameComponent?.formValidChanges.subscribe(() => this.calculateFormValid())); this.inputFieldSubscriptions.push(this.shortNameField?.valueChanges?.subscribe(() => this.calculateFormValid())); From 0bc2c6285bc40515874ca9f05e6a8d3584006eef Mon Sep 17 00:00:00 2001 From: Florian Glombik Date: Wed, 4 Sep 2024 23:25:04 +0200 Subject: [PATCH 020/174] adding simple fix for unique shortname --- ...programming-exercise-information.component.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts b/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts index 9a1e4e80e20a..0906675bac17 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts @@ -38,13 +38,17 @@ export class ProgrammingExerciseInformationComponent implements AfterViewInit, O inputFieldSubscriptions: (Subscription | undefined)[] = []; exerciseTitle = signal(undefined); + shortNameRandomPart = signal(this.appendRandomLetters('')); constructor() { effect(() => { const newShortName = this.exerciseTitle(); - // noinspection UnnecessaryLocalVariableJS: not inlined because the variable name improves readability - const sanitizedShortName = this.removeSpecialCharacters(newShortName ?? '').substring(0, 6); - this.programmingExercise.shortName = sanitizedShortName; + if (newShortName && newShortName.length > 3) { + const sanitizedShortName = this.removeSpecialCharacters(newShortName ?? '').substring(0, 6); + // noinspection UnnecessaryLocalVariableJS: not inlined because the variable name improves readability + const shortnameWithRandomness = sanitizedShortName + this.shortNameRandomPart(); + this.programmingExercise.shortName = shortnameWithRandomness; + } }); } @@ -52,6 +56,12 @@ export class ProgrammingExerciseInformationComponent implements AfterViewInit, O return input.replace(/[^a-zA-Z0-9]/g, ''); } + appendRandomLetters(shortName: string): string { + const letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + const randomLetters = Array.from({ length: 3 }, () => letters.charAt(Math.floor(Math.random() * letters.length))).join(''); + return `${shortName}${randomLetters}`; + } + ngAfterViewInit() { this.inputFieldSubscriptions.push(this.exerciseTitleChannelComponent.titleChannelNameComponent?.formValidChanges.subscribe(() => this.calculateFormValid())); this.inputFieldSubscriptions.push(this.shortNameField?.valueChanges?.subscribe(() => this.calculateFormValid())); From e36fe41cf504dd3ac71506963a0a87bc8ff44224 Mon Sep 17 00:00:00 2001 From: Florian Glombik Date: Thu, 5 Sep 2024 23:02:49 +0200 Subject: [PATCH 021/174] Adding structure to define if edit field is displayed or not --- ...programming-exercise-update.component.html | 1 + .../programming-exercise-update.component.ts | 17 +++++++++- .../programming-exercise-update.helper.ts | 19 +++++++++++ ...amming-exercise-information.component.html | 1 + ...gramming-exercise-information.component.ts | 2 ++ ...exercise-title-channel-name.component.html | 1 + .../exercise-title-channel-name.component.ts | 2 ++ .../title-channel-name.component.html | 32 ++++++++++--------- .../title-channel-name.component.ts | 2 ++ 9 files changed, 61 insertions(+), 16 deletions(-) create mode 100644 src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.helper.ts diff --git a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html index 21a8580b33ea..074f944fae3f 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.html @@ -25,6 +25,7 @@


@if (!isSimpleMode()) { diff --git a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.ts b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.ts index 610cb050fdf6..090fd71051b4 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.component.ts @@ -1,5 +1,5 @@ import { ActivatedRoute, Params } from '@angular/router'; -import { AfterViewInit, Component, OnDestroy, OnInit, ViewChild, effect, signal } from '@angular/core'; +import { AfterViewInit, Component, OnDestroy, OnInit, ViewChild, computed, effect, signal } from '@angular/core'; import { HttpErrorResponse, HttpResponse } from '@angular/common/http'; import { AlertService, AlertType } from 'app/core/util/alert.service'; import { ProgrammingExerciseBuildConfig } from 'app/entities/programming/programming-exercise-build.config'; @@ -39,6 +39,7 @@ import { ProgrammingExerciseLanguageComponent } from 'app/exercises/programming/ import { ProgrammingExerciseGradingComponent } from 'app/exercises/programming/manage/update/update-components/grading/programming-exercise-grading.component'; import { ExerciseUpdatePlagiarismComponent } from 'app/exercises/shared/plagiarism/exercise-update-plagiarism/exercise-update-plagiarism.component'; import { ImportOptions } from 'app/types/programming-exercises'; +import { INPUT_FIELD_EDIT_MODE_MAPPING, ProgrammingExerciseInputField } from 'app/exercises/programming/manage/update/programming-exercise-update.helper'; @Component({ selector: 'jhi-programming-exercise-update', @@ -84,6 +85,20 @@ export class ProgrammingExerciseUpdateComponent implements AfterViewInit, OnDest isSimpleMode = signal(true); + isEditFieldDisplayedRecord = computed(() => { + const mapping = INPUT_FIELD_EDIT_MODE_MAPPING; + + const booleanMapping: Record = {} as Record; + Object.keys(mapping).forEach((key) => { + const modeToBeIncluded = this.isSimpleMode() ? 'SIMPLE' : 'ADVANCED'; + // noinspection UnnecessaryLocalVariableJS: not inlined because the variable name improves readability + const isDisplayed = mapping[key as ProgrammingExerciseInputField].editModesToBeDisplayed.includes(modeToBeIncluded); + booleanMapping[key as ProgrammingExerciseInputField] = isDisplayed; + }); + + return booleanMapping; + }); + private translationBasePath = 'artemisApp.programmingExercise.'; programmingLanguageChanged = (language: ProgrammingLanguage) => this.onProgrammingLanguageChange(language); diff --git a/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.helper.ts b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.helper.ts new file mode 100644 index 000000000000..6b375ff41800 --- /dev/null +++ b/src/main/webapp/app/exercises/programming/manage/update/programming-exercise-update.helper.ts @@ -0,0 +1,19 @@ +export enum ProgrammingExerciseInputField { + title = 'title', + shortName = 'shortName', +} + +export type EditMode = 'SIMPLE' | 'ADVANCED'; + +export type InputFieldOptions = { editModesToBeDisplayed: EditMode[] }; + +export type InputFieldEditModeMapping = Record; + +export const INPUT_FIELD_EDIT_MODE_MAPPING: InputFieldEditModeMapping = { + title: { + editModesToBeDisplayed: ['SIMPLE', 'ADVANCED'], + }, + shortName: { + editModesToBeDisplayed: ['ADVANCED'], + }, +}; diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.html b/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.html index 2e05fd38566b..4e18117d3a9c 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.html +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.html @@ -19,6 +19,7 @@ [isExamMode]="isExamMode" [isImport]="isImport" [isSimpleMode]="isSimpleMode()" + [isEditFieldDisplayedRecord]="isEditFieldDisplayedRecord()" />

@if (!isSimpleMode()) { diff --git a/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts b/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts index 0906675bac17..4755e76922e9 100644 --- a/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts +++ b/src/main/webapp/app/exercises/programming/manage/update/update-components/information/programming-exercise-information.component.ts @@ -7,6 +7,7 @@ import { Subject, Subscription } from 'rxjs'; import { TableEditableFieldComponent } from 'app/shared/table/table-editable-field.component'; import { every } from 'lodash-es'; import { ImportOptions } from 'app/types/programming-exercises'; +import { ProgrammingExerciseInputField } from 'app/exercises/programming/manage/update/programming-exercise-update.helper'; @Component({ selector: 'jhi-programming-exercise-info', @@ -23,6 +24,7 @@ export class ProgrammingExerciseInformationComponent implements AfterViewInit, O @Input() isLocal: boolean; @Input() importOptions: ImportOptions; isSimpleMode = input.required(); + isEditFieldDisplayedRecord = input.required>(); @ViewChild(ExerciseTitleChannelNameComponent) exerciseTitleChannelComponent: ExerciseTitleChannelNameComponent; @ViewChildren(TableEditableFieldComponent) tableEditableFields?: QueryList; diff --git a/src/main/webapp/app/exercises/shared/exercise-title-channel-name/exercise-title-channel-name.component.html b/src/main/webapp/app/exercises/shared/exercise-title-channel-name/exercise-title-channel-name.component.html index 2ed60e93a33b..cba6ff6cad96 100644 --- a/src/main/webapp/app/exercises/shared/exercise-title-channel-name/exercise-title-channel-name.component.html +++ b/src/main/webapp/app/exercises/shared/exercise-title-channel-name/exercise-title-channel-name.component.html @@ -11,4 +11,5 @@ [minTitleLength]="minTitleLength" [initChannelName]="isImport || exercise.id === undefined" [isSimpleMode]="isSimpleMode()" + [isEditFieldDisplayedRecord]="isEditFieldDisplayedRecord()" /> diff --git a/src/main/webapp/app/exercises/shared/exercise-title-channel-name/exercise-title-channel-name.component.ts b/src/main/webapp/app/exercises/shared/exercise-title-channel-name/exercise-title-channel-name.component.ts index 03813d883d0d..a6f1f08cec19 100644 --- a/src/main/webapp/app/exercises/shared/exercise-title-channel-name/exercise-title-channel-name.component.ts +++ b/src/main/webapp/app/exercises/shared/exercise-title-channel-name/exercise-title-channel-name.component.ts @@ -2,6 +2,7 @@ import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges, ViewC import { Course, isCommunicationEnabled } from 'app/entities/course.model'; import { Exercise } from 'app/entities/exercise.model'; import { TitleChannelNameComponent } from 'app/shared/form/title-channel-name/title-channel-name.component'; +import { ProgrammingExerciseInputField } from 'app/exercises/programming/manage/update/programming-exercise-update.helper'; @Component({ selector: 'jhi-exercise-title-channel-name', @@ -16,6 +17,7 @@ export class ExerciseTitleChannelNameComponent implements OnChanges { @Input() isImport: boolean; @Input() hideTitleLabel: boolean; isSimpleMode = input(false); + isEditFieldDisplayedRecord = input>(); @ViewChild(TitleChannelNameComponent) titleChannelNameComponent: TitleChannelNameComponent; diff --git a/src/main/webapp/app/shared/form/title-channel-name/title-channel-name.component.html b/src/main/webapp/app/shared/form/title-channel-name/title-channel-name.component.html index d96c44237ba0..3ee719b3bebd 100644 --- a/src/main/webapp/app/shared/form/title-channel-name/title-channel-name.component.html +++ b/src/main/webapp/app/shared/form/title-channel-name/title-channel-name.component.html @@ -1,22 +1,24 @@
- @if (!hideTitleLabel) { - + @if (!this.isEditFieldDisplayedRecord() || this.isEditFieldDisplayedRecord()?.title) { + @if (!hideTitleLabel) { + + } + } -
- @if (!hideChannelName && !isSimpleMode()) { + @if (!hideChannelName && (!isEditFieldDisplayedRecord() || this.isEditFieldDisplayedRecord()?.title)) {