mirror of
https://github.com/Paris-est-Ludique/intranet.git
synced 2025-06-09 09:04:20 +02:00
add component to display user participation details
This commit is contained in:
parent
67a8e84bd5
commit
bbe4f9b1d1
@ -1,14 +1,16 @@
|
|||||||
import { FC, memo } from "react"
|
import { FC, memo } from "react"
|
||||||
import DayWishes from "./DayWishes/DayWishes"
|
import DayWishes from "./DayWishes/DayWishes"
|
||||||
import DayWishesFormModal from "./DayWishesForm/DayWishesFormModal"
|
import DayWishesFormModal from "./DayWishesForm/DayWishesFormModal"
|
||||||
import ParticipationDetailsForm from "./ParticipationDetailsForm/ParticipationDetailsForm"
|
import ParticipationDetails from "./ParticipationDetails/ParticipationDetails"
|
||||||
|
import ParticipationDetailsFormModal from "./ParticipationDetailsForm/ParticipationDetailsFormModal"
|
||||||
import withUserConnected from "../../utils/withUserConnected"
|
import withUserConnected from "../../utils/withUserConnected"
|
||||||
|
|
||||||
const Board: FC = (): JSX.Element => (
|
const Board: FC = (): JSX.Element => (
|
||||||
<div>
|
<div>
|
||||||
<DayWishes />
|
<DayWishes />
|
||||||
<DayWishesFormModal />
|
<DayWishesFormModal />
|
||||||
<ParticipationDetailsForm />
|
<ParticipationDetails />
|
||||||
|
<ParticipationDetailsFormModal />
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -0,0 +1,47 @@
|
|||||||
|
import { FC, memo, useCallback } from "react"
|
||||||
|
import get from "lodash/get"
|
||||||
|
import styles from "./styles.module.scss"
|
||||||
|
import { useUserParticipationDetails } from "../participationDetails.utils"
|
||||||
|
import { displayModal, MODAL_IDS } from "../../../store/ui"
|
||||||
|
import useAction from "../../../utils/useAction"
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
afterSubmit?: () => void | undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
const ParticipationDetailsForm: FC<Props> = (): JSX.Element | null => {
|
||||||
|
const [participationDetails] = useUserParticipationDetails()
|
||||||
|
const age = get(participationDetails, "age", "")
|
||||||
|
const tShirtSize = get(participationDetails, "teeshirtSize", "")
|
||||||
|
const food = get(participationDetails, "food", "")
|
||||||
|
const execDisplayModal = useAction(displayModal)
|
||||||
|
const onEdit = useCallback(
|
||||||
|
() => execDisplayModal(MODAL_IDS.PARTICIPATIONDETAILS),
|
||||||
|
[execDisplayModal]
|
||||||
|
)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={styles.root}>
|
||||||
|
<div className={styles.title}>Mes informations pour le festival</div>
|
||||||
|
{!tShirtSize && <div className={styles.line}>J'ai déjà 2 t-shirts.</div>}
|
||||||
|
{tShirtSize && (
|
||||||
|
<div className={styles.line}>
|
||||||
|
J'ai besoin d'un t-shirt ! (Taille <b>{tShirtSize}</b>)
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<div className={styles.line}>
|
||||||
|
Age : <b>{age} ans</b>.
|
||||||
|
</div>
|
||||||
|
<div className={styles.line}>
|
||||||
|
Préférence alimentaire : <b>{food}</b>
|
||||||
|
</div>
|
||||||
|
<div className={styles.editButton}>
|
||||||
|
<button type="button" onClick={onEdit}>
|
||||||
|
Modifier
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default memo(ParticipationDetailsForm)
|
24
src/components/VolunteerBoard/ParticipationDetails/styles.module.scss
Executable file
24
src/components/VolunteerBoard/ParticipationDetails/styles.module.scss
Executable file
@ -0,0 +1,24 @@
|
|||||||
|
@import "../../../theme/variables";
|
||||||
|
@import "../../../theme/mixins";
|
||||||
|
|
||||||
|
.root {
|
||||||
|
@include inner-content-wrapper();
|
||||||
|
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
padding-bottom: 5px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.line {
|
||||||
|
margin: 2px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editButton {
|
||||||
|
@include vertical-center();
|
||||||
|
|
||||||
|
position: absolute;
|
||||||
|
right: 20px;
|
||||||
|
}
|
@ -8,7 +8,11 @@ import {
|
|||||||
useUserParticipationDetails,
|
useUserParticipationDetails,
|
||||||
} from "../participationDetails.utils"
|
} from "../participationDetails.utils"
|
||||||
|
|
||||||
const ParticipationDetailsForm: FC = (): JSX.Element | null => {
|
type Props = {
|
||||||
|
afterSubmit?: () => void | undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
const ParticipationDetailsForm: FC<Props> = ({ afterSubmit }): JSX.Element | null => {
|
||||||
const sizeRef = useRef<HTMLSelectElement | null>(null)
|
const sizeRef = useRef<HTMLSelectElement | null>(null)
|
||||||
const dietRef = useRef<HTMLInputElement | null>(null)
|
const dietRef = useRef<HTMLInputElement | null>(null)
|
||||||
const ageRef = useRef<HTMLInputElement | null>(null)
|
const ageRef = useRef<HTMLInputElement | null>(null)
|
||||||
@ -19,9 +23,10 @@ const ParticipationDetailsForm: FC = (): JSX.Element | null => {
|
|||||||
const onSubmit = useCallback(() => {
|
const onSubmit = useCallback(() => {
|
||||||
const age = get(ageRef, "current.value", "")
|
const age = get(ageRef, "current.value", "")
|
||||||
const teeshirtSize = has2Shirts ? "" : get(sizeRef, "current.value", "")
|
const teeshirtSize = has2Shirts ? "" : get(sizeRef, "current.value", "")
|
||||||
const food = get(dietRef, "current.value", foodDefaultValue)
|
const food = get(dietRef, "current.value", "") || foodDefaultValue
|
||||||
saveParticipationDetails({ age, teeshirtSize, food })
|
saveParticipationDetails({ age, teeshirtSize, food })
|
||||||
}, [has2Shirts, saveParticipationDetails])
|
if (afterSubmit) afterSubmit()
|
||||||
|
}, [has2Shirts, saveParticipationDetails, afterSubmit])
|
||||||
|
|
||||||
const onHas2ShirtsClick = useCallback(
|
const onHas2ShirtsClick = useCallback(
|
||||||
(value) => {
|
(value) => {
|
||||||
@ -43,7 +48,7 @@ const ParticipationDetailsForm: FC = (): JSX.Element | null => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.root}>
|
<div className={styles.root}>
|
||||||
<div className={styles.title}>Informations pour le festival</div>
|
<div className={styles.title}>Mes informations pour le festival</div>
|
||||||
<div className={styles.tShirtWrapper}>
|
<div className={styles.tShirtWrapper}>
|
||||||
<div className={styles.tShirtLabel}>J'ai déjà 2 t-shirts</div>
|
<div className={styles.tShirtLabel}>J'ai déjà 2 t-shirts</div>
|
||||||
<label>
|
<label>
|
||||||
@ -99,4 +104,8 @@ const ParticipationDetailsForm: FC = (): JSX.Element | null => {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ParticipationDetailsForm.defaultProps = {
|
||||||
|
afterSubmit: undefined,
|
||||||
|
}
|
||||||
|
|
||||||
export default memo(ParticipationDetailsForm)
|
export default memo(ParticipationDetailsForm)
|
||||||
|
@ -0,0 +1,18 @@
|
|||||||
|
import { FC, memo, useCallback } from "react"
|
||||||
|
import { hideModal, MODAL_IDS } from "../../../store/ui"
|
||||||
|
import Modal from "../../Modal/Modal"
|
||||||
|
import useAction from "../../../utils/useAction"
|
||||||
|
import ParticipationDetailsForm from "./ParticipationDetailsForm"
|
||||||
|
|
||||||
|
const ParticipationDetailsFormModal: FC = (): JSX.Element => {
|
||||||
|
const execHideModal = useAction(hideModal)
|
||||||
|
const afterFormSubmit = useCallback(() => execHideModal(), [execHideModal])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal modalId={MODAL_IDS.PARTICIPATIONDETAILS}>
|
||||||
|
<ParticipationDetailsForm afterSubmit={afterFormSubmit} />
|
||||||
|
</Modal>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default memo(ParticipationDetailsFormModal)
|
@ -28,4 +28,5 @@ export const selectActiveModalId = createSelector(selectUiData, (ui) => ui.modal
|
|||||||
|
|
||||||
export const MODAL_IDS = {
|
export const MODAL_IDS = {
|
||||||
DAYWISHES: "DAYWISHES",
|
DAYWISHES: "DAYWISHES",
|
||||||
|
PARTICIPATIONDETAILS: "PARTICIPATIONDETAILS",
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
@mixin inner-content-wrapper() {
|
@mixin inner-content-wrapper() {
|
||||||
|
margin: 10px 0;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
background-color: $color-grey-lighter;
|
background-color: $color-grey-lighter;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user