Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 34 additions & 34 deletions src/main/webapp/app/core/course/manage/course-management.route.ts

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -196,8 +196,9 @@ <h4 jhiTranslate="artemisApp.lecture.attachments.editAttachment"></h4>
</form>
} @else {
<a
[routerLink]="['/course-management', lecture().course?.id, `lectures`, lecture().id, 'unit-management', 'attachment-units', 'create']"
[routerLink]="['/course-management', lecture().course?.id, `lectures`, lecture().id, 'unit-management', 'attachment-video-units', 'create']"
class="btn btn-primary me-2"
id="add-attachment"
>
<span jhiTranslate="entity.action.addAttachment"></span>
</a>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,12 @@ import { SortByDirective } from 'app/shared/sort/directive/sort-by.directive';
imports: [TranslateDirective, FaIconComponent, SortDirective, SortByDirective],
})
export class CreateExerciseUnitComponent implements OnInit {
private activatedRoute = inject(ActivatedRoute);
private router = inject(Router);
private courseManagementService = inject(CourseManagementService);
private alertService = inject(AlertService);
private sortService = inject(SortService);
private exerciseUnitService = inject(ExerciseUnitService);
private readonly activatedRoute = inject(ActivatedRoute);
private readonly router = inject(Router);
private readonly courseManagementService = inject(CourseManagementService);
private readonly alertService = inject(AlertService);
private readonly sortService = inject(SortService);
private readonly exerciseUnitService = inject(ExerciseUnitService);

protected readonly faTimes = faTimes;
protected readonly faSort = faSort;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Routes } from '@angular/router';
import { Authority } from 'app/shared/constants/authority.constants';
import { IS_AT_LEAST_EDITOR } from 'app/shared/constants/authority.constants';
import { UserRouteAccessService } from 'app/core/auth/user-route-access-service';
import { CourseManagementResolve } from 'app/core/course/manage/services/course-management-resolve.service';
import { AttachmentVideoUnitResolve } from 'app/lecture/manage/lecture-units/services/lecture-unit-management-resolve.service';
Expand All @@ -9,7 +9,7 @@ export const lectureUnitRoute: Routes = [
path: 'unit-management',
loadComponent: () => import('app/lecture/manage/lecture-units/management/lecture-unit-management.component').then((m) => m.LectureUnitManagementComponent),
data: {
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
authorities: IS_AT_LEAST_EDITOR,
pageTitle: 'artemisApp.lectureUnit.home.title',
},
canActivate: [UserRouteAccessService],
Expand All @@ -25,7 +25,7 @@ export const lectureUnitRoute: Routes = [
path: 'exercise-units/create',
loadComponent: () => import('app/lecture/manage/lecture-units/create-exercise-unit/create-exercise-unit.component').then((m) => m.CreateExerciseUnitComponent),
data: {
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
authorities: IS_AT_LEAST_EDITOR,
pageTitle: 'artemisApp.exerciseUnit.createExerciseUnit.title',
},
},
Expand All @@ -34,7 +34,7 @@ export const lectureUnitRoute: Routes = [
loadComponent: () =>
import('app/lecture/manage/lecture-units/attachment-video-units/attachment-video-units.component').then((m) => m.AttachmentVideoUnitsComponent),
data: {
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
authorities: IS_AT_LEAST_EDITOR,
pageTitle: 'artemisApp.attachmentVideoUnit.createAttachmentVideoUnits.pageTitle',
},
},
Expand All @@ -45,23 +45,23 @@ export const lectureUnitRoute: Routes = [
(m) => m.CreateAttachmentVideoUnitComponent,
),
data: {
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
authorities: IS_AT_LEAST_EDITOR,
pageTitle: 'artemisApp.attachmentVideoUnit.createAttachmentVideoUnit.title',
},
},
{
path: 'online-units/create',
loadComponent: () => import('app/lecture/manage/lecture-units/create-online-unit/create-online-unit.component').then((m) => m.CreateOnlineUnitComponent),
data: {
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
authorities: IS_AT_LEAST_EDITOR,
pageTitle: 'artemisApp.onlineUnit.createOnlineUnit.title',
},
},
{
path: 'text-units/create',
loadComponent: () => import('app/lecture/manage/lecture-units/create-text-unit/create-text-unit.component').then((m) => m.CreateTextUnitComponent),
data: {
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
authorities: IS_AT_LEAST_EDITOR,
pageTitle: 'artemisApp.textUnit.createTextUnit.title',
},
},
Expand All @@ -70,7 +70,7 @@ export const lectureUnitRoute: Routes = [
loadComponent: () =>
import('app/lecture/manage/lecture-units/edit-attachment-video-unit/edit-attachment-video-unit.component').then((m) => m.EditAttachmentVideoUnitComponent),
data: {
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
authorities: IS_AT_LEAST_EDITOR,
pageTitle: 'artemisApp.attachmentVideoUnit.editAttachmentVideoUnit.title',
},
},
Expand All @@ -86,15 +86,15 @@ export const lectureUnitRoute: Routes = [
path: 'online-units/:onlineUnitId/edit',
loadComponent: () => import('app/lecture/manage/lecture-units/edit-online-unit/edit-online-unit.component').then((m) => m.EditOnlineUnitComponent),
data: {
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
authorities: IS_AT_LEAST_EDITOR,
pageTitle: 'artemisApp.onlineUnit.editOnlineUnit.title',
},
},
{
path: 'text-units/:textUnitId/edit',
loadComponent: () => import('app/lecture/manage/lecture-units/edit-text-unit/edit-text-unit.component').then((m) => m.EditTextUnitComponent),
data: {
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
authorities: IS_AT_LEAST_EDITOR,
pageTitle: 'artemisApp.textUnit.editTextUnit.title',
},
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -369,9 +369,6 @@ describe('LectureUpdateComponent', () => {
lectureUpdateComponent.lecturePeriodSection = signal({
isPeriodSectionValid: () => true,
} as any);
lectureUpdateComponent.attachmentsSection = signal({
isFormValid: () => true,
} as any);
lectureUpdateComponent.unitSection = signal({
isUnitConfigurationValid: () => true,
} as any);
Expand All @@ -381,7 +378,6 @@ describe('LectureUpdateComponent', () => {
expect(lectureUpdateComponent.formStatusSections).toEqual([
{ title: 'artemisApp.lecture.sections.title', valid: true },
{ title: 'artemisApp.lecture.sections.period', valid: true },
{ title: 'artemisApp.lecture.sections.attachments', valid: true },
{ title: 'artemisApp.lecture.sections.units', valid: true },
]);
});
Expand Down Expand Up @@ -415,9 +411,6 @@ describe('LectureUpdateComponent', () => {
lectureUpdateComponent.lecturePeriodSection = signal({
isPeriodSectionValid: () => false,
} as any);
lectureUpdateComponent.attachmentsSection = signal({
isFormValid: () => false,
} as any);
lectureUpdateComponent.unitSection = signal({
isUnitConfigurationValid: () => false,
} as any);
Expand All @@ -427,7 +420,6 @@ describe('LectureUpdateComponent', () => {
expect(lectureUpdateComponent.formStatusSections).toEqual([
{ title: 'artemisApp.lecture.sections.title', valid: false },
{ title: 'artemisApp.lecture.sections.period', valid: false },
{ title: 'artemisApp.lecture.sections.attachments', valid: false },
{ title: 'artemisApp.lecture.sections.units', valid: false },
]);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import { LectureUpdatePeriodComponent } from 'app/lecture/manage/lecture-period/
import dayjs, { Dayjs } from 'dayjs/esm';
import { FormDateTimePickerComponent } from 'app/shared/date-time-picker/date-time-picker.component';
import cloneDeep from 'lodash-es/cloneDeep';
import { LectureAttachmentsComponent } from 'app/lecture/manage/lecture-attachments/lecture-attachments.component';
import { LectureUpdateUnitsComponent } from 'app/lecture/manage/lecture-units/lecture-units.component';
import { FormsModule } from '@angular/forms';
import { TranslateDirective } from 'app/shared/language/translate.directive';
Expand Down Expand Up @@ -65,7 +64,6 @@ export class LectureUpdateComponent implements OnInit, OnDestroy {

titleSection = viewChild.required(LectureTitleChannelNameComponent);
lecturePeriodSection = viewChild.required(LectureUpdatePeriodComponent);
attachmentsSection = viewChild(LectureAttachmentsComponent);
unitSection = viewChild(LectureUpdateUnitsComponent);
formStatusBar = viewChild(FormStatusBarComponent);

Expand Down Expand Up @@ -95,8 +93,7 @@ export class LectureUpdateComponent implements OnInit, OnDestroy {
return (
this.titleSection().titleChannelNameComponent().isValid() &&
this.lecturePeriodSection().isPeriodSectionValid() &&
(this.unitSection()?.isUnitConfigurationValid() ?? true) &&
(this.attachmentsSection()?.isFormValid() ?? true)
(this.unitSection()?.isUnitConfigurationValid() ?? true)
);
});

Expand Down Expand Up @@ -183,16 +180,10 @@ export class LectureUpdateComponent implements OnInit, OnDestroy {
);

if (this.isEditMode()) {
updatedFormStatusSections.push(
{
title: 'artemisApp.lecture.sections.attachments',
valid: Boolean(this.attachmentsSection()?.isFormValid()),
},
{
title: 'artemisApp.lecture.sections.units',
valid: Boolean(this.unitSection()?.isUnitConfigurationValid()),
},
);
updatedFormStatusSections.push({
title: 'artemisApp.lecture.sections.units',
valid: Boolean(this.unitSection()?.isUnitConfigurationValid()),
});
}

this.formStatusSections = updatedFormStatusSections;
Expand Down
12 changes: 6 additions & 6 deletions src/main/webapp/app/lecture/manage/lecture.route.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Routes } from '@angular/router';
import { UserRouteAccessService } from 'app/core/auth/user-route-access-service';

import { Authority } from 'app/shared/constants/authority.constants';
import { IS_AT_LEAST_EDITOR } from 'app/shared/constants/authority.constants';
import { lectureUnitRoute } from 'app/lecture/manage/lecture-units/lecture-unit-management.route';
import { CourseManagementResolve } from 'app/core/course/manage/services/course-management-resolve.service';
import { hasLectureUnsavedChangesGuard } from './hasLectureUnsavedChanges.guard';
Expand All @@ -15,7 +15,7 @@ export const lectureRoute: Routes = [
course: CourseManagementResolve,
},
data: {
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
authorities: IS_AT_LEAST_EDITOR,
pageTitle: 'artemisApp.lecture.home.title',
},
canActivate: [UserRouteAccessService],
Expand All @@ -31,7 +31,7 @@ export const lectureRoute: Routes = [
path: 'new',
loadComponent: () => import('./lecture-update/lecture-update.component').then((m) => m.LectureUpdateComponent),
data: {
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
authorities: IS_AT_LEAST_EDITOR,
pageTitle: 'global.generic.create',
},
canActivate: [UserRouteAccessService],
Expand All @@ -43,7 +43,7 @@ export const lectureRoute: Routes = [
lecture: LectureResolve,
},
data: {
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
authorities: IS_AT_LEAST_EDITOR,
pageTitle: 'artemisApp.lecture.home.title',
},
canActivate: [UserRouteAccessService],
Expand All @@ -58,7 +58,7 @@ export const lectureRoute: Routes = [
path: 'attachments',
loadComponent: () => import('app/lecture/manage/lecture-attachments/lecture-attachments.component').then((m) => m.LectureAttachmentsComponent),
data: {
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
authorities: IS_AT_LEAST_EDITOR,
pageTitle: 'artemisApp.lecture.attachments.title',
},
canActivate: [UserRouteAccessService],
Expand All @@ -81,7 +81,7 @@ export const lectureRoute: Routes = [
path: 'edit',
loadComponent: () => import('./lecture-update/lecture-update.component').then((m) => m.LectureUpdateComponent),
data: {
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
authorities: IS_AT_LEAST_EDITOR,
pageTitle: 'global.generic.edit',
},
canActivate: [UserRouteAccessService],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,12 +166,10 @@
<div class="btn-group flex-btn-group-container">
<div class="btn-group-vertical me-1 mb-1">
@if (lecture.isAtLeastEditor) {
<a [routerLink]="[lecture.id, 'attachments']" class="btn btn-primary mb-1 btn-sm">
<a [routerLink]="[lecture.id, 'attachments']" class="btn btn-primary mb-1 btn-sm" id="attachments">
<fa-icon [icon]="faFile" />
<span class="d-none d-md-inline" jhiTranslate="entity.action.attachments"></span>
</a>
}
@if (lecture.isAtLeastEditor) {
<a [routerLink]="[lecture.id, 'unit-management']" class="btn btn-primary btn-sm" id="units">
<fa-icon [icon]="faPuzzlePiece" />
<span class="d-none d-md-inline" jhiTranslate="entity.action.units"></span>
Expand Down
3 changes: 3 additions & 0 deletions src/main/webapp/app/shared/constants/authority.constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,6 @@ export enum Authority {
}

export const IS_AT_LEAST_TUTOR: readonly Authority[] = [Authority.ADMIN, Authority.INSTRUCTOR, Authority.EDITOR, Authority.TA];
export const IS_AT_LEAST_EDITOR: readonly Authority[] = [Authority.ADMIN, Authority.INSTRUCTOR, Authority.EDITOR];
export const IS_AT_LEAST_INSTRUCTOR: readonly Authority[] = [Authority.ADMIN, Authority.INSTRUCTOR];
export const IS_AT_LEAST_ADMIN: readonly Authority[] = [Authority.ADMIN];
5 changes: 5 additions & 0 deletions src/test/playwright/e2e/lecture/LectureManagement.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,11 @@ test.describe('Lecture management', { tag: '@fast' }, () => {
await lectureManagement.addExerciseUnit(exercise.id!);
await expect(page.locator('.exercise-title', { hasText: new RegExp(`^${exercise.title!}$`) })).toBeVisible();
});

test('Can open page to add attachment unit to the lecture', async ({ lectureManagement, page }) => {
await lectureManagement.openAttachmentUnitCreationPage(lecture.id!);
await expect(page.getByText('Create Attachment Unit')).toBeVisible();
});
});

test.afterEach(async ({ courseManagementAPIRequests }) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,19 @@ export class LectureManagementPage {
await this.getLecture(lectureId).locator('#units').click();
}

/**
* Navigates to the attachments page of a specified lecture by its identifier.
* @param lectureId - The identifier of the lecture to navigate to its attachments page.
*/
async openAttachmentsPage(lectureId: number) {
await this.getLecture(lectureId).locator('#attachments').click();
}

async openAttachmentUnitCreationPage(lectureId: number) {
await this.openAttachmentsPage(lectureId);
await this.page.locator('#add-attachment').click();
}

/**
* Opens the creation form for a new unit of the specified type.
* @param type - The type of unit to create.
Expand Down
Loading