diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 2296ed26a829..22968f1531b4 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -111,10 +111,10 @@ Prerequisites: - [ ] Test 2 ### Test Coverage - - - - + + + + diff --git a/src/main/resources/templates/jenkins/c_plus_plus/regularRuns/pipeline.groovy b/src/main/resources/templates/jenkins/c_plus_plus/regularRuns/pipeline.groovy index d9bc3bbf4a27..3b0ad271b3ae 100644 --- a/src/main/resources/templates/jenkins/c_plus_plus/regularRuns/pipeline.groovy +++ b/src/main/resources/templates/jenkins/c_plus_plus/regularRuns/pipeline.groovy @@ -69,7 +69,6 @@ void postBuildTasks() { sed -i 's/[^[:print:]\t]/�/g' test-reports/tests-results.xml sed -i 's//<\\/error>/g' test-reports/tests-results.xml - sed -i 's/]*>//g ; s/<\\/testsuites>/<\\/testsuite>/g' test-reports/tests-results.xml fi rm -rf results mv test-reports results diff --git a/src/main/resources/templates/jenkins/c_sharp/regularRuns/pipeline.groovy b/src/main/resources/templates/jenkins/c_sharp/regularRuns/pipeline.groovy index b8a48c3a6393..871d3db4aaa0 100644 --- a/src/main/resources/templates/jenkins/c_sharp/regularRuns/pipeline.groovy +++ b/src/main/resources/templates/jenkins/c_sharp/regularRuns/pipeline.groovy @@ -45,10 +45,6 @@ void postBuildTasks() { sh ''' rm -rf results mkdir results - if [ -e tests/TestResults/TestResults.xml ] - then - sed -i 's/]*>//g ; s/<\\/testsuites>/<\\/testsuite>/g' tests/TestResults/TestResults.xml - fi cp tests/TestResults/TestResults.xml $WORKSPACE/results/ || true sed -i 's/[^[:print:]\t]/�/g' $WORKSPACE/results/*.xml || true ''' diff --git a/src/main/resources/templates/jenkins/haskell/regularRuns/pipeline.groovy b/src/main/resources/templates/jenkins/haskell/regularRuns/pipeline.groovy index eacc732bd58d..9b93985e9622 100644 --- a/src/main/resources/templates/jenkins/haskell/regularRuns/pipeline.groovy +++ b/src/main/resources/templates/jenkins/haskell/regularRuns/pipeline.groovy @@ -48,10 +48,6 @@ void postBuildTasks() { sh ''' rm -rf results mkdir results - if [ -e test-reports/results.xml ] - then - sed -i 's/]*>//g ; s/<\\/testsuites>//g' test-reports/results.xml - fi cp test-reports/*.xml $WORKSPACE/results/ || true sed -i 's/[^[:print:]\t]/�/g' $WORKSPACE/results/*.xml || true ''' diff --git a/src/main/resources/templates/jenkins/javascript/regularRuns/pipeline.groovy b/src/main/resources/templates/jenkins/javascript/regularRuns/pipeline.groovy index bc37c762097a..f65df123e726 100644 --- a/src/main/resources/templates/jenkins/javascript/regularRuns/pipeline.groovy +++ b/src/main/resources/templates/jenkins/javascript/regularRuns/pipeline.groovy @@ -45,10 +45,6 @@ void postBuildTasks() { sh ''' rm -rf results mkdir results - if [ -e junit.xml ] - then - sed -i 's/]*>//g ; s/<\\/testsuites>/<\\/testsuite>/g' junit.xml - fi cp junit.xml $WORKSPACE/results/ || true sed -i 's/[^[:print:]\t]/�/g' $WORKSPACE/results/*.xml || true ''' diff --git a/src/main/resources/templates/jenkins/python/regularRuns/pipeline.groovy b/src/main/resources/templates/jenkins/python/regularRuns/pipeline.groovy index 594497262ce2..ead76945175e 100644 --- a/src/main/resources/templates/jenkins/python/regularRuns/pipeline.groovy +++ b/src/main/resources/templates/jenkins/python/regularRuns/pipeline.groovy @@ -50,10 +50,6 @@ void postBuildTasks() { sh ''' rm -rf results mkdir results - if [ -e test-reports/results.xml ] - then - sed -i 's///g ; s/<\\/testsuites>//g' test-reports/results.xml - fi cp test-reports/*.xml $WORKSPACE/results/ || true sed -i 's/[^[:print:]\t]/�/g' $WORKSPACE/results/*.xml || true ''' diff --git a/src/main/resources/templates/jenkins/r/regularRuns/pipeline.groovy b/src/main/resources/templates/jenkins/r/regularRuns/pipeline.groovy index 9a2ec97b5843..7c1441f0cabe 100644 --- a/src/main/resources/templates/jenkins/r/regularRuns/pipeline.groovy +++ b/src/main/resources/templates/jenkins/r/regularRuns/pipeline.groovy @@ -45,10 +45,6 @@ void postBuildTasks() { sh ''' rm -rf results mkdir results - if [ -e tests/testthat/junit.xml ] - then - sed -i 's/]*>//g ; s/<\\/testsuites>/<\\/testsuite>/g' tests/testthat/junit.xml - fi cp tests/testthat/junit.xml $WORKSPACE/results/ || true sed -i 's/[^[:print:]\t]/�/g' $WORKSPACE/results/*.xml || true ''' diff --git a/src/main/resources/templates/jenkins/rust/regularRuns/pipeline.groovy b/src/main/resources/templates/jenkins/rust/regularRuns/pipeline.groovy index 965d7423ce7c..58d6d570d6d2 100644 --- a/src/main/resources/templates/jenkins/rust/regularRuns/pipeline.groovy +++ b/src/main/resources/templates/jenkins/rust/regularRuns/pipeline.groovy @@ -42,10 +42,6 @@ void postBuildTasks() { sh ''' rm -rf results mkdir results - if [ -e target/nextest/ci/junit.xml ] - then - sed -i 's/]*>//g ; s/<\\/testsuites>/<\\/testsuite>/g' target/nextest/ci/junit.xml - fi cp target/nextest/ci/junit.xml $WORKSPACE/results/ || true sed -i 's/[^[:print:]\t]/�/g' $WORKSPACE/results/*.xml || true ''' diff --git a/src/main/resources/templates/jenkins/swift/regularRuns/pipeline.groovy b/src/main/resources/templates/jenkins/swift/regularRuns/pipeline.groovy index e204451deb56..b2c775762be7 100644 --- a/src/main/resources/templates/jenkins/swift/regularRuns/pipeline.groovy +++ b/src/main/resources/templates/jenkins/swift/regularRuns/pipeline.groovy @@ -81,7 +81,6 @@ void postBuildTasks() { mkdir results if [ -e assignment/tests.xml ] then - sed -i 's///g ; s/<\\/testsuites>/<\\/testsuite>/g' assignment/tests.xml cp assignment/tests.xml $WORKSPACE/results/ || true sed -i 's/[^[:print:]\t]/�/g' $WORKSPACE/results/*.xml || true fi diff --git a/src/main/resources/templates/jenkins/typescript/regularRuns/pipeline.groovy b/src/main/resources/templates/jenkins/typescript/regularRuns/pipeline.groovy index 1ba259ab3553..f25114413156 100644 --- a/src/main/resources/templates/jenkins/typescript/regularRuns/pipeline.groovy +++ b/src/main/resources/templates/jenkins/typescript/regularRuns/pipeline.groovy @@ -48,10 +48,6 @@ void postBuildTasks() { sh ''' rm -rf results mkdir results - if [ -e junit.xml ] - then - sed -i 's/]*>//g ; s/<\\/testsuites>/<\\/testsuite>/g' junit.xml - fi cp junit.xml $WORKSPACE/results/ || true sed -i 's/[^[:print:]\t]/�/g' $WORKSPACE/results/*.xml || true ''' diff --git a/src/main/webapp/app/core/user/account.model.ts b/src/main/webapp/app/core/user/account.model.ts index ad1d36a2a18b..37f98ded0405 100644 --- a/src/main/webapp/app/core/user/account.model.ts +++ b/src/main/webapp/app/core/user/account.model.ts @@ -11,7 +11,7 @@ export class Account { public lastName?: string; public langKey?: string; public imageUrl?: string; - public guidedTourSettings: GuidedTourSetting[]; + public guidedTourSettings?: GuidedTourSetting[]; constructor( activated?: boolean, diff --git a/src/main/webapp/app/course/dashboards/assessment-dashboard/assessment-dashboard.component.html b/src/main/webapp/app/course/dashboards/assessment-dashboard/assessment-dashboard.component.html index 6d95da823bb4..3e5157787dbc 100644 --- a/src/main/webapp/app/course/dashboards/assessment-dashboard/assessment-dashboard.component.html +++ b/src/main/webapp/app/course/dashboards/assessment-dashboard/assessment-dashboard.component.html @@ -222,6 +222,7 @@

1 && isExamMode && !isTestRun) {
-

@if (buildAgents) { -

- {{ buildAgents.length }} : {{ currentBuilds }} - {{ buildCapacity }} -

-
+
+
+

+

+ {{ buildAgents.length }} : {{ currentBuilds }} + {{ buildCapacity }} +

+
+
+ + +
+
}
+ + + + + + + diff --git a/src/main/webapp/app/localci/build-agents/build-agent-summary/build-agent-summary.component.ts b/src/main/webapp/app/localci/build-agents/build-agent-summary/build-agent-summary.component.ts index 711fa4a40dce..5e79ceac3c75 100644 --- a/src/main/webapp/app/localci/build-agents/build-agent-summary/build-agent-summary.component.ts +++ b/src/main/webapp/app/localci/build-agents/build-agent-summary/build-agent-summary.component.ts @@ -1,12 +1,14 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; -import { BuildAgentInformation } from 'app/entities/programming/build-agent-information.model'; +import { BuildAgentInformation, BuildAgentStatus } from 'app/entities/programming/build-agent-information.model'; import { JhiWebsocketService } from 'app/core/websocket/websocket.service'; import { BuildAgentsService } from 'app/localci/build-agents/build-agents.service'; import { Subscription } from 'rxjs'; -import { faTimes } from '@fortawesome/free-solid-svg-icons'; +import { faPause, faPlay, faTimes } from '@fortawesome/free-solid-svg-icons'; import { BuildQueueService } from 'app/localci/build-queue/build-queue.service'; import { Router } from '@angular/router'; import { BuildAgent } from 'app/entities/programming/build-agent.model'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { AlertService, AlertType } from 'app/core/util/alert.service'; @Component({ selector: 'jhi-build-agents', @@ -23,13 +25,17 @@ export class BuildAgentSummaryComponent implements OnInit, OnDestroy { routerLink: string; //icons - faTimes = faTimes; + protected readonly faTimes = faTimes; + protected readonly faPause = faPause; + protected readonly faPlay = faPlay; constructor( private websocketService: JhiWebsocketService, private buildAgentsService: BuildAgentsService, private buildQueueService: BuildQueueService, private router: Router, + private modalService: NgbModal, + private alertService: AlertService, ) {} ngOnInit() { @@ -59,7 +65,9 @@ export class BuildAgentSummaryComponent implements OnInit, OnDestroy { private updateBuildAgents(buildAgents: BuildAgentInformation[]) { this.buildAgents = buildAgents; - this.buildCapacity = this.buildAgents.reduce((sum, agent) => sum + (agent.maxNumberOfConcurrentBuildJobs || 0), 0); + this.buildCapacity = this.buildAgents + .filter((agent) => agent.status !== BuildAgentStatus.PAUSED) + .reduce((sum, agent) => sum + (agent.maxNumberOfConcurrentBuildJobs || 0), 0); this.currentBuilds = this.buildAgents.reduce((sum, agent) => sum + (agent.numberOfCurrentBuildJobs || 0), 0); } @@ -86,4 +94,47 @@ export class BuildAgentSummaryComponent implements OnInit, OnDestroy { this.buildQueueService.cancelAllRunningBuildJobsForAgent(buildAgentToCancel.buildAgent?.name).subscribe(); } } + + displayPauseBuildAgentModal(modal: any) { + this.modalService.open(modal); + } + + pauseAllBuildAgents(modal?: any) { + this.buildAgentsService.pauseAllBuildAgents().subscribe({ + next: () => { + this.load(); + this.alertService.addAlert({ + type: AlertType.SUCCESS, + message: 'artemisApp.buildAgents.alerts.buildAgentsPaused', + }); + }, + error: () => { + this.alertService.addAlert({ + type: AlertType.DANGER, + message: 'artemisApp.buildAgents.alerts.buildAgentPauseFailed', + }); + }, + }); + if (modal) { + modal.close(); + } + } + + resumeAllBuildAgents() { + this.buildAgentsService.resumeAllBuildAgents().subscribe({ + next: () => { + this.load(); + this.alertService.addAlert({ + type: AlertType.SUCCESS, + message: 'artemisApp.buildAgents.alerts.buildAgentsResumed', + }); + }, + error: () => { + this.alertService.addAlert({ + type: AlertType.DANGER, + message: 'artemisApp.buildAgents.alerts.buildAgentResumeFailed', + }); + }, + }); + } } diff --git a/src/main/webapp/app/localci/build-agents/build-agents.service.ts b/src/main/webapp/app/localci/build-agents/build-agents.service.ts index 6aac582940d3..c3b388586bcf 100644 --- a/src/main/webapp/app/localci/build-agents/build-agents.service.ts +++ b/src/main/webapp/app/localci/build-agents/build-agents.service.ts @@ -33,22 +33,44 @@ export class BuildAgentsService { */ pauseBuildAgent(agentName: string): Observable { const encodedAgentName = encodeURIComponent(agentName); - return this.http.put(`${this.adminResourceUrl}/agent/${encodedAgentName}/pause`, null).pipe( + return this.http.put(`${this.adminResourceUrl}/agents/${encodedAgentName}/pause`, null).pipe( catchError((err) => { return throwError(() => new Error(`Failed to pause build agent ${agentName}\n${err.message}`)); }), ); } + /** + * Pause All Build Agents + */ + pauseAllBuildAgents(): Observable { + return this.http.put(`${this.adminResourceUrl}/agents/pause-all`, null).pipe( + catchError((err) => { + return throwError(() => new Error(`Failed to pause build agents\n${err.message}`)); + }), + ); + } + /** * Resume Build Agent */ resumeBuildAgent(agentName: string): Observable { const encodedAgentName = encodeURIComponent(agentName); - return this.http.put(`${this.adminResourceUrl}/agent/${encodedAgentName}/resume`, null).pipe( + return this.http.put(`${this.adminResourceUrl}/agents/${encodedAgentName}/resume`, null).pipe( catchError((err) => { return throwError(() => new Error(`Failed to resume build agent ${agentName}\n${err.message}`)); }), ); } + + /** + * Resume all Build Agents + */ + resumeAllBuildAgents(): Observable { + return this.http.put(`${this.adminResourceUrl}/agents/resume-all`, null).pipe( + catchError((err) => { + return throwError(() => new Error(`Failed to resume build agents\n${err.message}`)); + }), + ); + } } diff --git a/src/main/webapp/app/overview/course-conversations/course-conversations.component.html b/src/main/webapp/app/overview/course-conversations/course-conversations.component.html index 1e7b44fa6fb7..6b2bac7d8ada 100644 --- a/src/main/webapp/app/overview/course-conversations/course-conversations.component.html +++ b/src/main/webapp/app/overview/course-conversations/course-conversations.component.html @@ -38,7 +38,7 @@ [sidebarItemAlwaysShow]="DEFAULT_SHOW_ALWAYS" [collapseState]="DEFAULT_COLLAPSE_STATE" [inCommunication]="true" - [reEmitNonDistinctSidebarEvents]="isMobile" + [reEmitNonDistinctSidebarEvents]="true" /> @if (course && !activeConversation && isCodeOfConductPresented) { @@ -57,9 +57,15 @@ (openThread)="postInThread = $event" [course]="course" [searchbarCollapsed]="channelSearchCollapsed" + [focusPostId]="focusPostId" + [openThreadOnFocus]="openThreadOnFocus" /> } @else { - + @if (selectedSavedPostStatus === null) { + + } @else { + + } }
diff --git a/src/main/webapp/app/overview/course-conversations/course-conversations.component.ts b/src/main/webapp/app/overview/course-conversations/course-conversations.component.ts index 1b194b218bd3..f65878c794e1 100644 --- a/src/main/webapp/app/overview/course-conversations/course-conversations.component.ts +++ b/src/main/webapp/app/overview/course-conversations/course-conversations.component.ts @@ -1,4 +1,4 @@ -import { Component, ElementRef, EventEmitter, HostListener, OnDestroy, OnInit, ViewChild, ViewEncapsulation, inject } from '@angular/core'; +import { ChangeDetectorRef, Component, ElementRef, EventEmitter, HostListener, OnDestroy, OnInit, ViewChild, ViewEncapsulation, inject } from '@angular/core'; import { ConversationDTO } from 'app/entities/metis/conversation/conversation.model'; import { Post } from 'app/entities/metis/post.model'; import { ActivatedRoute, Router } from '@angular/router'; @@ -10,7 +10,21 @@ import { ChannelDTO, ChannelSubType, getAsChannelDTO } from 'app/entities/metis/ import { MetisService } from 'app/shared/metis/metis.service'; import { Course, isMessagingEnabled } from 'app/entities/course.model'; import { PageType, SortDirection } from 'app/shared/metis/metis.util'; -import { faBan, faComment, faComments, faFile, faFilter, faGraduationCap, faHeart, faList, faMessage, faPlus, faSearch, faTimes } from '@fortawesome/free-solid-svg-icons'; +import { + faBan, + faBookmark, + faComment, + faComments, + faFile, + faFilter, + faGraduationCap, + faHeart, + faList, + faMessage, + faPlus, + faSearch, + faTimes, +} from '@fortawesome/free-solid-svg-icons'; import { ButtonType } from 'app/shared/components/button.component'; import { CourseWideSearchComponent, CourseWideSearchConfig } from 'app/overview/course-conversations/course-wide-search/course-wide-search.component'; import { AccordionGroups, ChannelAccordionShowAdd, ChannelTypeIcons, CollapseState, SidebarCardElement, SidebarData, SidebarItemShowAlways } from 'app/types/sidebar'; @@ -25,6 +39,7 @@ import { ChannelsCreateDialogComponent } from 'app/overview/course-conversations import { CourseSidebarService } from 'app/overview/course-sidebar.service'; import { LayoutService } from 'app/shared/breakpoints/layout.service'; import { CustomBreakpointNames } from 'app/shared/breakpoints/breakpoints.service'; +import { Posting, PostingType, SavedPostStatus, SavedPostStatusMap } from 'app/entities/metis/posting.model'; const DEFAULT_CHANNEL_GROUPS: AccordionGroups = { favoriteChannels: { entityData: [] }, @@ -33,6 +48,7 @@ const DEFAULT_CHANNEL_GROUPS: AccordionGroups = { lectureChannels: { entityData: [] }, examChannels: { entityData: [] }, hiddenChannels: { entityData: [] }, + savedPosts: { entityData: [] }, }; const CHANNEL_TYPE_SHOW_ADD_OPTION: ChannelAccordionShowAdd = { @@ -44,6 +60,7 @@ const CHANNEL_TYPE_SHOW_ADD_OPTION: ChannelAccordionShowAdd = { favoriteChannels: false, lectureChannels: true, hiddenChannels: false, + savedPosts: false, }; const CHANNEL_TYPE_ICON: ChannelTypeIcons = { @@ -55,6 +72,7 @@ const CHANNEL_TYPE_ICON: ChannelTypeIcons = { favoriteChannels: faHeart, lectureChannels: faFile, hiddenChannels: faBan, + savedPosts: faBookmark, }; const DEFAULT_COLLAPSE_STATE: CollapseState = { @@ -66,6 +84,7 @@ const DEFAULT_COLLAPSE_STATE: CollapseState = { favoriteChannels: false, lectureChannels: true, hiddenChannels: true, + savedPosts: true, }; const DEFAULT_SHOW_ALWAYS: SidebarItemShowAlways = { @@ -77,6 +96,7 @@ const DEFAULT_SHOW_ALWAYS: SidebarItemShowAlways = { favoriteChannels: true, lectureChannels: false, hiddenChannels: false, + savedPosts: true, }; @Component({ @@ -110,6 +130,9 @@ export class CourseConversationsComponent implements OnInit, OnDestroy { isProduction = true; isTestServer = false; isMobile = false; + focusPostId: number | undefined = undefined; + openThreadOnFocus = false; + selectedSavedPostStatus: null | SavedPostStatus = null; readonly CHANNEL_TYPE_SHOW_ADD_OPTION = CHANNEL_TYPE_SHOW_ADD_OPTION; readonly CHANNEL_TYPE_ICON = CHANNEL_TYPE_ICON; @@ -140,6 +163,7 @@ export class CourseConversationsComponent implements OnInit, OnDestroy { private courseSidebarService: CourseSidebarService = inject(CourseSidebarService); private layoutService: LayoutService = inject(LayoutService); + private changeDetector: ChangeDetectorRef = inject(ChangeDetectorRef); constructor( private router: Router, @@ -251,9 +275,23 @@ export class CourseConversationsComponent implements OnInit, OnDestroy { subscribeToQueryParameter() { this.activatedRoute.queryParams.pipe(take(1), takeUntil(this.ngUnsubscribe)).subscribe((queryParams) => { if (queryParams.conversationId) { - this.metisConversationService.setActiveConversation(Number(queryParams.conversationId)); - - this.closeSidebarOnMobile(); + if ( + isNaN(Number(queryParams.conversationId)) && + Object.values(SavedPostStatusMap) + .map((s) => s.toString()) + .includes(queryParams.conversationId) + ) { + this.selectedSavedPostStatus = Posting.mapToStatus(queryParams.conversationId as SavedPostStatusMap); + } else { + this.metisConversationService.setActiveConversation(Number(queryParams.conversationId)); + this.closeSidebarOnMobile(); + } + } + if (queryParams.focusPostId) { + this.focusPostId = Number(queryParams.focusPostId); + } + if (queryParams.openThreadOnFocus) { + this.openThreadOnFocus = queryParams.openThreadOnFocus; } if (queryParams.messageId) { this.postInThread = { id: Number(queryParams.messageId) } as Post; @@ -265,11 +303,22 @@ export class CourseConversationsComponent implements OnInit, OnDestroy { }); } + onNavigateToPost(post: Posting) { + if (post.referencePostId === undefined || post.conversation?.id === undefined) { + return; + } + + this.focusPostId = post.referencePostId; + this.openThreadOnFocus = (post.postingType as PostingType) === PostingType.ANSWER; + this.metisConversationService.setActiveConversation(post.conversation!.id!); + this.changeDetector.detectChanges(); + } + updateQueryParameters() { this.router.navigate([], { relativeTo: this.activatedRoute, queryParams: { - conversationId: this.activeConversation?.id, + conversationId: this.activeConversation?.id ?? (this.selectedSavedPostStatus !== null ? Posting.statusToMap(this.selectedSavedPostStatus) : undefined), }, replaceUrl: true, }); @@ -348,6 +397,7 @@ export class CourseConversationsComponent implements OnInit, OnDestroy { this.courseSidebarService.openSidebar(); } } + this.selectedSavedPostStatus = null; this.metisConversationService.setActiveConversation(undefined); this.activeConversation = undefined; this.updateQueryParameters(); @@ -377,9 +427,29 @@ export class CourseConversationsComponent implements OnInit, OnDestroy { }; } - onConversationSelected(conversationId: number) { + onConversationSelected(conversationId: number | string) { this.closeSidebarOnMobile(); - this.metisConversationService.setActiveConversation(conversationId); + this.focusPostId = undefined; + this.openThreadOnFocus = false; + if (typeof conversationId === 'string') { + if ( + Object.values(SavedPostStatusMap) + .map((s) => s.toString()) + .includes(conversationId) + ) { + this.selectedSavedPostStatus = Posting.mapToStatus(conversationId as SavedPostStatusMap); + this.postInThread = undefined; + this.metisConversationService.setActiveConversation(undefined); + this.activeConversation = undefined; + this.updateQueryParameters(); + this.metisService.resetCachedPosts(); + this.changeDetector.detectChanges(); + } + } else { + conversationId = +conversationId; + this.selectedSavedPostStatus = null; + this.metisConversationService.setActiveConversation(conversationId); + } } toggleSidebar() { diff --git a/src/main/webapp/app/overview/course-conversations/course-conversations.module.ts b/src/main/webapp/app/overview/course-conversations/course-conversations.module.ts index 0646118f577f..10d2cea22583 100644 --- a/src/main/webapp/app/overview/course-conversations/course-conversations.module.ts +++ b/src/main/webapp/app/overview/course-conversations/course-conversations.module.ts @@ -31,6 +31,8 @@ import { CourseConversationsCodeOfConductComponent } from 'app/overview/course-c import { CourseWideSearchComponent } from 'app/overview/course-conversations/course-wide-search/course-wide-search.component'; import { ArtemisSidebarModule } from 'app/shared/sidebar/sidebar.module'; import { ProfilePictureComponent } from 'app/shared/profile-picture/profile-picture.component'; +import { SavedPostsComponent } from 'app/overview/course-conversations/saved-posts/saved-posts.component'; +import { PostingSummaryComponent } from 'app/overview/course-conversations/posting-summary/posting-summary.component'; const routes: Routes = [ { @@ -79,6 +81,8 @@ const routes: Routes = [ OneToOneChatCreateDialogComponent, GroupChatCreateDialogComponent, CourseWideSearchComponent, + SavedPostsComponent, + PostingSummaryComponent, ], }) export class CourseConversationsModule {} diff --git a/src/main/webapp/app/overview/course-conversations/course-wide-search/course-wide-search.component.html b/src/main/webapp/app/overview/course-conversations/course-wide-search/course-wide-search.component.html index 1295be3edf63..c9641f8aa287 100644 --- a/src/main/webapp/app/overview/course-conversations/course-wide-search/course-wide-search.component.html +++ b/src/main/webapp/app/overview/course-conversations/course-wide-search/course-wide-search.component.html @@ -72,7 +72,7 @@

}
-