Add accept and discard actions for proposal

This commit is contained in:
Kacper Donat 2020-08-11 21:02:06 +02:00
parent 2897d4bd04
commit ee070bc62c
5 changed files with 49 additions and 18 deletions

View File

@ -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 }/>
} }

View File

@ -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>
} }

View File

@ -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;

View File

@ -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>
} }

View File

@ -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: