Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adaptive learning: Allow creating and updating prerequisite competencies #8765

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
108 commits
Select commit Hold shift + click to select a range
afd2fdf
Add database migration and basic entities
rstief May 24, 2024
656eddd
Make changeset more readable, add comments and fix small MySQL bug
rstief May 24, 2024
0d29b03
Remove all occurrences of prerequisites in the server code
rstief May 24, 2024
fc7eb1e
Add Repository, Service and DTOs
rstief May 24, 2024
a69a1af
Add Prerequisite Endpoints, Change Authorization to @EnforceAtLeastRo…
rstief May 24, 2024
ab982ac
Move prerequisites to own resource, add prerequisite import endpoint
rstief May 26, 2024
3a18271
Remove unused methods from old competency import
rstief May 26, 2024
490109e
Merge branch 'develop' into chore/adaptive-learning/add-prerequisite-…
rstief May 26, 2024
0fd62e2
Fix import
rstief May 26, 2024
4cac566
Add server tests
rstief May 27, 2024
e9829b2
Improve import, add test for update prerequisite
rstief May 28, 2024
a95a08e
Change competency model to be an interface
rstief May 28, 2024
1d37566
Adjust client code to support new prerequisites
rstief May 28, 2024
91e2b40
Merge branch 'develop' into chore/adaptive-learning/add-prerequisite-…
rstief May 28, 2024
dce5b56
Add javadoc
rstief May 29, 2024
da250f4
Add client code
rstief May 29, 2024
1c0361c
fix changelog
rstief May 29, 2024
47e0e5e
server style, fix tests
rstief May 29, 2024
15a716d
Improve client tests
rstief May 29, 2024
2fb88c6
Fix server tests
rstief May 29, 2024
14b8516
Merge branch 'develop' into chore/adaptive-learning/add-prerequisite-…
rstief May 29, 2024
cb49122
Remove todo comments
rstief May 29, 2024
ebdd8e9
Remove create/update (will be re-added in follow-up PR)
rstief May 29, 2024
5b9af2d
Revert "Remove create/update (will be re-added in follow-up PR)"
rstief May 29, 2024
8d940ae
Rename competency-import-course.component to avoid confusion with new…
rstief May 29, 2024
43f281d
Add client test or new import component
rstief May 29, 2024
4f0cfae
Remove unused tests
rstief May 30, 2024
1b12dfd
Fix recursive query
rstief May 30, 2024
5152638
Fix another server test
rstief May 30, 2024
6c0db66
Merge branch 'develop' into chore/adaptive-learning/add-prerequisite-…
rstief May 30, 2024
42219b9
Add client tests
rstief May 31, 2024
27ccdfa
Fix server warnings
rstief May 31, 2024
47f45d4
Fix server warnings (part2)
rstief May 31, 2024
940798f
Fix client tests
rstief May 31, 2024
960225e
Merge branch 'chore/adaptive-learning/add-prerequisite-entities' into…
rstief May 31, 2024
d1cf05f
Add tests for endpoints
rstief May 31, 2024
d42aadb
Remove unused code
rstief May 31, 2024
a1a27ce
Remove more unused code
rstief May 31, 2024
97a8bed
Add server tests
rstief May 31, 2024
a999120
Merge branch 'chore/adaptive-learning/add-prerequisite-entities' into…
rstief May 31, 2024
109cafb
Revert "Remove more unused code"
rstief May 31, 2024
b253e26
Revert "Remove unused code"
rstief May 31, 2024
ea33478
Update src/main/java/de/tum/in/www1/artemis/web/rest/competency/Prere…
rstief Jun 2, 2024
36536e7
Merge branch 'develop' into chore/adaptive-learning/add-prerequisite-…
rstief Jun 2, 2024
cac153a
Add JsonInclude Annotation
rstief Jun 2, 2024
f799758
Fix search empty search table translation
rstief Jun 2, 2024
8d632da
Apply suggestions from code review (german translations)
rstief Jun 2, 2024
19e438f
Revert rename competency -> course_competency, reduce size of discrim…
rstief Jun 3, 2024
a397eaf
Apply suggestions from code review
rstief Jun 3, 2024
1fc7c51
Merge branch 'develop' into chore/adaptive-learning/add-prerequisite-…
rstief Jun 3, 2024
e750006
Update src/main/webapp/app/course/competencies/prerequisite.service.ts
rstief Jun 3, 2024
02f3bde
Update src/main/webapp/app/course/competencies/prerequisite.service.ts
rstief Jun 3, 2024
c9fcb1b
Fix server test
rstief Jun 4, 2024
f743a71
Disallow import of competencies that have already been imported as pr…
rstief Jun 4, 2024
5c03d8b
Merge branch 'develop' into chore/adaptive-learning/add-prerequisite-…
rstief Jun 4, 2024
00a1c19
Fix tests
rstief Jun 4, 2024
dcb3381
Merge branch 'develop' into chore/adaptive-learning/add-prerequisite-…
rstief Jun 4, 2024
a03649d
Merge branch 'chore/adaptive-learning/add-prerequisite-entities' into…
rstief Jun 5, 2024
a2b7851
Merge branch 'develop' into chore/adaptive-learning/add-prerequisite-…
rstief Jun 5, 2024
3f0b74e
Fix merge problems
rstief Jun 5, 2024
f3d9dbd
Fix merge problems
rstief Jun 5, 2024
e19d069
Merge branch 'develop' into chore/adaptive-learning/add-prerequisite-…
rstief Jun 5, 2024
fd67e8e
Merge branch 'develop' into chore/adaptive-learning/add-prerequisite-…
rstief Jun 7, 2024
e3f4af0
Improve client coverage
rstief Jun 7, 2024
0437d5a
Further improve client coverage
rstief Jun 7, 2024
eb06aa9
First version of create/edit
rstief Jun 5, 2024
8aae933
Merge branch 'chore/adaptive-learning/add-prerequisite-entities' into…
rstief Jun 7, 2024
9239893
fix infinite loading bug
rstief Jun 7, 2024
ae95526
Merge branch 'develop' into chore/adaptive-learning/add-prerequisite-…
rstief Jun 7, 2024
37f84a6
Merge branch 'chore/adaptive-learning/add-prerequisite-entities' into…
rstief Jun 7, 2024
f673cfa
Add missing import
rstief Jun 7, 2024
5b0f950
Merge remote-tracking branch 'origin/chore/adaptive-learning/add-prer…
rstief Jun 7, 2024
e6ad0d6
Merge branch 'chore/adaptive-learning/add-prerequisite-entities' into…
rstief Jun 7, 2024
3610a14
Code Review Suggestions
rstief Jun 8, 2024
986aaae
Merge branch 'chore/adaptive-learning/add-prerequisite-entities' into…
rstief Jun 8, 2024
448dfba
Add more client tests ^^
rstief Jun 8, 2024
be0a43d
Merge branch 'chore/adaptive-learning/add-prerequisite-entities' into…
rstief Jun 8, 2024
661caf0
Finish create/edit components
rstief Jun 9, 2024
bc0c1c8
Adjust competency management
rstief Jun 9, 2024
8024cf3
remove TODO
rstief Jun 9, 2024
c99c65b
Add server test
rstief Jun 9, 2024
56bcd93
Add client tests
rstief Jun 9, 2024
0ec391c
Add more client tests
rstief Jun 9, 2024
da86acb
Add more client tests
rstief Jun 9, 2024
d36f06f
Fix server tests
rstief Jun 9, 2024
3b2e7eb
Fix server test
rstief Jun 9, 2024
e16ea1e
Fix server test
rstief Jun 9, 2024
36ea9b2
Add another client test
rstief Jun 9, 2024
44357dd
Fix a translation
rstief Jun 9, 2024
9d65c34
Add navbar translation
rstief Jun 9, 2024
decf056
Update src/main/webapp/i18n/en/competency.json
rstief Jun 10, 2024
a7c9019
Fix navigation bug
rstief Jun 10, 2024
18e193a
Merge remote-tracking branch 'origin/feature/adaptive-learning/allow-…
rstief Jun 10, 2024
70ca81a
Add javadocs, extract DTO
rstief Jun 11, 2024
797fb81
Merge branch 'chore/adaptive-learning/add-prerequisite-entities' into…
rstief Jun 11, 2024
a5b4a09
Update src/main/webapp/app/course/competencies/import-competencies/im…
rstief Jun 11, 2024
3a5c295
Merge branch 'chore/adaptive-learning/add-prerequisite-entities' into…
rstief Jun 12, 2024
ce368bb
Merge branch 'develop' into chore/adaptive-learning/add-prerequisite-…
rstief Jun 17, 2024
0be9ecf
Merge branch 'chore/adaptive-learning/add-prerequisite-entities' into…
rstief Jun 17, 2024
e8f0e17
Merge branch 'develop' into chore/adaptive-learning/add-prerequisite-…
rstief Jun 22, 2024
86c0b7f
Merge branch 'chore/adaptive-learning/add-prerequisite-entities' into…
rstief Jun 22, 2024
c4bdb06
Merge branch 'develop' into feature/adaptive-learning/allow-creating-…
rstief Jun 22, 2024
5f4ea0c
Update src/test/java/de/tum/in/www1/artemis/competency/PrerequisiteUt…
rstief Jun 22, 2024
02a1970
Fix style issues
rstief Jun 22, 2024
a0c2742
Apply suggestions from code review
rstief Jun 23, 2024
d3453ae
Update src/test/javascript/spec/component/competencies/competency-for…
rstief Jun 23, 2024
53832f0
Update src/test/javascript/spec/component/competencies/competency-for…
rstief Jun 23, 2024
89a1742
Merge branch 'develop' into feature/adaptive-learning/allow-creating-…
rstief Jun 23, 2024
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
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,13 @@ public interface CourseCompetencyRepository extends JpaRepository<CourseCompeten
""")
List<CourseCompetency> findAllByIdAndUserIsAtLeastEditorInCourse(@Param("courseCompetencyIds") List<Long> courseCompetencyIds, @Param("groups") Set<String> groups);

@Query("""
SELECT c.title
FROM CourseCompetency c
WHERE c.course.id = :courseId
""")
List<String> findAllTitlesByCourseId(@Param("courseId") long courseId);
rstief marked this conversation as resolved.
Show resolved Hide resolved

/**
* Finds a list of competencies by id and verifies that the user is at least editor in the respective courses.
* If any of the competencies are not accessible, throws a {@link EntityNotFoundException}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
*/
public interface PrerequisiteRepository extends JpaRepository<Prerequisite, Long> {

List<Prerequisite> findByCourseIdOrderById(long courseId);
List<Prerequisite> findAllByCourseIdOrderById(long courseId);

Optional<Prerequisite> findByIdAndCourseId(long prerequisiteId, long courseId);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import de.tum.in.www1.artemis.repository.PrerequisiteRepository;
import de.tum.in.www1.artemis.repository.UserRepository;
import de.tum.in.www1.artemis.service.AuthorizationCheckService;
import de.tum.in.www1.artemis.web.rest.dto.competency.PrerequisiteRequestDTO;

/**
* Service for managing {@link Prerequisite} competencies.
Expand Down Expand Up @@ -45,6 +46,44 @@ public PrerequisiteService(PrerequisiteRepository prerequisiteRepository, Course
this.authorizationCheckService = authorizationCheckService;
}

/**
* Creates a new prerequisite with the given values in the given course
*
* @param prerequisiteValues the values of the prerequisite to create
* @param courseId the id of the course to create the prerequisite in
* @return the created prerequisite
*/
public Prerequisite createPrerequisite(PrerequisiteRequestDTO prerequisiteValues, long courseId) {
var course = courseRepository.findByIdElseThrow(courseId);

var prerequisiteToCreate = new Prerequisite(prerequisiteValues.title(), prerequisiteValues.description(), prerequisiteValues.softDueDate(),
prerequisiteValues.masteryThreshold(), prerequisiteValues.taxonomy(), prerequisiteValues.optional());
prerequisiteToCreate.setCourse(course);

return prerequisiteRepository.save(prerequisiteToCreate);
}

/**
* Updates an existing prerequisite with the given values if it is part of the given course
*
* @param prerequisiteValues the new prerequisite values
* @param prerequisiteId the id of the prerequisite to update
* @param courseId the id of the course the prerequisite is part of
* @return the updated prerequisite
*/
public Prerequisite updatePrerequisite(PrerequisiteRequestDTO prerequisiteValues, long prerequisiteId, long courseId) {
var existingPrerequisite = prerequisiteRepository.findByIdAndCourseIdElseThrow(prerequisiteId, courseId);

existingPrerequisite.setTitle(prerequisiteValues.title());
existingPrerequisite.setDescription(prerequisiteValues.description());
existingPrerequisite.setTaxonomy(prerequisiteValues.taxonomy());
existingPrerequisite.setSoftDueDate(prerequisiteValues.softDueDate());
existingPrerequisite.setMasteryThreshold(prerequisiteValues.masteryThreshold());
existingPrerequisite.setOptional(prerequisiteValues.optional());

return prerequisiteRepository.save(existingPrerequisite);
}

/**
* Deletes an existing prerequisite if it is part of the given course or throws an EntityNotFoundException
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import de.tum.in.www1.artemis.repository.CompetencyProgressRepository;
import de.tum.in.www1.artemis.repository.CompetencyRelationRepository;
import de.tum.in.www1.artemis.repository.CompetencyRepository;
import de.tum.in.www1.artemis.repository.CourseCompetencyRepository;
import de.tum.in.www1.artemis.repository.CourseRepository;
import de.tum.in.www1.artemis.repository.UserRepository;
import de.tum.in.www1.artemis.security.Role;
Expand Down Expand Up @@ -105,13 +106,16 @@ public class CompetencyResource {

private final CompetencyRelationService competencyRelationService;

private final CourseCompetencyRepository courseCompetencyRepository;

private final CompetencyJolService competencyJolService;

public CompetencyResource(CourseRepository courseRepository, AuthorizationCheckService authorizationCheckService, UserRepository userRepository,
CompetencyRepository competencyRepository, CompetencyRelationRepository competencyRelationRepository, CompetencyService competencyService,
CompetencyProgressRepository competencyProgressRepository, CompetencyProgressService competencyProgressService, ExerciseService exerciseService,
LectureUnitService lectureUnitService, CompetencyRelationService competencyRelationService,
Optional<IrisCompetencyGenerationSessionService> irisCompetencyGenerationSessionService, CompetencyJolService competencyJolService) {
Optional<IrisCompetencyGenerationSessionService> irisCompetencyGenerationSessionService, CourseCompetencyRepository courseCompetencyRepository,
CompetencyJolService competencyJolService) {
this.courseRepository = courseRepository;
this.competencyRelationRepository = competencyRelationRepository;
this.authorizationCheckService = authorizationCheckService;
Expand All @@ -124,6 +128,7 @@ public CompetencyResource(CourseRepository courseRepository, AuthorizationCheckS
this.lectureUnitService = lectureUnitService;
this.competencyRelationService = competencyRelationService;
this.irisCompetencyGenerationSessionService = irisCompetencyGenerationSessionService;
this.courseCompetencyRepository = courseCompetencyRepository;
this.competencyJolService = competencyJolService;
}

Expand Down Expand Up @@ -536,6 +541,19 @@ public ResponseEntity<List<Competency>> generateCompetenciesFromCourseDescriptio
return ResponseEntity.ok().body(competencies);
}

/**
* GET courses/{courseId}/competencies/titles : Returns the titles of all course competencies. Used for a validator in the client
*
* @param courseId the id of the current course
* @return the titles of all course competencies
*/
@GetMapping("courses/{courseId}/competencies/titles")
@EnforceAtLeastEditorInCourse
rstief marked this conversation as resolved.
Show resolved Hide resolved
public ResponseEntity<List<String>> getCourseCompetencyTitles(@PathVariable Long courseId) {
final var titles = courseCompetencyRepository.findAllTitlesByCourseId(courseId);
return ResponseEntity.ok(titles);
}

/**
* Checks if the user has the necessary permissions and the competency matches the course.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
Expand All @@ -24,8 +25,10 @@
import de.tum.in.www1.artemis.security.Role;
import de.tum.in.www1.artemis.security.annotations.EnforceAtLeastStudent;
import de.tum.in.www1.artemis.security.annotations.enforceRoleInCourse.EnforceAtLeastEditorInCourse;
import de.tum.in.www1.artemis.security.annotations.enforceRoleInCourse.EnforceAtLeastStudentInCourse;
import de.tum.in.www1.artemis.service.AuthorizationCheckService;
import de.tum.in.www1.artemis.service.competency.PrerequisiteService;
import de.tum.in.www1.artemis.web.rest.dto.competency.PrerequisiteRequestDTO;
import de.tum.in.www1.artemis.web.rest.dto.competency.PrerequisiteResponseDTO;

/**
Expand Down Expand Up @@ -72,11 +75,66 @@ public ResponseEntity<List<PrerequisiteResponseDTO>> getPrerequisites(@PathVaria
authorizationCheckService.checkHasAtLeastRoleInCourseElseThrow(Role.STUDENT, course, null);
}

var prerequisites = prerequisiteRepository.findByCourseIdOrderById(courseId);
var prerequisites = prerequisiteRepository.findAllByCourseIdOrderById(courseId);

return ResponseEntity.ok(prerequisites.stream().map(PrerequisiteResponseDTO::of).toList());
}

/**
* GET /courses/:courseId/competencies/prerequisites/:prerequisiteId : Gets the prerequisite competency with the given id for a course.
*
* @param prerequisiteId the id of the prerequisite to fetch
* @param courseId the id of the course in which the prerequisite should exist
* @return the ResponseEntity with status 200 (OK) and with body the found prerequisite or with status 404 (Not Found)
*/
@GetMapping("courses/{courseId}/competencies/prerequisites/{prerequisiteId}")
@EnforceAtLeastStudentInCourse
public ResponseEntity<PrerequisiteResponseDTO> getPrerequisite(@PathVariable long prerequisiteId, @PathVariable long courseId) {
log.debug("REST request to get prerequisite with id: {}", prerequisiteId);

var prerequisite = prerequisiteRepository.findByIdAndCourseIdElseThrow(prerequisiteId, courseId);

return ResponseEntity.ok(PrerequisiteResponseDTO.of(prerequisite));
}

/**
* POST /courses/:courseId/prerequisites : creates a new prerequisite competency.
*
* @param courseId the id of the course to which the competency should be added
* @param prerequisite the prerequisite that should be created
* @return the ResponseEntity with status 201 (Created) and with body the new prerequisite
* @throws URISyntaxException if the Location URI syntax is incorrect
*/
@PostMapping("courses/{courseId}/competencies/prerequisites")
@EnforceAtLeastEditorInCourse
public ResponseEntity<PrerequisiteResponseDTO> createPrerequisite(@PathVariable long courseId, @RequestBody PrerequisiteRequestDTO prerequisite) throws URISyntaxException {
log.debug("REST request to create Prerequisite : {}", prerequisite);

final var savedPrerequisite = prerequisiteService.createPrerequisite(prerequisite, courseId);
final var uri = new URI("/api/courses/" + courseId + "/prerequisites/" + savedPrerequisite.getId());

return ResponseEntity.created(uri).body(PrerequisiteResponseDTO.of(savedPrerequisite));
}

/**
* PUT /courses/:courseId/prerequisites/:prerequisiteId : updates an existing prerequisite
*
* @param courseId the id of the course to which the prerequisite belongs
* @param prerequisiteId the id of the prerequisite to update
* @param prerequisiteValues the new prerequisite values
* @return the ResponseEntity with status 200 (OK)
*/
@PutMapping("courses/{courseId}/competencies/prerequisites/{prerequisiteId}")
@EnforceAtLeastEditorInCourse
public ResponseEntity<PrerequisiteResponseDTO> updatePrerequisite(@PathVariable long courseId, @PathVariable long prerequisiteId,
@RequestBody PrerequisiteRequestDTO prerequisiteValues) {
log.info("REST request to update Prerequisite with id : {}", prerequisiteId);

final var savedPrerequisite = prerequisiteService.updatePrerequisite(prerequisiteValues, prerequisiteId, courseId);

return ResponseEntity.ok(PrerequisiteResponseDTO.of(savedPrerequisite));
}

/**
* DELETE /courses/:courseId/prerequisites/:prerequisiteId : deletes an existing prerequisite
*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package de.tum.in.www1.artemis.web.rest.dto.competency;

import java.time.ZonedDateTime;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

import com.fasterxml.jackson.annotation.JsonInclude;

import de.tum.in.www1.artemis.domain.competency.CompetencyTaxonomy;
import de.tum.in.www1.artemis.domain.competency.CourseCompetency;
import de.tum.in.www1.artemis.domain.competency.Prerequisite;

/**
* DTO used to send create/update requests regarding {@link Prerequisite} objects.
*/
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public record PrerequisiteRequestDTO(@NotBlank @Size(min = 1, max = CourseCompetency.MAX_TITLE_LENGTH) String title, String description, CompetencyTaxonomy taxonomy,
ZonedDateTime softDueDate, int masteryThreshold, boolean optional) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { LectureUnit } from 'app/entities/lecture-unit/lectureUnit.model';
import { TranslateService } from '@ngx-translate/core';
import { LectureUnitService } from 'app/lecture/lecture-unit/lecture-unit-management/lectureUnit.service';
import { intersection } from 'lodash-es';
import { CompetencyTaxonomy, CompetencyValidators, DEFAULT_MASTERY_THRESHOLD } from 'app/entities/competency.model';
import { CompetencyTaxonomy, CourseCompetencyValidators, DEFAULT_MASTERY_THRESHOLD } from 'app/entities/competency.model';
rstief marked this conversation as resolved.
Show resolved Hide resolved
import { faQuestionCircle, faTimes } from '@fortawesome/free-solid-svg-icons';
import dayjs from 'dayjs/esm';

Expand All @@ -23,12 +23,9 @@ export const titleUniqueValidator = (competencyService: CompetencyService, cours
if (initialTitle && title === initialTitle) {
return of(null);
}
return competencyService.getAllForCourse(courseId).pipe(
return competencyService.getCourseCompetencyTitles(courseId).pipe(
map((res) => {
let competencyTitles: string[] = [];
if (res.body) {
competencyTitles = res.body.map((competency) => competency.title!);
}
const competencyTitles = res.body!;
rstief marked this conversation as resolved.
Show resolved Hide resolved
if (title && competencyTitles.includes(title)) {
return {
titleUnique: { valid: false },
Expand Down Expand Up @@ -90,9 +87,8 @@ export class CompetencyFormComponent implements OnInit, OnChanges {
@Output()
onCancel: EventEmitter<any> = new EventEmitter<any>();

titleUniqueValidator = titleUniqueValidator;
protected readonly competencyTaxonomy = CompetencyTaxonomy;
protected readonly competencyValidators = CompetencyValidators;
protected readonly competencyValidators = CourseCompetencyValidators;

@Output()
formSubmitted: EventEmitter<CompetencyFormData> = new EventEmitter<CompetencyFormData>();
Expand Down Expand Up @@ -168,11 +164,7 @@ export class CompetencyFormComponent implements OnInit, OnChanges {
initialTitle = this.formData.title;
}
this.form = this.fb.nonNullable.group({
title: [
undefined as string | undefined,
[Validators.required, Validators.maxLength(255)],
[this.titleUniqueValidator(this.competencyService, this.courseId, initialTitle)],
],
title: [undefined as string | undefined, [Validators.required, Validators.maxLength(255)], [titleUniqueValidator(this.competencyService, this.courseId, initialTitle)]],
rstief marked this conversation as resolved.
Show resolved Hide resolved
description: [undefined as string | undefined, [Validators.maxLength(10000)]],
softDueDate: [undefined],
taxonomy: [undefined as CompetencyTaxonomy | undefined],
Expand Down
Loading
Loading