Add accept and discard actions for proposal
This commit is contained in:
parent
2897d4bd04
commit
ee070bc62c
@ -2,7 +2,7 @@ import React, { HTMLProps } from "react";
|
|||||||
import { useHorizontalSpacing } from "@/styles";
|
import { useHorizontalSpacing } from "@/styles";
|
||||||
|
|
||||||
export const Actions = (props: HTMLProps<HTMLDivElement>) => {
|
export const Actions = (props: HTMLProps<HTMLDivElement>) => {
|
||||||
const classes = useHorizontalSpacing(1);
|
const classes = useHorizontalSpacing(2);
|
||||||
|
|
||||||
return <div className={ classes.root } { ...props }/>
|
return <div className={ classes.root } { ...props }/>
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,9 @@
|
|||||||
import { Internship, internshipTypeLabels } from "@/data";
|
import { Internship, internshipTypeLabels } from "@/data";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { Button, Paper, PaperProps, Typography, TypographyProps } from "@material-ui/core";
|
import { Paper, PaperProps, Typography, TypographyProps } from "@material-ui/core";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { createStyles, makeStyles } from "@material-ui/core/styles";
|
import { createStyles, makeStyles } from "@material-ui/core/styles";
|
||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
import { Link as RouterLink } from "react-router-dom";
|
|
||||||
import { route } from "@/routing";
|
|
||||||
import { Actions } from "@/components/actions";
|
|
||||||
import { useVerticalSpacing } from "@/styles";
|
import { useVerticalSpacing } from "@/styles";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
|
|
||||||
@ -74,7 +71,7 @@ export const ProposalPreview = ({ proposal }: ProposalPreviewProps) => {
|
|||||||
{ t('internship.date-range', { start: proposal.startDate, end: proposal.endDate }) }
|
{ t('internship.date-range', { start: proposal.startDate, end: proposal.endDate }) }
|
||||||
</Typography>
|
</Typography>
|
||||||
<Typography className="proposal__secondary">
|
<Typography className="proposal__secondary">
|
||||||
{ t('internship.duration', { duration }) }
|
{ t('internship.duration', { duration, count: Math.floor(duration.asWeeks()) }) }
|
||||||
{ ", " }
|
{ ", " }
|
||||||
{ t('internship.hours', { hours: proposal.hours }) }
|
{ t('internship.hours', { hours: proposal.hours }) }
|
||||||
</Typography>
|
</Typography>
|
||||||
@ -85,11 +82,5 @@ export const ProposalPreview = ({ proposal }: ProposalPreviewProps) => {
|
|||||||
<Typography className="proposal__primary">{ proposal.mentor.name } { proposal.mentor.surname }</Typography>
|
<Typography className="proposal__primary">{ proposal.mentor.name } { proposal.mentor.surname }</Typography>
|
||||||
<Typography className="proposal__secondary">{ proposal.mentor.email }, { proposal.mentor.phone }</Typography>
|
<Typography className="proposal__secondary">{ proposal.mentor.email }, { proposal.mentor.phone }</Typography>
|
||||||
</Section>
|
</Section>
|
||||||
|
|
||||||
<Actions>
|
|
||||||
<Button component={ RouterLink } to={ route("home") } variant="contained" color="primary">
|
|
||||||
{ t('go-back') }
|
|
||||||
</Button>
|
|
||||||
</Actions>
|
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ import I18nextBrowserLanguageDetector from "i18next-browser-languagedetector";
|
|||||||
|
|
||||||
import "moment/locale/pl"
|
import "moment/locale/pl"
|
||||||
import "moment/locale/en-gb"
|
import "moment/locale/en-gb"
|
||||||
import moment, { isDuration, isMoment } from "moment";
|
import moment, { isDuration, isMoment, unitOfTime } from "moment";
|
||||||
import { convertToRoman } from "@/utils/numbers";
|
import { convertToRoman } from "@/utils/numbers";
|
||||||
|
|
||||||
const resources = {
|
const resources = {
|
||||||
@ -22,6 +22,7 @@ i18n
|
|||||||
.init({
|
.init({
|
||||||
resources,
|
resources,
|
||||||
fallbackLng: "pl",
|
fallbackLng: "pl",
|
||||||
|
compatibilityJSON: "v3",
|
||||||
interpolation: {
|
interpolation: {
|
||||||
escapeValue: false,
|
escapeValue: false,
|
||||||
format: (value, format, lng) => {
|
format: (value, format, lng) => {
|
||||||
@ -34,7 +35,11 @@ i18n
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isDuration(value)) {
|
if (isDuration(value)) {
|
||||||
|
if (format === "humanize") {
|
||||||
return value.locale(lng || "pl").humanize();
|
return value.locale(lng || "pl").humanize();
|
||||||
|
} else {
|
||||||
|
return Math.floor(value.locale(lng || "pl").as(format as unitOfTime.Base));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { Page } from "@/pages/base";
|
import { Page } from "@/pages/base";
|
||||||
import { Container, Link, Typography } from "@material-ui/core";
|
import { Button, Container, Link, Typography } from "@material-ui/core";
|
||||||
import { Link as RouterLink } from "react-router-dom";
|
import { Link as RouterLink, useHistory } from "react-router-dom";
|
||||||
import { route } from "@/routing";
|
import { route } from "@/routing";
|
||||||
import { InternshipForm } from "@/forms/internship";
|
import { InternshipForm } from "@/forms/internship";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
@ -11,6 +11,10 @@ import { useSelector } from "react-redux";
|
|||||||
import { Internship } from "@/data";
|
import { Internship } from "@/data";
|
||||||
import { AppState } from "@/state/reducer";
|
import { AppState } from "@/state/reducer";
|
||||||
import { internshipSerializationTransformer } from "@/serialization";
|
import { internshipSerializationTransformer } from "@/serialization";
|
||||||
|
import { Actions } from "@/components";
|
||||||
|
import { InternshipProposalActions, useDispatch } from "@/state/actions";
|
||||||
|
import { StickerCheckOutline, StickerRemoveOutline } from "mdi-material-ui/index";
|
||||||
|
import { useVerticalSpacing } from "@/styles";
|
||||||
|
|
||||||
export const InternshipProposalFormPage = () => {
|
export const InternshipProposalFormPage = () => {
|
||||||
return <Page title="Zgłoszenie praktyki">
|
return <Page title="Zgłoszenie praktyki">
|
||||||
@ -32,6 +36,21 @@ export const InternshipProposalPreviewPage = () => {
|
|||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const proposal = useSelector<AppState, Internship | null>(state => state.proposal.proposal && internshipSerializationTransformer.reverseTransform(state.proposal.proposal));
|
const proposal = useSelector<AppState, Internship | null>(state => state.proposal.proposal && internshipSerializationTransformer.reverseTransform(state.proposal.proposal));
|
||||||
|
|
||||||
|
const dispatch = useDispatch();
|
||||||
|
const history = useHistory();
|
||||||
|
|
||||||
|
const handleAccept = () => {
|
||||||
|
dispatch({ type: InternshipProposalActions.Approve, comment: null });
|
||||||
|
history.push(route("home"));
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleDiscard = () => {
|
||||||
|
dispatch({ type: InternshipProposalActions.Decline, comment: "Well..." });
|
||||||
|
history.push(route("home"));
|
||||||
|
}
|
||||||
|
|
||||||
|
const classes = useVerticalSpacing(3);
|
||||||
|
|
||||||
return <Page title={ t("") }>
|
return <Page title={ t("") }>
|
||||||
<Page.Header maxWidth="md">
|
<Page.Header maxWidth="md">
|
||||||
<Page.Breadcrumbs>
|
<Page.Breadcrumbs>
|
||||||
@ -40,9 +59,23 @@ export const InternshipProposalPreviewPage = () => {
|
|||||||
</Page.Breadcrumbs>
|
</Page.Breadcrumbs>
|
||||||
<Page.Title>Moje zgłoszenie</Page.Title>
|
<Page.Title>Moje zgłoszenie</Page.Title>
|
||||||
</Page.Header>
|
</Page.Header>
|
||||||
<Container maxWidth={ "md" }>
|
<Container maxWidth={ "md" } className={ classes.root }>
|
||||||
<ProposalComment />
|
<ProposalComment />
|
||||||
{ proposal && <ProposalPreview proposal={ proposal } /> }
|
{ proposal && <ProposalPreview proposal={ proposal } /> }
|
||||||
|
|
||||||
|
<Actions>
|
||||||
|
<Button component={ RouterLink } to={ route("home") } variant="contained" color="primary">
|
||||||
|
{ t('go-back') }
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<Button onClick={ handleAccept } color="primary" startIcon={ <StickerCheckOutline /> }>
|
||||||
|
{ t('accept') }
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<Button onClick={ handleDiscard } color="secondary" startIcon={ <StickerRemoveOutline /> }>
|
||||||
|
{ t('discard') }
|
||||||
|
</Button>
|
||||||
|
</Actions>
|
||||||
</Container>
|
</Container>
|
||||||
</Page>
|
</Page>
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,9 @@ internship:
|
|||||||
semester: semestr {{ semester, roman }}
|
semester: semestr {{ semester, roman }}
|
||||||
album: "numer albumu {{ album }}"
|
album: "numer albumu {{ album }}"
|
||||||
date-range: "{{ start, DD MMMM YYYY }} - {{ end, DD MMMM YYYY }}"
|
date-range: "{{ start, DD MMMM YYYY }} - {{ end, DD MMMM YYYY }}"
|
||||||
duration: "{{ duration, humanize }}"
|
duration_2: "{{ duration, weeks }} tygodni"
|
||||||
|
duration_0: "{{ duration, weeks }} tydzień"
|
||||||
|
duration_1: "{{ count }} tygodnie"
|
||||||
hours: "{{ hours }} godzin"
|
hours: "{{ hours }} godzin"
|
||||||
office: "Oddział / adres"
|
office: "Oddział / adres"
|
||||||
address:
|
address:
|
||||||
|
Loading…
Reference in New Issue
Block a user