diff --git a/src/main/java/de/tum/in/www1/artemis/domain/Course.java b/src/main/java/de/tum/in/www1/artemis/domain/Course.java index f67803ed8073..952dd81e6af6 100644 --- a/src/main/java/de/tum/in/www1/artemis/domain/Course.java +++ b/src/main/java/de/tum/in/www1/artemis/domain/Course.java @@ -131,6 +131,9 @@ public class Course extends DomainObject { @JsonView(QuizView.Before.class) private CourseInformationSharingConfiguration courseInformationSharingConfiguration = CourseInformationSharingConfiguration.COMMUNICATION_AND_MESSAGING; // default value + @Column(name = "info_sharing_messaging_code_of_conduct") + private String courseInformationSharingMessagingCodeOfConduct; + @Column(name = "max_complaints", nullable = false) @JsonView(QuizView.Before.class) private Integer maxComplaints = 3; // default value @@ -1005,4 +1008,11 @@ public void setCourseInformationSharingConfiguration(CourseInformationSharingCon this.courseInformationSharingConfiguration = courseInformationSharingConfiguration; } + public String getCourseInformationSharingMessagingCodeOfConduct() { + return this.courseInformationSharingMessagingCodeOfConduct; + } + + public void setCourseInformationSharingMessagingCodeOfConduct(String courseInformationSharingMessagingCodeOfConduct) { + this.courseInformationSharingMessagingCodeOfConduct = courseInformationSharingMessagingCodeOfConduct; + } } diff --git a/src/main/resources/config/liquibase/changelog/20230907225501_changelog.xml b/src/main/resources/config/liquibase/changelog/20230907225501_changelog.xml new file mode 100644 index 000000000000..6ce1a1de6303 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20230907225501_changelog.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/src/main/resources/config/liquibase/master.xml b/src/main/resources/config/liquibase/master.xml index eb868ed1b3bf..103a5319cfba 100644 --- a/src/main/resources/config/liquibase/master.xml +++ b/src/main/resources/config/liquibase/master.xml @@ -53,6 +53,7 @@ + diff --git a/src/main/webapp/app/course/manage/course-update.component.html b/src/main/webapp/app/course/manage/course-update.component.html index 180893a4d23b..b943661e4fa1 100644 --- a/src/main/webapp/app/course/manage/course-update.component.html +++ b/src/main/webapp/app/course/manage/course-update.component.html @@ -336,6 +336,18 @@
ngbTooltip="{{ 'artemisApp.course.courseCommunicationSetting.messagingEnabled.tooltip' | artemisTranslate }}" > +
+ + + + +
diff --git a/src/main/webapp/app/course/manage/course-update.component.ts b/src/main/webapp/app/course/manage/course-update.component.ts index beb9d3162bb1..315fe2e8c2d1 100644 --- a/src/main/webapp/app/course/manage/course-update.component.ts +++ b/src/main/webapp/app/course/manage/course-update.component.ts @@ -156,6 +156,7 @@ export class CourseUpdateComponent implements OnInit { editorGroupName: new FormControl(this.course.editorGroupName), instructorGroupName: new FormControl(this.course.instructorGroupName), description: new FormControl(this.course.description), + courseInformationSharingMessagingCodeOfConduct: new FormControl(this.course.courseInformationSharingMessagingCodeOfConduct), organizations: new FormControl(this.courseOrganizations), startDate: new FormControl(this.course.startDate), endDate: new FormControl(this.course.endDate), @@ -520,6 +521,14 @@ export class CourseUpdateComponent implements OnInit { this.courseForm.controls['registrationConfirmationMessage'].setValue(message); } + /** + * Updates courseInformationSharingMessagingCodeOfConduct on markdown change + * @param message new courseInformationSharingMessagingCodeOfConduct + */ + updateCourseInformationSharingMessagingCodeOfConduct(message: string) { + this.courseForm.controls['courseInformationSharingMessagingCodeOfConduct'].setValue(message); + } + /** * Auxiliary method checking if online course is currently true */ diff --git a/src/main/webapp/app/entities/course.model.ts b/src/main/webapp/app/entities/course.model.ts index aae8b0627951..c155170c05e5 100644 --- a/src/main/webapp/app/entities/course.model.ts +++ b/src/main/webapp/app/entities/course.model.ts @@ -97,6 +97,7 @@ export class Course implements BaseEntity { public tutorialGroups?: TutorialGroup[]; public onlineCourseConfiguration?: OnlineCourseConfiguration; public courseInformationSharingConfiguration?: CourseInformationSharingConfiguration; + public courseInformationSharingMessagingCodeOfConduct?: string; // helper attributes public isAtLeastTutor?: boolean; diff --git a/src/main/webapp/i18n/de/course.json b/src/main/webapp/i18n/de/course.json index 642561a24be8..3390637f6d32 100644 --- a/src/main/webapp/i18n/de/course.json +++ b/src/main/webapp/i18n/de/course.json @@ -93,7 +93,11 @@ }, "messagingEnabled": { "label": "Nachrichten aktiviert", - "tooltip": "Ermöglicht den Nachrichtenaustausch zwischen Nutzer:innen in privaten oder öffentlichen Kanälen, Gruppenchats oder Direktnachrichten. Kanäle können nur von Lehrenden und Tutor:innen erstellt werden. Nutzer:innen können selbst öffentlichen Kanälen beitreten und müssen zu privaten Kanälen hinzugefügt werden. Alle Nutzer:innen können einen privaten Gruppenchat starten und andere Nutzer:innen hinzufügen. Ein Gruppenchat ist auf zehn Mitglieder:innen begrenzt. Alle Nutzer:innen können Direktnachrichten an andere Nutzer:innen senden. Die Chats finden im Nachrichtenbereich des Kurses statt." + "tooltip": "Ermöglicht den Nachrichtenaustausch zwischen Nutzer:innen in privaten oder öffentlichen Kanälen, Gruppenchats oder Direktnachrichten. Kanäle können nur von Lehrenden und Tutor:innen erstellt werden. Nutzer:innen können selbst öffentlichen Kanälen beitreten und müssen zu privaten Kanälen hinzugefügt werden. Alle Nutzer:innen können einen privaten Gruppenchat starten und andere Nutzer:innen hinzufügen. Ein Gruppenchat ist auf zehn Mitglieder:innen begrenzt. Alle Nutzer:innen können Direktnachrichten an andere Nutzer:innen senden. Die Chats finden im Nachrichtenbereich des Kurses statt.", + "codeOfConduct": { + "label": "Verhaltenskodex", + "tooltip": "Der Verhaltenskodex gibt Nutzer:innen an, wie sie miteinander kommunizieren sollen und welche Konsequenzen bei Fehlverhalten drohen können, sowie einen Kontakt zur Berichterstattung." + } } }, "registrationEnabled": { diff --git a/src/main/webapp/i18n/en/course.json b/src/main/webapp/i18n/en/course.json index 978785393729..6e8695f31d42 100644 --- a/src/main/webapp/i18n/en/course.json +++ b/src/main/webapp/i18n/en/course.json @@ -93,7 +93,11 @@ }, "messagingEnabled": { "label": "Messaging Enabled", - "tooltip": "Enables messaging between course users in private or public channels, group chats or direct messages. Channels can only be created by instructors and tutors. Users can self-join public channels and must be invited to private channels. Every user can start a private group chat and add other users. A group chat is limited to 10 members. Every user can start a private one-to-one chat with another user. The chats happens in the messaging space of the course." + "tooltip": "Enables messaging between course users in private or public channels, group chats or direct messages. Channels can only be created by instructors and tutors. Users can self-join public channels and must be invited to private channels. Every user can start a private group chat and add other users. A group chat is limited to 10 members. Every user can start a private one-to-one chat with another user. The chats happens in the messaging space of the course.", + "codeOfConduct": { + "label": "Code of Conduct", + "tooltip": "The Code of Conduct describes to users how best to communicate and which consequences might be raised if there is misconduct, as well as, contact information for reporting." + } } }, "registrationEnabled": { diff --git a/src/test/javascript/spec/component/course/course-update.component.spec.ts b/src/test/javascript/spec/component/course/course-update.component.spec.ts index bc5e82b7cff1..cee5192b8d4b 100644 --- a/src/test/javascript/spec/component/course/course-update.component.spec.ts +++ b/src/test/javascript/spec/component/course/course-update.component.spec.ts @@ -14,6 +14,7 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; import { HasAnyAuthorityDirective } from 'app/shared/auth/has-any-authority.directive'; import { ColorSelectorComponent } from 'app/shared/color-selector/color-selector.component'; import { FormDateTimePickerComponent } from 'app/shared/date-time-picker/date-time-picker.component'; +import { HelpIconComponent } from 'app/shared/components/help-icon.component'; import { SecuredImageComponent } from 'app/shared/image/secured-image.component'; import { ArtemisTranslatePipe } from 'app/shared/pipes/artemis-translate.pipe'; import { MockComponent, MockDirective, MockModule, MockPipe, MockProvider } from 'ng-mocks'; @@ -107,13 +108,14 @@ describe('Course Management Update Component', () => { declarations: [ CourseUpdateComponent, MarkdownEditorStubComponent, - MockPipe(ArtemisTranslatePipe), - MockComponent(SecuredImageComponent), - MockComponent(FormDateTimePickerComponent), MockComponent(ColorSelectorComponent), + MockComponent(FormDateTimePickerComponent), + MockComponent(HelpIconComponent), + MockComponent(SecuredImageComponent), + MockDirective(FeatureToggleHideDirective), MockDirective(HasAnyAuthorityDirective), MockDirective(TranslateDirective), - MockDirective(FeatureToggleHideDirective), + MockPipe(ArtemisTranslatePipe), MockPipe(RemoveKeysPipe), ], })