diff --git a/src/api/dto/internship-registration.ts b/src/api/dto/internship-registration.ts index 4aedc10..b3310dc 100644 --- a/src/api/dto/internship-registration.ts +++ b/src/api/dto/internship-registration.ts @@ -82,9 +82,16 @@ export interface InternshipRegistrationDTO extends Identifiable { declaredHours: number, subjects: { subject: ProgramEntryDTO }[], submissionDate: string, + changeStateComment: string; } export interface InternshipDocument extends Identifiable { + description: null, + type: UploadType, + state: SubmissionStatus, +} + +export interface InternshipDocumentDTO extends Identifiable { description: null, type: UploadType, state: SubmissionState, @@ -94,7 +101,7 @@ const reference = (subject: Identifiable | null): Identifiable | null => subject export interface InternshipInfoDTO extends Identifiable { internshipRegistration: InternshipRegistrationDTO; - documentation: InternshipDocument[], + documentation: InternshipDocumentDTO[], student: StudentDTO, } @@ -139,3 +146,12 @@ export const internshipRegistrationDtoTransformer: OneWayTransformer = { + transform(dto: InternshipDocumentDTO, context?: unknown): InternshipDocument { + return { + ...dto, + state: submissionStateDtoTransformer.transform(dto.state), + } + } +} diff --git a/src/components/acceptance-action.tsx b/src/components/acceptance-action.tsx index b613db5..825584c 100644 --- a/src/components/acceptance-action.tsx +++ b/src/components/acceptance-action.tsx @@ -7,7 +7,7 @@ import { DialogActions, DialogContent, DialogProps, - DialogTitle, + DialogTitle, FormControl, Menu, MenuItem, TextField, @@ -17,6 +17,10 @@ import { MenuDown, StickerCheckOutline, StickerRemoveOutline } from "mdi-materia import { useTranslation } from "react-i18next"; import { useVerticalSpacing } from "@/styles"; import { createPortal } from "react-dom"; +// @ts-ignore +import { CKEditor } from '@ckeditor/ckeditor5-react'; +// @ts-ignore +import ClassicEditor from '@ckeditor/ckeditor5-build-classic'; type AcceptSubmissionDialogProps = { onAccept: (comment?: string) => void; @@ -28,11 +32,11 @@ export function AcceptSubmissionDialog({ onAccept, label, ...props }: AcceptSubm const [comment, setComment] = useState(""); const classes = useVerticalSpacing(3); - return + return { t(label + ".accept.title") } { t(label + ".accept.info") } - setComment(ev.target.value) } fullWidth label={ t("comments") } rows={3}/> + setComment(ed.getData()) }/> + + { selected.length > 0 && + + } + { + internships => } + columns={ columns } + data={ internships } + onSelectionChange={ internships => setSelected(internships) } + options={ { selection: true, pageSize: 10 } } + detailPanel={ summary => } + /> + } + + +} diff --git a/src/management/edition/manage.tsx b/src/management/edition/manage.tsx index fefbf77..218e715 100644 --- a/src/management/edition/manage.tsx +++ b/src/management/edition/manage.tsx @@ -53,7 +53,7 @@ export const EditionManagement = ({ edition }: EditionManagementProps) => { } route={ route("management:edition_internships", { edition: edition.id || "" }) }> { t("management:edition.internships.title") } - } route={ route("management:edition_report_form", { edition: edition.id || "" }) }> + } route={ route("management:edition_ipp_index", { edition: edition.id || "" }) }> { t("management:edition.ipp.title") } } route={ route("management:edition_report_form", { edition: edition.id || "" }) }> diff --git a/src/management/routing.tsx b/src/management/routing.tsx index 86e8505..ca9f9dc 100644 --- a/src/management/routing.tsx +++ b/src/management/routing.tsx @@ -10,6 +10,7 @@ import { EditionReportFields } from "@/management/edition/report/fields/list"; import { EditionSettings } from "@/management/edition/settings"; import { InternshipManagement } from "@/management/edition/internship/list"; import { InternshipDetails } from "@/management/edition/internship/details"; +import { PlanManagement } from "@/management/edition/ipp/list"; export const managementRoutes: Route[] = ([ { name: "index", path: "/", content: ManagementIndex, exact: true }, @@ -20,6 +21,7 @@ export const managementRoutes: Route[] = ([ { name: "edition_manage", path: "/editions/:edition", content: EditionManagement, tags: ["edition"], exact: true }, { name: "edition_internship", path: "/editions/:edition/internships/:internship", content: InternshipDetails, tags: ["edition"] }, { name: "edition_internships", path: "/editions/:edition/internships", content: InternshipManagement, tags: ["edition"] }, + { name: "edition_ipp_index", path: "/editions/:edition/ipp", content: PlanManagement, tags: ["edition"] }, { name: "editions", path: "/editions", content: EditionsManagement }, { name: "types", path: "/types", content: InternshipTypeManagement }, diff --git a/src/pages/internship/proposal.tsx b/src/pages/internship/proposal.tsx index a108399..43f357b 100644 --- a/src/pages/internship/proposal.tsx +++ b/src/pages/internship/proposal.tsx @@ -51,20 +51,6 @@ export const InternshipProposalFormPage = () => { export const InternshipProposalPreviewPage = () => { const { t } = useTranslation(); const proposal = useSelector(state => state.proposal.proposal && internshipSerializationTransformer.reverseTransform(state.proposal.proposal)); - - const dispatch = useDispatch(); - const history = useHistory(); - - const handleAccept = (comment?: string) => { - dispatch({ type: InternshipProposalActions.Approve, comment: comment || null }); - history.push(route("home")); - } - - const handleDiscard = (comment: string) => { - dispatch({ type: InternshipProposalActions.Decline, comment: comment }); - history.push(route("home")); - } - const classes = useVerticalSpacing(3); return @@ -80,8 +66,6 @@ export const InternshipProposalPreviewPage = () => { { proposal && } - - diff --git a/src/pages/main.tsx b/src/pages/main.tsx index fee4de1..b899967 100644 --- a/src/pages/main.tsx +++ b/src/pages/main.tsx @@ -13,7 +13,6 @@ import { PlanStep } from "@/pages/steps/plan"; import { InsuranceState } from "@/state/reducer/insurance"; import { InsuranceStep } from "@/pages/steps/insurance"; import { StudentStep } from "@/pages/steps/student"; -import { useCurrentEdition, useDeadlines } from "@/hooks"; import api from "@/api"; import { AppDispatch, InternshipPlanActions, InternshipProposalActions, useDispatch } from "@/state/actions"; import { internshipRegistrationDtoTransformer } from "@/api/dto/internship-registration"; @@ -26,6 +25,7 @@ export const updateInternshipInfo = async (dispatch: AppDispatch) => { dispatch({ type: InternshipProposalActions.Receive, state: internship.internshipRegistration.state, + comment: internship.internshipRegistration.changeStateComment, internship: internshipRegistrationDtoTransformer.transform(internship.internshipRegistration), }) diff --git a/src/pages/steps/plan.tsx b/src/pages/steps/plan.tsx index 7d4d523..6fce397 100644 --- a/src/pages/steps/plan.tsx +++ b/src/pages/steps/plan.tsx @@ -48,7 +48,6 @@ const PlanActions = () => { switch (status) { case "awaiting": return - case "accepted": return diff --git a/src/pages/steps/proposal.tsx b/src/pages/steps/proposal.tsx index 697e904..323d67b 100644 --- a/src/pages/steps/proposal.tsx +++ b/src/pages/steps/proposal.tsx @@ -60,7 +60,7 @@ export const ProposalComment = (props: HTMLProps) => { return comment ? { t('comments') } - { comment } +
: null } diff --git a/src/state/actions/proposal.ts b/src/state/actions/proposal.ts index 1520e25..8d91d57 100644 --- a/src/state/actions/proposal.ts +++ b/src/state/actions/proposal.ts @@ -27,7 +27,8 @@ export interface ReceiveProposalDeclineAction extends ReceiveSubmissionDeclineAc export interface ReceiveProposalUpdateAction extends ReceiveSubmissionUpdateAction { internship: Internship; - state: SubmissionState, + state: SubmissionState; + comment?: string; } export interface SaveProposalAction extends SaveSubmissionAction { diff --git a/src/state/reducer/proposal.ts b/src/state/reducer/proposal.ts index 6370976..2ed2ff9 100644 --- a/src/state/reducer/proposal.ts +++ b/src/state/reducer/proposal.ts @@ -58,6 +58,7 @@ const internshipProposalReducer = (state: InternshipProposalState = defaultInter ApiSubmissionState.Submitted ].includes(action.state), proposal: internshipSerializationTransformer.transform(action.internship), + comment: action.comment || "", } default: return state; diff --git a/translations/management.pl.yaml b/translations/management.pl.yaml index f026967..3d9a77c 100644 --- a/translations/management.pl.yaml +++ b/translations/management.pl.yaml @@ -24,6 +24,8 @@ internship: edition: internships: title: Zgłoszenia praktyk + ipp: + title: Indywidualne Plany Praktyk index: title: "Edycje praktyk" field: diff --git a/translations/pl.yaml b/translations/pl.yaml index d5d2c18..53edf25 100644 --- a/translations/pl.yaml +++ b/translations/pl.yaml @@ -111,6 +111,10 @@ forms: fields: key: Klucz dostępu do edycji + report: + instructions: > + Wypełnij wszystkie pola formularza w celu sfinalizowania praktyki. + student: name: imię surname: mazwisko @@ -125,6 +129,7 @@ submission: accepted: "zaakceptowano" declined: "do poprawy" draft: "wersja robocza" + empty: "brak zgłoszenia" internship: validation: @@ -218,6 +223,18 @@ steps: download: Twój indywidualny program praktyki report: header: "Raport z praktyki" + info: + draft: > + Po ukończeniu praktyki należy wypełnić z niej raport oraz przesłać ocenę praktyki przygotowaną przez Twojego zakładowego opiekuna praktyki. + awaiting: > + Twój raport musi zostać zweryfikowany i zatwierdzony. Po weryfikacji zostaniesz poinformowany o + akceptacji bądź konieczności wprowadzenia zmian. + accepted: > + Twój raport został zweryfikowany i zaakceptowany. + declined: > + Twój raport został zweryfikowany i odrzucony. Popraw zgłoszone uwagi i wyślij raport ponownie. W razie + pytań możesz również skontaktować się z pełnomocnikiem ds. praktyk Twojego kierunku. + submit: Uzupełnij raport grade: header: "Ocena z praktyki" insurance: