diff --git a/sources/packages/backend/apps/api/src/app.aest.module.ts b/sources/packages/backend/apps/api/src/app.aest.module.ts index 050c6e5a5f..b34c2630cb 100644 --- a/sources/packages/backend/apps/api/src/app.aest.module.ts +++ b/sources/packages/backend/apps/api/src/app.aest.module.ts @@ -110,6 +110,7 @@ import { DisbursementScheduleAESTController, FormSubmissionAESTController, MSFAANumberAESTController, + FormSubmissionControllerService, } from "./route-controllers"; import { AuthModule } from "./auth/auth.module"; import { @@ -248,6 +249,7 @@ import { ECertIntegrationModule } from "@sims/integrations/esdc-integration"; StudentAppealActionsProcessor, StudentAppealCreateAssessmentAction, StudentAppealUpdateModifiedIndependentAction, + FormSubmissionControllerService, // Form validators. ConfigurationContextValidator, PendingConcurrencyValidator, diff --git a/sources/packages/backend/apps/api/src/route-controllers/form-submission/form-submission.aest.controller.ts b/sources/packages/backend/apps/api/src/route-controllers/form-submission/form-submission.aest.controller.ts index 8e9fcff6f5..4ed561ebef 100644 --- a/sources/packages/backend/apps/api/src/route-controllers/form-submission/form-submission.aest.controller.ts +++ b/sources/packages/backend/apps/api/src/route-controllers/form-submission/form-submission.aest.controller.ts @@ -38,6 +38,7 @@ import { FormSubmissionItemDecisionAPIInDTO, FormSubmissionMinistryAPIOutDTO, FormSubmissionPendingSummaryAPIOutDTO, + FormSubmissionsAPIOutDTO, } from "./models/form-submission.dto"; import { getUserFullName } from "../../utilities"; import { FormSubmissionDecisionStatus } from "@sims/sims-db"; @@ -46,6 +47,7 @@ import { FormSubmissionPendingPaginationOptionsAPIInDTO, PaginatedResultsAPIOutDTO, } from "../models/pagination.dto"; +import { FormSubmissionControllerService } from "./form-submission.controller.service"; /** * Roles allowed to update the form submission item decision @@ -64,6 +66,7 @@ export class FormSubmissionAESTController extends BaseController { constructor( private readonly formSubmissionApprovalService: FormSubmissionApprovalService, private readonly formSubmissionService: FormSubmissionService, + private readonly formSubmissionControllerService: FormSubmissionControllerService, ) { super(); } @@ -95,6 +98,28 @@ export class FormSubmissionAESTController extends BaseController { }; } + /** + * Gets the list of form submissions for a student, + * including the individual form items and their details. + * @param studentId student ID to retrieve the form submission history for. + * @returns list of form submissions for a student. + */ + @Get("student/:studentId") + async getFormSubmissionHistory( + @Param("studentId", ParseIntPipe) studentId: number, + ): Promise { + // Kept the includeBasicDecisionDetails as false since the details controlled by + // the flag are not required to be returned by this endpoint. + const submissions = + await this.formSubmissionControllerService.getFormSubmissions(studentId, { + includeBasicDecisionDetails: false, + keepPendingDecisionsWhilePendingFormSubmission: false, + }); + return { + submissions, + }; + } + /** * Get the details of a form submission, including the individual form items and their details. * @param formSubmissionId ID of the form submission to retrieve the details for. @@ -109,11 +134,10 @@ export class FormSubmissionAESTController extends BaseController { @Param("formSubmissionId", ParseIntPipe) formSubmissionId: number, @Query("itemId", new ParseIntPipe({ optional: true })) itemId?: number, ): Promise { - const submission = - await this.formSubmissionApprovalService.getFormSubmissionById( - formSubmissionId, - { itemId }, - ); + const [submission] = await this.formSubmissionService.getFormSubmissions( + { formSubmissionId, itemId }, + { includeDecisionHistory: true, loadSubmittedData: true }, + ); if (!submission) { if (itemId) { throw new NotFoundException( diff --git a/sources/packages/backend/apps/api/src/route-controllers/form-submission/form-submission.controller.service.ts b/sources/packages/backend/apps/api/src/route-controllers/form-submission/form-submission.controller.service.ts index 1bcbefa6ef..cf6a06d1bb 100644 --- a/sources/packages/backend/apps/api/src/route-controllers/form-submission/form-submission.controller.service.ts +++ b/sources/packages/backend/apps/api/src/route-controllers/form-submission/form-submission.controller.service.ts @@ -1,6 +1,7 @@ import { Injectable, NotFoundException } from "@nestjs/common"; import { FormSubmissionService } from "../../services"; import { + FormSubmission, FormSubmissionDecisionStatus, FormSubmissionItem, FormSubmissionStatus, @@ -16,33 +17,83 @@ export class FormSubmissionControllerService { /** * Get the details of a form submission, including the individual form items and their details. - * @param formSubmissionId ID of the form submission to retrieve the details for. - * @param studentId ID used to validate the access to the student data. + * @param studentId ID of the student to have the data retrieved. * @param options. - * - `includeBasicDecisionDetails`: optional flag to include basic decision details, besides + * - `formSubmissionId` allow searching for a specific form submission. When provided, it will validate if the form + * submission belongs to the student and throw a not found HTTP error if it does not. + * - `locationIds` restrict forms with an application scope to the provided locations. Used for institutions to have access + * only to the form submissions related to the locations they have access to. + * - `keepPendingDecisionsWhilePendingFormSubmission`, when true, will return "Pending" as the decision status for all items + * if the form submission is still pending. This is used to avoid showing decisions that are not final yet while the form + * submission is not completed. Default to true when not provided to expose less information. + * - `includeBasicDecisionDetails` optional flag to include basic decision details, besides * the decision status. Used for institutions to have access to more details than the student - * to better support them. - * - `applicationId`: optional ID of the application, used to validate the access to the form submission - * @returns form submission details. + * to better support them. Default to false when not provided to expose less information. When keepPendingDecisionsWhilePendingFormSubmission + * is true, the decision details will not be included while the form submission is pending to avoid showing non-final decisions + * to be exposed. + * - `loadSubmittedData` includes the submitted data of each form item. + * @returns form submission details including individual form items and their details. + * @throws NotFoundException when the formSubmissionId is provided but no record is returned. */ - async getFormSubmission( - formSubmissionId: number, + async getFormSubmissions( studentId: number, options?: { + formSubmissionId?: number; + locationIds?: number[]; + keepPendingDecisionsWhilePendingFormSubmission?: boolean; includeBasicDecisionDetails?: boolean; - applicationId?: number; + loadSubmittedData?: boolean; }, - ): Promise { - const submission = await this.formSubmissionService.getFormSubmissionById( - formSubmissionId, - studentId, - { applicationId: options?.applicationId }, + ): Promise { + const submissions = await this.formSubmissionService.getFormSubmissions( + { studentId, formSubmissionId: options?.formSubmissionId }, + { + locationIds: options?.locationIds, + loadSubmittedData: options?.loadSubmittedData, + }, ); - if (!submission) { + if (options?.formSubmissionId && !submissions?.length) { throw new NotFoundException( - `Form submission with ID ${formSubmissionId} not found.`, + `Form submission with ID ${options?.formSubmissionId} not found.`, ); } + + // Set default value for the options that define how data will be returned considering the + // default behavior to expose less information and avoid showing non-final decisions. + const keepPendingDecisionsWhilePendingFormSubmission = + options?.keepPendingDecisionsWhilePendingFormSubmission ?? true; + let includeBasicDecisionDetails: boolean; + if (keepPendingDecisionsWhilePendingFormSubmission) { + includeBasicDecisionDetails = false; + } else { + includeBasicDecisionDetails = + options?.includeBasicDecisionDetails ?? false; + } + return submissions.map((submission) => + this.mapSubmissionsToAPIOutDTO( + submission, + includeBasicDecisionDetails, + keepPendingDecisionsWhilePendingFormSubmission, + ), + ); + } + + /** + * Convert a form submission record to the API output format, + * including the individual form items and their details. + * @param submission form submission record to be converted. + * @param includeBasicDecisionDetails flag to indicate if the basic decision details should be included in the response, + * besides the status that is always included. + * @param keepPendingDecisionsWhilePendingFormSubmission when true, will return "Pending" as the decision status for all items + * if the form submission is still pending. This is used to avoid showing decisions that are not final yet while the form + * submission is not completed. + * @returns form submission details including individual form items and their details in the API output format. + */ + private mapSubmissionsToAPIOutDTO( + submission: FormSubmission, + includeBasicDecisionDetails: boolean, + keepPendingDecisionsWhilePendingFormSubmission: boolean, + ): FormSubmissionAPIOutDTO { return { id: submission.id, formCategory: submission.formCategory, @@ -50,6 +101,7 @@ export class FormSubmissionControllerService { applicationId: submission.application?.id, applicationNumber: submission.application?.applicationNumber, submittedDate: submission.submittedDate, + assessedDate: submission.assessedDate, submissionItems: submission.formSubmissionItems.map((item) => ({ id: item.id, formType: item.dynamicFormConfiguration.formType, @@ -60,7 +112,8 @@ export class FormSubmissionControllerService { currentDecision: this.mapCurrentDecision( submission.submissionStatus, item, - !!options?.includeBasicDecisionDetails, + includeBasicDecisionDetails, + keepPendingDecisionsWhilePendingFormSubmission, ), })), }; @@ -80,15 +133,19 @@ export class FormSubmissionControllerService { submissionStatus: FormSubmissionStatus, submissionItem: FormSubmissionItem, includeBasicDecisionDetails: boolean, + keepPendingDecisionsWhilePendingFormSubmission: boolean, ): FormSubmissionItemDecisionAPIOutDTO { - if (submissionStatus === FormSubmissionStatus.Pending) { - // For pending submissions, the decision details should not be returned. - return { decisionStatus: FormSubmissionDecisionStatus.Pending }; - } + let decisionStatus = + keepPendingDecisionsWhilePendingFormSubmission && + submissionStatus === FormSubmissionStatus.Pending + ? FormSubmissionDecisionStatus.Pending + : submissionItem.currentDecision?.decisionStatus; + // Default to Pending if no decision exists. + decisionStatus = decisionStatus ?? FormSubmissionDecisionStatus.Pending; return { - decisionStatus: submissionItem.currentDecision.decisionStatus, + decisionStatus, decisionNoteDescription: includeBasicDecisionDetails - ? submissionItem.currentDecision.decisionNote.description + ? submissionItem.currentDecision?.decisionNote?.description : undefined, }; } diff --git a/sources/packages/backend/apps/api/src/route-controllers/form-submission/form-submission.institutions.controller.ts b/sources/packages/backend/apps/api/src/route-controllers/form-submission/form-submission.institutions.controller.ts index f7d601c768..aeb89ba603 100644 --- a/sources/packages/backend/apps/api/src/route-controllers/form-submission/form-submission.institutions.controller.ts +++ b/sources/packages/backend/apps/api/src/route-controllers/form-submission/form-submission.institutions.controller.ts @@ -1,18 +1,23 @@ import { Controller, Get, Param, ParseIntPipe } from "@nestjs/common"; -import { AuthorizedParties } from "../../auth"; +import { AuthorizedParties, IInstitutionUserToken } from "../../auth"; import { AllowAuthorizedParty, HasStudentDataAccess, IsBCPublicInstitution, + UserToken, } from "../../auth/decorators"; import { ApiNotFoundResponse, ApiTags } from "@nestjs/swagger"; import BaseController from "../BaseController"; import { ClientTypeBaseRoute } from "../../types"; import { FormSubmissionControllerService } from "./form-submission.controller.service"; -import { FormSubmissionAPIOutDTO } from "./models/form-submission.dto"; +import { + FormSubmissionAPIOutDTO, + FormSubmissionsAPIOutDTO, +} from "./models/form-submission.dto"; @AllowAuthorizedParty(AuthorizedParties.institution) @IsBCPublicInstitution() +@HasStudentDataAccess("studentId") @Controller("form-submission") @ApiTags(`${ClientTypeBaseRoute.Institution}-form-submission`) export class FormSubmissionInstitutionsController extends BaseController { @@ -22,6 +27,27 @@ export class FormSubmissionInstitutionsController extends BaseController { super(); } + /** + * Gets the list of form submissions for a student, including the individual form items and their details. + * The form submissions with application scope will be restricted to the locations the user has access. + * All form submissions without application scope can be retrieved as long as the user has access to the student data. + * @param studentId student ID to retrieve the form submission history for. + * @returns list of form submissions for a student. + */ + @Get("student/:studentId") + async getFormSubmissionHistory( + @Param("studentId", ParseIntPipe) studentId: number, + @UserToken() userToken: IInstitutionUserToken, + ): Promise { + const submissions = + await this.formSubmissionControllerService.getFormSubmissions(studentId, { + locationIds: userToken.authorizations.getLocationsIds(), + }); + return { + submissions, + }; + } + /** * Get the details of a form submission, including the individual form items and their details. * Please note currently the institution can only access form submissions related to their students @@ -34,19 +60,19 @@ export class FormSubmissionInstitutionsController extends BaseController { * @returns form submission details including individual form items and their details. */ @ApiNotFoundResponse({ description: "Form submission not found." }) - @HasStudentDataAccess("studentId", "applicationId") - @Get( - "student/:studentId/application/:applicationId/form-submission/:formSubmissionId", - ) + @Get("student/:studentId/form-submission/:formSubmissionId") async getFormSubmission( @Param("studentId", ParseIntPipe) studentId: number, - @Param("applicationId", ParseIntPipe) applicationId: number, @Param("formSubmissionId", ParseIntPipe) formSubmissionId: number, + @UserToken() userToken: IInstitutionUserToken, ): Promise { - return this.formSubmissionControllerService.getFormSubmission( - formSubmissionId, - studentId, - { includeBasicDecisionDetails: true, applicationId }, - ); + const [submission] = + await this.formSubmissionControllerService.getFormSubmissions(studentId, { + formSubmissionId, + includeBasicDecisionDetails: true, + loadSubmittedData: true, + locationIds: userToken.authorizations.getLocationsIds(), + }); + return submission; } } diff --git a/sources/packages/backend/apps/api/src/route-controllers/form-submission/form-submission.students.controller.ts b/sources/packages/backend/apps/api/src/route-controllers/form-submission/form-submission.students.controller.ts index b15272e464..12b42b6cdd 100644 --- a/sources/packages/backend/apps/api/src/route-controllers/form-submission/form-submission.students.controller.ts +++ b/sources/packages/backend/apps/api/src/route-controllers/form-submission/form-submission.students.controller.ts @@ -34,6 +34,7 @@ import { FormSubmissionAPIInDTO, FormSubmissionAPIOutDTO, FormSubmissionConfigurationsAPIOutDTO, + FormSubmissionsAPIOutDTO, FormSupplementaryDataAPIInDTO, FormSupplementaryDataAPIOutDTO, } from "./models/form-submission.dto"; @@ -100,6 +101,24 @@ export class FormSubmissionStudentsController extends BaseController { }; } + /** + * Gets the list of form submissions for the student, + * including the individual form items and their details. + * @returns list of form submissions for the student. + */ + @Get() + async getFormSubmissionHistory( + @UserToken() userToken: StudentUserToken, + ): Promise { + const submissions = + await this.formSubmissionControllerService.getFormSubmissions( + userToken.studentId, + ); + return { + submissions, + }; + } + /** * Get the details of a form submission, including the individual form items and their details. * @param formSubmissionId ID of the form submission to retrieve the details for. @@ -111,10 +130,12 @@ export class FormSubmissionStudentsController extends BaseController { @Param("formSubmissionId", ParseIntPipe) formSubmissionId: number, @UserToken() userToken: StudentUserToken, ): Promise { - return this.formSubmissionControllerService.getFormSubmission( - formSubmissionId, - userToken.studentId, - ); + const [submission] = + await this.formSubmissionControllerService.getFormSubmissions( + userToken.studentId, + { formSubmissionId, loadSubmittedData: true }, + ); + return submission; } /** diff --git a/sources/packages/backend/apps/api/src/route-controllers/form-submission/models/form-submission.dto.ts b/sources/packages/backend/apps/api/src/route-controllers/form-submission/models/form-submission.dto.ts index aff0b149c5..2a50772168 100644 --- a/sources/packages/backend/apps/api/src/route-controllers/form-submission/models/form-submission.dto.ts +++ b/sources/packages/backend/apps/api/src/route-controllers/form-submission/models/form-submission.dto.ts @@ -65,6 +65,7 @@ abstract class FormSubmissionBaseAPIOutDTO { applicationId?: number; applicationNumber?: string; submittedDate: Date; + assessedDate?: Date; } /** @@ -117,6 +118,14 @@ export class FormSubmissionAPIOutDTO extends FormSubmissionBaseAPIOutDTO { submissionItems: FormSubmissionItemAPIOutDTO[]; } +/** + * List of form submissions for a student, including the + * individual form items and their details. + */ +export class FormSubmissionsAPIOutDTO { + submissions: FormSubmissionAPIOutDTO[]; +} + /** * Individual form items that will be part of a form submission with one to many forms * for the Ministry, including the decision details. diff --git a/sources/packages/backend/apps/api/src/services/form-submission/form-submission-approval.service.ts b/sources/packages/backend/apps/api/src/services/form-submission/form-submission-approval.service.ts index d9f3a46ea0..e2911c0565 100644 --- a/sources/packages/backend/apps/api/src/services/form-submission/form-submission-approval.service.ts +++ b/sources/packages/backend/apps/api/src/services/form-submission/form-submission-approval.service.ts @@ -1,6 +1,5 @@ import { Injectable } from "@nestjs/common"; -import { InjectRepository } from "@nestjs/typeorm"; -import { DataSource, Repository } from "typeorm"; +import { DataSource } from "typeorm"; import { Role } from "../../auth"; import { User, @@ -39,75 +38,8 @@ export class FormSubmissionApprovalService { private readonly dataSource: DataSource, private readonly noteSharedService: NoteSharedService, private readonly formSubmissionActionProcessor: FormSubmissionActionProcessor, - @InjectRepository(FormSubmission) - private readonly formSubmissionRepo: Repository, ) {} - /** - * Gets a form submission by its ID. - * @param formSubmissionId The ID of the form submission to retrieve. - * @param options optional filters. - * - `itemId`: if provided, returns only the form submission item with the specified ID in the - * form submission items array. - * @returns The form submission if found, otherwise null. - */ - async getFormSubmissionById( - formSubmissionId: number, - options?: { itemId?: number }, - ): Promise { - return this.formSubmissionRepo.findOne({ - select: { - id: true, - submissionStatus: true, - submittedDate: true, - formCategory: true, - formSubmissionItems: { - id: true, - dynamicFormConfiguration: { - id: true, - formType: true, - formCategory: true, - formDefinitionName: true, - }, - currentDecision: { - id: true, - decisionStatus: true, - decisionDate: true, - decisionBy: { id: true, firstName: true, lastName: true }, - decisionNote: { id: true, description: true }, - }, - decisions: { - id: true, - decisionStatus: true, - decisionDate: true, - decisionBy: { id: true, firstName: true, lastName: true }, - decisionNote: { id: true, description: true }, - }, - submittedData: true, - updatedAt: true, - }, - }, - relations: { - formSubmissionItems: { - dynamicFormConfiguration: true, - currentDecision: { - decisionBy: true, - decisionNote: true, - }, - decisions: { - decisionBy: true, - decisionNote: true, - }, - }, - }, - where: { - id: formSubmissionId, - formSubmissionItems: { id: options?.itemId }, - }, - order: { formSubmissionItems: { id: "ASC", decisions: { id: "DESC" } } }, - }); - } - /** * Saves a decision to be associated with a form submission item, saving the decision * history and ensuring the necessary authorization and validations. diff --git a/sources/packages/backend/apps/api/src/services/form-submission/form-submission.service.ts b/sources/packages/backend/apps/api/src/services/form-submission/form-submission.service.ts index 5a0d3025f4..a75c8b4f67 100644 --- a/sources/packages/backend/apps/api/src/services/form-submission/form-submission.service.ts +++ b/sources/packages/backend/apps/api/src/services/form-submission/form-submission.service.ts @@ -1,5 +1,5 @@ import { Injectable } from "@nestjs/common"; -import { Brackets, In, Repository } from "typeorm"; +import { Brackets, In, IsNull, Repository } from "typeorm"; import { FormCategory, FormSubmission, @@ -159,26 +159,37 @@ export class FormSubmissionService { } /** - * Gets a form submission by its ID. - * @param formSubmissionId The ID of the form submission to retrieve. - * @param studentId student ID for authorization. - * @param options method options. - * - `applicationId`: optional application ID to ensure the form submission - * belongs to the application related to the institution's student. - * @returns The form submission if found, otherwise null. + * Get the details of a form submission, including the individual form items and their details. + * @param options at least one of this options should be provided.. + * - `studentId` ID of the student to have the data retrieved + * - `formSubmissionId` allow searching for a specific form submission. + * - `itemId` allow searching for a specific form submission item across all form submissions of the student, + * and return the form submission details for the form submission that contains the item. + * @param queryOptions. + * - `locationIds` restrict forms with an application scope to the provided locations. Used for institutions to have access + * only to the form submissions related to the locations they have access to. + * - `includeDecisionHistory` includes the decision history of each form item. + * - `loadSubmittedData` includes the submitted data of each form item. + * @returns form submission details including individual form items and their details. */ - async getFormSubmissionById( - formSubmissionId: number, - studentId: number, - options?: { - applicationId?: number; + async getFormSubmissions( + options: { + studentId?: number; + formSubmissionId?: number; + itemId?: number; }, - ): Promise { - return this.formSubmissionRepo.findOne({ + queryOptions?: { + locationIds?: number[]; + includeDecisionHistory?: boolean; + loadSubmittedData?: boolean; + }, + ): Promise { + return this.formSubmissionRepo.find({ select: { id: true, submissionStatus: true, submittedDate: true, + assessedDate: true, formCategory: true, application: { id: true, @@ -192,31 +203,60 @@ export class FormSubmissionService { formCategory: true, formDefinitionName: true, }, - submittedData: true, + submittedData: !!queryOptions?.loadSubmittedData, updatedAt: true, currentDecision: { id: true, decisionStatus: true, - decisionNote: { - id: true, - description: true, - }, + decisionDate: true, + decisionBy: { id: true, firstName: true, lastName: true }, + decisionNote: { id: true, description: true }, }, + decisions: queryOptions?.includeDecisionHistory + ? { + id: true, + decisionStatus: true, + decisionDate: true, + decisionBy: { id: true, firstName: true, lastName: true }, + decisionNote: { id: true, description: true }, + } + : undefined, }, }, relations: { application: true, formSubmissionItems: { dynamicFormConfiguration: true, - currentDecision: { decisionNote: true }, + currentDecision: { decisionBy: true, decisionNote: true }, + decisions: queryOptions?.includeDecisionHistory + ? { + decisionBy: true, + decisionNote: true, + } + : undefined, }, }, where: { - id: formSubmissionId, - student: { id: studentId }, - application: { id: options?.applicationId }, + id: options?.formSubmissionId, + formSubmissionItems: { + id: options?.itemId, + }, + student: { id: options?.studentId }, + application: { + location: queryOptions?.locationIds + ? [{ id: In(queryOptions.locationIds) }, { id: IsNull() }] + : undefined, + }, + }, + order: { + submittedDate: "DESC", + formSubmissionItems: { + id: "ASC", + decisions: queryOptions?.includeDecisionHistory + ? { id: "DESC" } + : undefined, + }, }, - order: { formSubmissionItems: { id: "ASC" } }, }); } } diff --git a/sources/packages/web/src/components/aest/students/FormSubmissionPendingAppealsTable.vue b/sources/packages/web/src/components/aest/students/FormSubmissionPendingAppealsTable.vue index 75860e68ea..9ab8e9025b 100644 --- a/sources/packages/web/src/components/aest/students/FormSubmissionPendingAppealsTable.vue +++ b/sources/packages/web/src/components/aest/students/FormSubmissionPendingAppealsTable.vue @@ -35,6 +35,7 @@ :items-per-page="DEFAULT_PAGE_LIMIT" :items-per-page-options="ITEMS_PER_PAGE" @update:options="pageSortEvent" + :mobile="isMobile" > @@ -76,10 +80,6 @@ export default defineComponent({ type: Number, required: true, }, - applicationId: { - type: Number, - required: true, - }, formSubmissionId: { type: Number, required: true, @@ -110,7 +110,7 @@ export default defineComponent({ const submission = (await FormSubmissionService.shared.getFormSubmission( props.formSubmissionId, - { studentId: props.studentId, applicationId: props.applicationId }, + { studentId: props.studentId }, )) as FormSubmissionAPIOutDTO; formSubmission.value = submission; diff --git a/sources/packages/web/src/views/student/form-submissions/FormSubmission.vue b/sources/packages/web/src/views/student/form-submissions/FormSubmission.vue index c22940b64c..e3207e2621 100644 --- a/sources/packages/web/src/views/student/form-submissions/FormSubmission.vue +++ b/sources/packages/web/src/views/student/form-submissions/FormSubmission.vue @@ -17,24 +17,26 @@ - - - + + + + + diff --git a/sources/packages/web/src/views/student/form-submissions/FormSubmissionView.vue b/sources/packages/web/src/views/student/form-submissions/FormSubmissionView.vue index 9df8b0c228..a57747a693 100644 --- a/sources/packages/web/src/views/student/form-submissions/FormSubmissionView.vue +++ b/sources/packages/web/src/views/student/form-submissions/FormSubmissionView.vue @@ -28,18 +28,13 @@ - - - + + + @@ -47,7 +42,6 @@