diff --git a/backend/src/graphql-types/fulfillment-mode.ts b/backend/src/graphql-types/fulfillment-mode.ts index 8ac01e9..85b15df 100644 --- a/backend/src/graphql-types/fulfillment-mode.ts +++ b/backend/src/graphql-types/fulfillment-mode.ts @@ -15,13 +15,13 @@ export class FulfillmentModeList implements ListResponse { export class FulfillmentModeCreateInput implements Omit, 'requirements' | 'courseId'> { @field() name: string; - @field() + @field(returns => Int) threshold2: number; - @field() + @field(returns => Int) threshold3: number; - @field() + @field(returns => Int) threshold4: number; - @field() + @field(returns => Int) threshold5: number; @field(returns => ID) courseId: number; diff --git a/backend/src/graphql-types/requirement.ts b/backend/src/graphql-types/requirement.ts index 896d4c9..f2086b3 100644 --- a/backend/src/graphql-types/requirement.ts +++ b/backend/src/graphql-types/requirement.ts @@ -1,6 +1,6 @@ import { ListResponse } from './list'; import { Requirement } from '../models'; -import { field, inputType, Int, objectType } from '@loopback/graphql'; +import { field, ID, inputType, Int, objectType } from '@loopback/graphql'; import { DataObject } from '@loopback/repository'; @objectType() @@ -12,21 +12,24 @@ export class RequirementList implements ListResponse { } @inputType() -export class RequirementCreateInput implements Pick, 'name' | 'description' | 'deadline' | 'minPoints' | 'maxPoints'> { +export class RequirementCreateInput implements Pick, 'name' | 'description' | 'deadline' | 'minPoints' | 'maxPoints' | 'fulfillmentModeId'> { @field() deadline: Date; @field() name: string; @field() description: string; - @field() + @field(returns => Int) minPoints: number; - @field() + @field(returns => Int) maxPoints: number; + @field(returns => ID) + fulfillmentModeId: number; + } @inputType() export class RequirementUpdateInput extends RequirementCreateInput { - @field(returns => Int) + @field(returns => ID) id: number; } diff --git a/backend/src/models/fulfillment-mode.model.ts b/backend/src/models/fulfillment-mode.model.ts index c340509..d87bdf6 100644 --- a/backend/src/models/fulfillment-mode.model.ts +++ b/backend/src/models/fulfillment-mode.model.ts @@ -1,6 +1,6 @@ import { Entity, hasMany, model, property } from '@loopback/repository'; import { Requirement } from './requirement.model'; -import { field, ID, objectType } from '@loopback/graphql'; +import { field, ID, Int, objectType } from '@loopback/graphql'; @model() @objectType() @@ -24,28 +24,28 @@ export class FulfillmentMode extends Entity { type: 'number', required: true, }) - @field() + @field(returns => Int) threshold2: number; @property({ type: 'number', required: true, }) - @field() + @field(returns => Int) threshold3: number; @property({ type: 'number', required: true, }) - @field() + @field(returns => Int) threshold4: number; @property({ type: 'number', required: true, }) - @field() + @field(returns => Int) threshold5: number; @property({ diff --git a/frontend/src/app/shared-components/edit/edit.component.html b/frontend/src/app/shared-components/edit/edit.component.html index c98418b..c25105c 100644 --- a/frontend/src/app/shared-components/edit/edit.component.html +++ b/frontend/src/app/shared-components/edit/edit.component.html @@ -2,10 +2,20 @@
{{ field.title }} - + + + + + + + + + + + diff --git a/frontend/src/app/shared-components/edit/edit.component.ts b/frontend/src/app/shared-components/edit/edit.component.ts index 4cb33ed..524c2eb 100644 --- a/frontend/src/app/shared-components/edit/edit.component.ts +++ b/frontend/src/app/shared-components/edit/edit.component.ts @@ -15,13 +15,13 @@ export class EditComponent, UT extend implements OnInit { item?: T; - creating = false; + @Input() creating = false; isLoading = true; @Input() gql: Query; @Input() updateMutation: Mutation>; @Input() createMutation: Mutation>; - @Input() fields: { title: string, name: keyof T, readonly?: (item: T) => boolean }[]; + @Input() fields: { title: string, name: keyof T, readonly?: (item: T) => boolean, type?: string }[]; @Input() itemType: T; /** * Beküldés előtt extra adat hozzáadása @@ -42,7 +42,7 @@ export class EditComponent, UT extend const url = this.route.snapshot.url; this.item = this.customItem; this.id = this.item?.id ?? this.gql ? url[url.length - 1].path : 'new'; - if (!this.item && this.id !== 'new' && this.gql) { + if (!this.item && this.id !== 'new' && this.gql && !this.creating) { const data = (await this.gql.fetch({id: this.id}).toPromise()).data; this.key = Object.keys(data).filter(k => k !== '__typename')[0]; this.item = data[this.key]; @@ -87,8 +87,8 @@ export class EditComponent, UT extend await this.router.navigate(['..'], {relativeTo: this.route}); } - getType(itemElement: any): typeof itemElement { - return typeof itemElement; + getType(field: typeof EditComponent.prototype.fields[number] | null, value: any): typeof value | string { + return field?.type ?? typeof value; } } diff --git a/frontend/src/app/shared-components/shared-components.module.ts b/frontend/src/app/shared-components/shared-components.module.ts index e8bbde9..055796e 100644 --- a/frontend/src/app/shared-components/shared-components.module.ts +++ b/frontend/src/app/shared-components/shared-components.module.ts @@ -13,6 +13,7 @@ import { ReactiveFormsModule } from '@angular/forms'; import { MatInputModule } from '@angular/material/input'; import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatDatepickerModule } from '@angular/material/datepicker'; @NgModule({ @@ -33,7 +34,8 @@ import { MatTooltipModule } from '@angular/material/tooltip'; ReactiveFormsModule, MatInputModule, MatCheckboxModule, - MatTooltipModule + MatTooltipModule, + MatDatepickerModule ] }) export class SharedComponentsModule { diff --git a/frontend/src/app/shared-components/table/table.component.html b/frontend/src/app/shared-components/table/table.component.html index dd2b7a4..b55bf40 100644 --- a/frontend/src/app/shared-components/table/table.component.html +++ b/frontend/src/app/shared-components/table/table.component.html @@ -10,8 +10,9 @@ {{ col.title }} - + + {{ item[col.prop] | date }} {{ item[col.prop] }} diff --git a/frontend/src/app/shared-components/table/table.component.ts b/frontend/src/app/shared-components/table/table.component.ts index 3f923dd..c72bacf 100644 --- a/frontend/src/app/shared-components/table/table.component.ts +++ b/frontend/src/app/shared-components/table/table.component.ts @@ -12,7 +12,7 @@ export class TableComponent implements OnInit { @Input() showHeader = false; @Input() items: T[] = []; @Input() loading = false; - @Input() columns: { title: string, prop: string }[] = []; + @Input() columns: { title: string, prop: string, type?: string }[] = []; @Input() paginationData: PaginationData = {page: 1, limit: 10}; @Input() customActions: { icon: string, label: string, action: (model: T) => void }[] = []; @Input() allowEditing = true; @@ -30,8 +30,8 @@ export class TableComponent implements OnInit { return this.columns.map(col => col.prop).concat('actions'); } - getType(itemElement: any): typeof itemElement { - return typeof itemElement; + getType(field: typeof TableComponent.prototype.columns[number] | null, value: any): typeof value | string { + return field?.type ?? typeof value; } } diff --git a/frontend/src/app/subjects/subject-edit/courses/course-edit/course-edit.component.html b/frontend/src/app/subjects/subject-edit/courses/course-edit/course-edit.component.html index 39e35e6..8221e9b 100644 --- a/frontend/src/app/subjects/subject-edit/courses/course-edit/course-edit.component.html +++ b/frontend/src/app/subjects/subject-edit/courses/course-edit/course-edit.component.html @@ -19,13 +19,43 @@ {{ editedFulMode?.name || 'Új teljesitési mód' }} - + + +

Követelmények

+
+ + + +
+ + + {{ editedRequirement?.name || 'Új követelmény' }} + + + + + diff --git a/frontend/src/app/subjects/subject-edit/courses/course-edit/course-edit.component.ts b/frontend/src/app/subjects/subject-edit/courses/course-edit/course-edit.component.ts index e179a22..087140c 100644 --- a/frontend/src/app/subjects/subject-edit/courses/course-edit/course-edit.component.ts +++ b/frontend/src/app/subjects/subject-edit/courses/course-edit/course-edit.component.ts @@ -6,12 +6,18 @@ import { CourseGQL, CreateCourseGQL, CreateFulfillmentModeGQL, + CreateRequirementGQL, EditCourseGQL, EditFulfillmentModeGQL, + EditRequirementGQL, FulfillmentMode, FulfillmentModeGQL, FulfillmentModeListGQL, FulfillmentModeUpdateInput, + Requirement, + RequirementGQL, + RequirementListGQL, + RequirementUpdateInput, SubjectGQL } from '../../../../services/graphql'; @@ -26,12 +32,15 @@ export class CourseEditComponent implements OnInit, CustomTitleComponent { courseId: string; editedFulMode: FulfillmentMode; editingFulMode = false; + editedRequirement: Requirement; + editingRequirement = false; beforeSubmit = () => ({subjectId: +this.route.snapshot.params.subjectId}); constructor(private route: ActivatedRoute, public subjectGQL: SubjectGQL, public itemGQL: CourseGQL, public editGQL: EditCourseGQL, public createGQL: CreateCourseGQL, public modeListGQL: FulfillmentModeListGQL, public modeItemGQL: FulfillmentModeGQL, public modeEditGQL: EditFulfillmentModeGQL, - public modeCreateGQL: CreateFulfillmentModeGQL) { + public modeCreateGQL: CreateFulfillmentModeGQL, public requirementListGQL: RequirementListGQL, public requirementGQL: RequirementGQL, + public requirementEditGQL: EditRequirementGQL, public requirementCreateGQL: CreateRequirementGQL) { this.subjectId = route.snapshot.params.subjectId; this.courseId = route.snapshot.params.id; } @@ -59,7 +68,7 @@ export class CourseEditComponent implements OnInit, CustomTitleComponent { if (val < 0) { val = 0; } - ((item[prop]) as number) = val > 1 ? val as number / 100 : +val; + ((item[prop]) as number) = val > 100 ? 100 : +val; } thresh('threshold2'); @@ -73,4 +82,23 @@ export class CourseEditComponent implements OnInit, CustomTitleComponent { this.editedFulMode = null; this.editingFulMode = false; } + + async editRequirement(item: Requirement): Promise { + this.editingRequirement = true; + this.editedRequirement = item; + } + + async createRequirement(item: Requirement): Promise { + this.editingRequirement = true; + this.editedRequirement = null; + } + + beforeRequirementSubmit(item: Requirement): Partial { + return {...item, fulfillmentModeId: this.editedFulMode.id}; + } + + submitRequirement(): void { + this.editingRequirement = false; + this.editedRequirement = null; + } } diff --git a/frontend/src/app/subjects/subject-list/subject-list.component.ts b/frontend/src/app/subjects/subject-list/subject-list.component.ts index e76da1c..0c49ada 100644 --- a/frontend/src/app/subjects/subject-list/subject-list.component.ts +++ b/frontend/src/app/subjects/subject-list/subject-list.component.ts @@ -8,6 +8,7 @@ import { Subject, SubjectListGQL } from '../../services/graphql'; styleUrls: ['./subject-list.component.css'] }) export class SubjectListComponent implements OnInit { + itemType: Subject; constructor(private route: ActivatedRoute, private router: Router, public listGQL: SubjectListGQL) { }