From 87c22a1a8e8c6c311ffe4cff843746abcbd35195 Mon Sep 17 00:00:00 2001 From: Andreas Ellewsen <ae@uio.no> Date: Thu, 9 Dec 2021 12:40:39 +0100 Subject: [PATCH] Make register page match sketches Page now also handles failing api requests when searching. Resolves: GREG-134 --- frontend/public/locales/en/common.json | 1 + frontend/public/locales/nb/common.json | 1 + frontend/public/locales/nn/common.json | 1 + .../src/routes/sponsor/register/frontPage.tsx | 109 +++++++++++------- 4 files changed, 73 insertions(+), 39 deletions(-) diff --git a/frontend/public/locales/en/common.json b/frontend/public/locales/en/common.json index cb7264ab..626146e4 100644 --- a/frontend/public/locales/en/common.json +++ b/frontend/public/locales/en/common.json @@ -43,6 +43,7 @@ "bodyText": "Here you can add a new role to the same guest" }, "register": { + "noResults": "No guest matching your search found.", "registerHeading": "Register new guest", "registerText": "Please search for e-mail or phone number before registering a new guest to prevent duplicates.", "registerButtonText": "Register new guest" diff --git a/frontend/public/locales/nb/common.json b/frontend/public/locales/nb/common.json index 6268284c..a21f2302 100644 --- a/frontend/public/locales/nb/common.json +++ b/frontend/public/locales/nb/common.json @@ -43,6 +43,7 @@ "bodyText": "Her kan du legge til en ny rolle på samme gjest" }, "register": { + "noResults": "Finner ingen gjestekontoer som matcher søket ditt.", "registerHeading": "Registrer ny gjest", "registerText": "Søk etter e-post eller mobilnummer før du registrerer ny gjest for å unngå dobbeltoppføringer.", "registerButtonText": "Registrer ny gjest" diff --git a/frontend/public/locales/nn/common.json b/frontend/public/locales/nn/common.json index b186583d..620b235c 100644 --- a/frontend/public/locales/nn/common.json +++ b/frontend/public/locales/nn/common.json @@ -44,6 +44,7 @@ "bodyText": "Her kan du legge til en ny rolle på samme gjest" }, "register": { + "noResults": "Finner ingen gjestekontoer som matcher søket ditt.", "registerHeading": "Registrer ny gjest", "registerText": "Søk etter e-post eller mobilnummer før du registrerer ny gjest for å unngå dobbeltoppføringer.", "registerButtonText": "Registrer ny gjest" diff --git a/frontend/src/routes/sponsor/register/frontPage.tsx b/frontend/src/routes/sponsor/register/frontPage.tsx index 3797e4d0..5ad6ac4f 100644 --- a/frontend/src/routes/sponsor/register/frontPage.tsx +++ b/frontend/src/routes/sponsor/register/frontPage.tsx @@ -6,6 +6,8 @@ import SearchIcon from '@mui/icons-material/Search' import { useTranslation } from 'react-i18next' import { debounce } from 'lodash' import React, { useState } from 'react' +import { Box, styled } from '@mui/system' +import { fetchJsonOpts } from 'utils' type Guest = { first: string @@ -14,21 +16,33 @@ type Guest = { value: string } +const StyledSpan = styled('span')({ + color: 'red', +}) + function FrontPage() { const [t] = useTranslation('common') const [guests, setGuests] = useState<Guest[]>([]) + const [searchHasInput, setSearchHasInput] = useState(false) - const getGuests = async (event: React.ChangeEvent<HTMLInputElement>) => { + const getGuests = (event: React.ChangeEvent<HTMLInputElement>) => { if (event.target.value) { - console.log('searching') - const response = await fetch( - `/api/ui/v1/person/search/${event.target.value}?format=json` - ) - const repjson = await response.json() - console.log(repjson) - if (response.ok) { - setGuests(repjson) - } + setSearchHasInput(true) + fetch(`/api/ui/v1/person/search/${event.target.value}`, fetchJsonOpts()) + .then((response) => { + if (response.ok) { + return response.json() + } + setSearchHasInput(false) + return [] + }) + .then((responseJson) => { + setGuests(responseJson) + }) + .catch(() => {}) + } else { + setSearchHasInput(false) + setGuests([]) } } return ( @@ -36,36 +50,53 @@ function FrontPage() { <SponsorGuestButtons registerNewGuestActive /> <h2>{t('register.registerHeading')}</h2> <p>{t('register.registerText')}</p> - <TextField - InputProps={{ - endAdornment: ( - <InputAdornment position="end"> - <SearchIcon /> - </InputAdornment> - ), + <Box + sx={{ + borderStyle: () => (guests.length > 0 ? 'solid' : 'none'), + borderRadius: '5px', + borderColor: 'secondary.main', + padding: '7px 12px', }} - fullWidth - placeholder="Mobile phone, e-mail" - onChange={debounce(getGuests, 600)} - /> - {guests ? ( - guests.map((guest) => { - const guestTo = `/sponsor/guest/${guest.pid}` - return ( - <MenuItem - key={`${guest.pid}-${guest.value}`} - component={Link} - to={guestTo} - > - {guest.first} {guest.last} - <br /> - {guest.value} - </MenuItem> - ) - }) - ) : ( - <></> - )} + > + <TextField + variant="standard" + error={searchHasInput && guests.length === 0} + InputProps={{ + endAdornment: ( + <InputAdornment position="end"> + <SearchIcon /> + </InputAdornment> + ), + }} + fullWidth + placeholder="Mobile phone, e-mail" + onChange={debounce(getGuests, 600)} + /> + {guests.length === 0 && searchHasInput ? ( + <StyledSpan>{t('register.noResults')}</StyledSpan> + ) : ( + guests.map((guest) => { + const guestTo = `/sponsor/guest/${guest.pid}` + return ( + <MenuItem + sx={{ + '&:hover': { + fontWeight: 'bold', + }, + }} + key={`${guest.pid}-${guest.value}`} + component={Link} + to={guestTo} + > + {guest.first} {guest.last} + <br /> + {guest.value} + </MenuItem> + ) + }) + )} + </Box> + <br /> <Button variant="contained" color="secondary" -- GitLab