Skip to content

Commit 3826642

Browse files
Lectures: Fix attachment lecture units creation (#11115)
1 parent ec2a36f commit 3826642

File tree

11 files changed

+85
-82
lines changed

11 files changed

+85
-82
lines changed

src/main/webapp/app/core/course/manage/course-management.route.ts

Lines changed: 34 additions & 34 deletions
Large diffs are not rendered by default.

src/main/webapp/app/lecture/manage/lecture-attachments/lecture-attachments.component.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,9 @@ <h4 jhiTranslate="artemisApp.lecture.attachments.editAttachment"></h4>
196196
</form>
197197
} @else {
198198
<a
199-
[routerLink]="['/course-management', lecture().course?.id, `lectures`, lecture().id, 'unit-management', 'attachment-units', 'create']"
199+
[routerLink]="['/course-management', lecture().course?.id, `lectures`, lecture().id, 'unit-management', 'attachment-video-units', 'create']"
200200
class="btn btn-primary me-2"
201+
id="add-attachment"
201202
>
202203
<span jhiTranslate="entity.action.addAttachment"></span>
203204
</a>

src/main/webapp/app/lecture/manage/lecture-units/create-exercise-unit/create-exercise-unit.component.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@ import { SortByDirective } from 'app/shared/sort/directive/sort-by.directive';
2323
imports: [TranslateDirective, FaIconComponent, SortDirective, SortByDirective],
2424
})
2525
export class CreateExerciseUnitComponent implements OnInit {
26-
private activatedRoute = inject(ActivatedRoute);
27-
private router = inject(Router);
28-
private courseManagementService = inject(CourseManagementService);
29-
private alertService = inject(AlertService);
30-
private sortService = inject(SortService);
31-
private exerciseUnitService = inject(ExerciseUnitService);
26+
private readonly activatedRoute = inject(ActivatedRoute);
27+
private readonly router = inject(Router);
28+
private readonly courseManagementService = inject(CourseManagementService);
29+
private readonly alertService = inject(AlertService);
30+
private readonly sortService = inject(SortService);
31+
private readonly exerciseUnitService = inject(ExerciseUnitService);
3232

3333
protected readonly faTimes = faTimes;
3434
protected readonly faSort = faSort;

src/main/webapp/app/lecture/manage/lecture-units/lecture-unit-management.route.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Routes } from '@angular/router';
2-
import { Authority } from 'app/shared/constants/authority.constants';
2+
import { IS_AT_LEAST_EDITOR } from 'app/shared/constants/authority.constants';
33
import { UserRouteAccessService } from 'app/core/auth/user-route-access-service';
44
import { CourseManagementResolve } from 'app/core/course/manage/services/course-management-resolve.service';
55
import { AttachmentVideoUnitResolve } from 'app/lecture/manage/lecture-units/services/lecture-unit-management-resolve.service';
@@ -9,7 +9,7 @@ export const lectureUnitRoute: Routes = [
99
path: 'unit-management',
1010
loadComponent: () => import('app/lecture/manage/lecture-units/management/lecture-unit-management.component').then((m) => m.LectureUnitManagementComponent),
1111
data: {
12-
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
12+
authorities: IS_AT_LEAST_EDITOR,
1313
pageTitle: 'artemisApp.lectureUnit.home.title',
1414
},
1515
canActivate: [UserRouteAccessService],
@@ -25,7 +25,7 @@ export const lectureUnitRoute: Routes = [
2525
path: 'exercise-units/create',
2626
loadComponent: () => import('app/lecture/manage/lecture-units/create-exercise-unit/create-exercise-unit.component').then((m) => m.CreateExerciseUnitComponent),
2727
data: {
28-
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
28+
authorities: IS_AT_LEAST_EDITOR,
2929
pageTitle: 'artemisApp.exerciseUnit.createExerciseUnit.title',
3030
},
3131
},
@@ -34,7 +34,7 @@ export const lectureUnitRoute: Routes = [
3434
loadComponent: () =>
3535
import('app/lecture/manage/lecture-units/attachment-video-units/attachment-video-units.component').then((m) => m.AttachmentVideoUnitsComponent),
3636
data: {
37-
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
37+
authorities: IS_AT_LEAST_EDITOR,
3838
pageTitle: 'artemisApp.attachmentVideoUnit.createAttachmentVideoUnits.pageTitle',
3939
},
4040
},
@@ -45,23 +45,23 @@ export const lectureUnitRoute: Routes = [
4545
(m) => m.CreateAttachmentVideoUnitComponent,
4646
),
4747
data: {
48-
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
48+
authorities: IS_AT_LEAST_EDITOR,
4949
pageTitle: 'artemisApp.attachmentVideoUnit.createAttachmentVideoUnit.title',
5050
},
5151
},
5252
{
5353
path: 'online-units/create',
5454
loadComponent: () => import('app/lecture/manage/lecture-units/create-online-unit/create-online-unit.component').then((m) => m.CreateOnlineUnitComponent),
5555
data: {
56-
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
56+
authorities: IS_AT_LEAST_EDITOR,
5757
pageTitle: 'artemisApp.onlineUnit.createOnlineUnit.title',
5858
},
5959
},
6060
{
6161
path: 'text-units/create',
6262
loadComponent: () => import('app/lecture/manage/lecture-units/create-text-unit/create-text-unit.component').then((m) => m.CreateTextUnitComponent),
6363
data: {
64-
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
64+
authorities: IS_AT_LEAST_EDITOR,
6565
pageTitle: 'artemisApp.textUnit.createTextUnit.title',
6666
},
6767
},
@@ -70,7 +70,7 @@ export const lectureUnitRoute: Routes = [
7070
loadComponent: () =>
7171
import('app/lecture/manage/lecture-units/edit-attachment-video-unit/edit-attachment-video-unit.component').then((m) => m.EditAttachmentVideoUnitComponent),
7272
data: {
73-
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
73+
authorities: IS_AT_LEAST_EDITOR,
7474
pageTitle: 'artemisApp.attachmentVideoUnit.editAttachmentVideoUnit.title',
7575
},
7676
},
@@ -86,15 +86,15 @@ export const lectureUnitRoute: Routes = [
8686
path: 'online-units/:onlineUnitId/edit',
8787
loadComponent: () => import('app/lecture/manage/lecture-units/edit-online-unit/edit-online-unit.component').then((m) => m.EditOnlineUnitComponent),
8888
data: {
89-
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
89+
authorities: IS_AT_LEAST_EDITOR,
9090
pageTitle: 'artemisApp.onlineUnit.editOnlineUnit.title',
9191
},
9292
},
9393
{
9494
path: 'text-units/:textUnitId/edit',
9595
loadComponent: () => import('app/lecture/manage/lecture-units/edit-text-unit/edit-text-unit.component').then((m) => m.EditTextUnitComponent),
9696
data: {
97-
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
97+
authorities: IS_AT_LEAST_EDITOR,
9898
pageTitle: 'artemisApp.textUnit.editTextUnit.title',
9999
},
100100
},

src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.spec.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -369,9 +369,6 @@ describe('LectureUpdateComponent', () => {
369369
lectureUpdateComponent.lecturePeriodSection = signal({
370370
isPeriodSectionValid: () => true,
371371
} as any);
372-
lectureUpdateComponent.attachmentsSection = signal({
373-
isFormValid: () => true,
374-
} as any);
375372
lectureUpdateComponent.unitSection = signal({
376373
isUnitConfigurationValid: () => true,
377374
} as any);
@@ -381,7 +378,6 @@ describe('LectureUpdateComponent', () => {
381378
expect(lectureUpdateComponent.formStatusSections).toEqual([
382379
{ title: 'artemisApp.lecture.sections.title', valid: true },
383380
{ title: 'artemisApp.lecture.sections.period', valid: true },
384-
{ title: 'artemisApp.lecture.sections.attachments', valid: true },
385381
{ title: 'artemisApp.lecture.sections.units', valid: true },
386382
]);
387383
});
@@ -415,9 +411,6 @@ describe('LectureUpdateComponent', () => {
415411
lectureUpdateComponent.lecturePeriodSection = signal({
416412
isPeriodSectionValid: () => false,
417413
} as any);
418-
lectureUpdateComponent.attachmentsSection = signal({
419-
isFormValid: () => false,
420-
} as any);
421414
lectureUpdateComponent.unitSection = signal({
422415
isUnitConfigurationValid: () => false,
423416
} as any);
@@ -427,7 +420,6 @@ describe('LectureUpdateComponent', () => {
427420
expect(lectureUpdateComponent.formStatusSections).toEqual([
428421
{ title: 'artemisApp.lecture.sections.title', valid: false },
429422
{ title: 'artemisApp.lecture.sections.period', valid: false },
430-
{ title: 'artemisApp.lecture.sections.attachments', valid: false },
431423
{ title: 'artemisApp.lecture.sections.units', valid: false },
432424
]);
433425
});

src/main/webapp/app/lecture/manage/lecture-update/lecture-update.component.ts

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import { LectureUpdatePeriodComponent } from 'app/lecture/manage/lecture-period/
1717
import dayjs, { Dayjs } from 'dayjs/esm';
1818
import { FormDateTimePickerComponent } from 'app/shared/date-time-picker/date-time-picker.component';
1919
import cloneDeep from 'lodash-es/cloneDeep';
20-
import { LectureAttachmentsComponent } from 'app/lecture/manage/lecture-attachments/lecture-attachments.component';
2120
import { LectureUpdateUnitsComponent } from 'app/lecture/manage/lecture-units/lecture-units.component';
2221
import { FormsModule } from '@angular/forms';
2322
import { TranslateDirective } from 'app/shared/language/translate.directive';
@@ -65,7 +64,6 @@ export class LectureUpdateComponent implements OnInit, OnDestroy {
6564

6665
titleSection = viewChild.required(LectureTitleChannelNameComponent);
6766
lecturePeriodSection = viewChild.required(LectureUpdatePeriodComponent);
68-
attachmentsSection = viewChild(LectureAttachmentsComponent);
6967
unitSection = viewChild(LectureUpdateUnitsComponent);
7068
formStatusBar = viewChild(FormStatusBarComponent);
7169

@@ -95,8 +93,7 @@ export class LectureUpdateComponent implements OnInit, OnDestroy {
9593
return (
9694
this.titleSection().titleChannelNameComponent().isValid() &&
9795
this.lecturePeriodSection().isPeriodSectionValid() &&
98-
(this.unitSection()?.isUnitConfigurationValid() ?? true) &&
99-
(this.attachmentsSection()?.isFormValid() ?? true)
96+
(this.unitSection()?.isUnitConfigurationValid() ?? true)
10097
);
10198
});
10299

@@ -183,16 +180,10 @@ export class LectureUpdateComponent implements OnInit, OnDestroy {
183180
);
184181

185182
if (this.isEditMode()) {
186-
updatedFormStatusSections.push(
187-
{
188-
title: 'artemisApp.lecture.sections.attachments',
189-
valid: Boolean(this.attachmentsSection()?.isFormValid()),
190-
},
191-
{
192-
title: 'artemisApp.lecture.sections.units',
193-
valid: Boolean(this.unitSection()?.isUnitConfigurationValid()),
194-
},
195-
);
183+
updatedFormStatusSections.push({
184+
title: 'artemisApp.lecture.sections.units',
185+
valid: Boolean(this.unitSection()?.isUnitConfigurationValid()),
186+
});
196187
}
197188

198189
this.formStatusSections = updatedFormStatusSections;

src/main/webapp/app/lecture/manage/lecture.route.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Routes } from '@angular/router';
22
import { UserRouteAccessService } from 'app/core/auth/user-route-access-service';
33

4-
import { Authority } from 'app/shared/constants/authority.constants';
4+
import { IS_AT_LEAST_EDITOR } from 'app/shared/constants/authority.constants';
55
import { lectureUnitRoute } from 'app/lecture/manage/lecture-units/lecture-unit-management.route';
66
import { CourseManagementResolve } from 'app/core/course/manage/services/course-management-resolve.service';
77
import { hasLectureUnsavedChangesGuard } from './hasLectureUnsavedChanges.guard';
@@ -15,7 +15,7 @@ export const lectureRoute: Routes = [
1515
course: CourseManagementResolve,
1616
},
1717
data: {
18-
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
18+
authorities: IS_AT_LEAST_EDITOR,
1919
pageTitle: 'artemisApp.lecture.home.title',
2020
},
2121
canActivate: [UserRouteAccessService],
@@ -31,7 +31,7 @@ export const lectureRoute: Routes = [
3131
path: 'new',
3232
loadComponent: () => import('./lecture-update/lecture-update.component').then((m) => m.LectureUpdateComponent),
3333
data: {
34-
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
34+
authorities: IS_AT_LEAST_EDITOR,
3535
pageTitle: 'global.generic.create',
3636
},
3737
canActivate: [UserRouteAccessService],
@@ -43,7 +43,7 @@ export const lectureRoute: Routes = [
4343
lecture: LectureResolve,
4444
},
4545
data: {
46-
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
46+
authorities: IS_AT_LEAST_EDITOR,
4747
pageTitle: 'artemisApp.lecture.home.title',
4848
},
4949
canActivate: [UserRouteAccessService],
@@ -58,7 +58,7 @@ export const lectureRoute: Routes = [
5858
path: 'attachments',
5959
loadComponent: () => import('app/lecture/manage/lecture-attachments/lecture-attachments.component').then((m) => m.LectureAttachmentsComponent),
6060
data: {
61-
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
61+
authorities: IS_AT_LEAST_EDITOR,
6262
pageTitle: 'artemisApp.lecture.attachments.title',
6363
},
6464
canActivate: [UserRouteAccessService],
@@ -81,7 +81,7 @@ export const lectureRoute: Routes = [
8181
path: 'edit',
8282
loadComponent: () => import('./lecture-update/lecture-update.component').then((m) => m.LectureUpdateComponent),
8383
data: {
84-
authorities: [Authority.EDITOR, Authority.INSTRUCTOR, Authority.ADMIN],
84+
authorities: IS_AT_LEAST_EDITOR,
8585
pageTitle: 'global.generic.edit',
8686
},
8787
canActivate: [UserRouteAccessService],

src/main/webapp/app/lecture/manage/lecture/lecture.component.html

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,12 +166,10 @@
166166
<div class="btn-group flex-btn-group-container">
167167
<div class="btn-group-vertical me-1 mb-1">
168168
@if (lecture.isAtLeastEditor) {
169-
<a [routerLink]="[lecture.id, 'attachments']" class="btn btn-primary mb-1 btn-sm">
169+
<a [routerLink]="[lecture.id, 'attachments']" class="btn btn-primary mb-1 btn-sm" id="attachments">
170170
<fa-icon [icon]="faFile" />
171171
<span class="d-none d-md-inline" jhiTranslate="entity.action.attachments"></span>
172172
</a>
173-
}
174-
@if (lecture.isAtLeastEditor) {
175173
<a [routerLink]="[lecture.id, 'unit-management']" class="btn btn-primary btn-sm" id="units">
176174
<fa-icon [icon]="faPuzzlePiece" />
177175
<span class="d-none d-md-inline" jhiTranslate="entity.action.units"></span>

src/main/webapp/app/shared/constants/authority.constants.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@ export enum Authority {
77
}
88

99
export const IS_AT_LEAST_TUTOR: readonly Authority[] = [Authority.ADMIN, Authority.INSTRUCTOR, Authority.EDITOR, Authority.TA];
10+
export const IS_AT_LEAST_EDITOR: readonly Authority[] = [Authority.ADMIN, Authority.INSTRUCTOR, Authority.EDITOR];
11+
export const IS_AT_LEAST_INSTRUCTOR: readonly Authority[] = [Authority.ADMIN, Authority.INSTRUCTOR];
12+
export const IS_AT_LEAST_ADMIN: readonly Authority[] = [Authority.ADMIN];

src/test/playwright/e2e/lecture/LectureManagement.spec.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,11 @@ test.describe('Lecture management', { tag: '@fast' }, () => {
9494
await lectureManagement.addExerciseUnit(exercise.id!);
9595
await expect(page.locator('.exercise-title', { hasText: new RegExp(`^${exercise.title!}$`) })).toBeVisible();
9696
});
97+
98+
test('Can open page to add attachment unit to the lecture', async ({ lectureManagement, page }) => {
99+
await lectureManagement.openAttachmentUnitCreationPage(lecture.id!);
100+
await expect(page.getByText('Create Attachment Unit')).toBeVisible();
101+
});
97102
});
98103

99104
test.afterEach(async ({ courseManagementAPIRequests }) => {

0 commit comments

Comments
 (0)