From 8f2057587de589c29c9f152375370c64d5095ada Mon Sep 17 00:00:00 2001 From: Dmitry Pokidov Date: Sat, 28 Oct 2023 21:54:39 +1100 Subject: [PATCH 1/8] UI for voting --- .env.local | 12 +-- components/ActionBar/ActionBar.test.tsx | 2 +- components/Voting/landing.styled.tsx | 28 +++++ config/actions.ts | 10 +- config/conference.ts | 2 +- config/menu.ts | 8 +- pages/vote/elo.tsx | 2 + pages/vote/landing.tsx | 132 +++++++++++++++++------- 8 files changed, 143 insertions(+), 53 deletions(-) diff --git a/.env.local b/.env.local index 27d0224d..e06f1069 100644 --- a/.env.local +++ b/.env.local @@ -1,9 +1,9 @@ NEXT_PUBLIC_APPINSIGHTS_INSTRUMENTATIONKEY=2f1d6a9c-1b88-4f3d-bba1-64b11ffd2362 -NEXT_PUBLIC_GET_SUBMISSIONS_URL=https://dddperth-functions-test.azurewebsites.net/api/GetSubmissions -NEXT_PUBLIC_SUBMIT_VOTE_URL=https://dddperth-functions-test.azurewebsites.net/api/SubmitVote -NEXT_PUBLIC_GET_AGENDA_URL=https://dddperth-functions-test.azurewebsites.net/api/GetAgenda -NEXT_PUBLIC_SUBMIT_FEEDBACK_URL=https://dddperth-functions-test.azurewebsites.net/api/SubmitFeedback +NEXT_PUBLIC_GET_SUBMISSIONS_URL=http://localhost:7071/api/GetSubmissions +NEXT_PUBLIC_SUBMIT_VOTE_URL=http://localhost:7071/api/SubmitVote +NEXT_PUBLIC_GET_AGENDA_URL=http://localhost:7071/api/GetAgenda +NEXT_PUBLIC_SUBMIT_FEEDBACK_URL=http://localhost:7071/api/SubmitFeedback NEXT_PUBLIC_TESTING_MODE=false NEXT_PUBLIC_BASE_URL=https://www.dddmelbourne.com -NEXT_PUBLIC_ELO_PAIR=https://dddperth-functions-test.azurewebsites.net/api/EloVotingGetPair -NEXT_PUBLIC_ELO_VOTE=https://dddperth-functions-test.azurewebsites.net/api/EloVotingSubmitPair +NEXT_PUBLIC_ELO_PAIR=http://localhost:7071/api/EloVotingGetPair +NEXT_PUBLIC_ELO_VOTE=http://localhost:7071/api/EloVotingSubmitPair diff --git a/components/ActionBar/ActionBar.test.tsx b/components/ActionBar/ActionBar.test.tsx index 32633c92..0383c6b8 100644 --- a/components/ActionBar/ActionBar.test.tsx +++ b/components/ActionBar/ActionBar.test.tsx @@ -40,7 +40,7 @@ describe('', () => { expect(screen.getByText(/submit presentation/i)).toBeInTheDocument() }) - test('Show link when voting opens', () => { + test.skip('Show link when voting opens', () => { renderActionBar(add(conference.VotingOpenFrom, { minutes: 1 })) expect(screen.getByText(/vote for/i)).toBeInTheDocument() diff --git a/components/Voting/landing.styled.tsx b/components/Voting/landing.styled.tsx index ca66c246..574a03f6 100644 --- a/components/Voting/landing.styled.tsx +++ b/components/Voting/landing.styled.tsx @@ -2,6 +2,8 @@ import styled from '@emotion/styled' import { Button } from 'components/global/Button/Button' import { Text } from 'components/global/text' import { calcRem } from 'components/utils/styles/calcRem' +import { DialogContent } from '@reach/dialog' +import { breakpointMax } from '../utils/styles/breakpoints' export const StyledLandingContainer = styled('div')(() => ({ inlineSize: '100%', @@ -30,3 +32,29 @@ export const StyledButton = styled(Button)({ marginInlineStart: 'auto', marginInlineEnd: 'auto', }) + +export const StyledOverlayButtons = styled('div')(() => ({ + padding: calcRem(20), + '*:first-of-type': { + marginRight: calcRem(20), + }, +})) + +export const StyledForm = styled('form')(() => ({ + padding: `${calcRem(20)} 0`, + label: { + display: 'inline-block', + width: 100, + }, + input: '100%', +})) + +export const StyledFormRow = styled('div')({ + marginBottom: calcRem(30), +}) + +export const StyledDialogContent = styled(DialogContent)({ + [breakpointMax('sm')]: { + width: '100%', + }, +}) diff --git a/config/actions.ts b/config/actions.ts index 05282b15..75d8e169 100644 --- a/config/actions.ts +++ b/config/actions.ts @@ -12,11 +12,11 @@ export default function getConferenceActions(conference: Conference, dates: Date } if (dates.VotingOpen) { - actions.push({ - Category: 'voting', - Title: 'Vote for agenda', - Url: '/vote', - }) + // actions.push({ + // Category: 'voting', + // Title: 'Vote for agenda', + // Url: '/vote', + // }) } if (dates.RegistrationOpen) { diff --git a/config/conference.ts b/config/conference.ts index bb01de63..adcdd775 100644 --- a/config/conference.ts +++ b/config/conference.ts @@ -28,7 +28,7 @@ const registrationOpenWave2From = zonedTimeToUtc('2023-10-15T08:00:00', tz) const registrationOpenUntil = null const presentationSubmissionsOpenFrom = zonedTimeToUtc('2023-09-01T08:00:00', tz) const presentationSubmissionsOpenUntil = zonedTimeToUtc('2023-11-01T23:59:59', tz) -const votingOpenFrom = zonedTimeToUtc('2023-11-08T17:00:00', tz) +const votingOpenFrom = zonedTimeToUtc('2023-08-20T17:00:00', tz) const votingOpenUntil = zonedTimeToUtc('2023-11-20T23:59:59', tz) const agendaPublishedFrom = zonedTimeToUtc('2023-12-01T17:00:00', tz) const feedbackOpenFrom = toDate(date) diff --git a/config/menu.ts b/config/menu.ts index f94dda05..15227a4e 100644 --- a/config/menu.ts +++ b/config/menu.ts @@ -42,10 +42,10 @@ export default function Menu(conference: Conference, dates: Dates): { Top: MenuI } if (dates.VotingOpen) { - topMenu.push({ - href: '/vote', - name: 'Vote', - }) + // topMenu.push({ + // href: '/vote', + // name: 'Vote', + // }) } if (dates.WeekBefore) { diff --git a/pages/vote/elo.tsx b/pages/vote/elo.tsx index 22f194d9..fcedecdd 100644 --- a/pages/vote/elo.tsx +++ b/pages/vote/elo.tsx @@ -52,6 +52,8 @@ async function postPair(winningSessionId: string, losingSessionId: string, isDra LoserSessionId: losingSessionId, IsDraw: isDraw, VoterSessionId: getSessionId(), + VoterTicket: Cookies.get('vote-ticket'), + VoterLastname: Cookies.get('vote-lastname'), } try { diff --git a/pages/vote/landing.tsx b/pages/vote/landing.tsx index 1881596c..00a70f97 100644 --- a/pages/vote/landing.tsx +++ b/pages/vote/landing.tsx @@ -3,11 +3,25 @@ import { Main } from 'layouts/main' import { GetServerSideProps } from 'next' import { getCommonServerSideProps } from 'components/utils/getCommonServerSideProps' import { Text } from 'components/global/text' -import { useRouter } from 'next/router' +// import { useRouter } from 'next/router' import { PRIVACY_ACCEPTED } from '../../components/Voting/VoteConst' import Cookies from 'js-cookie' -import { StyledButton, StyledHeader, StyledIntro, StyledLandingContainer } from '../../components/Voting/landing.styled' +import { + StyledButton, + StyledDialogContent, + StyledForm, + StyledFormRow, + StyledHeader, + StyledIntro, + StyledLandingContainer, + StyledOverlayButtons, +} from '../../components/Voting/landing.styled' import { formatInTimeZone } from 'date-fns-tz' +import React, { FormEvent, Fragment } from 'react' +import { DialogOverlay } from '@reach/dialog' +import { Button } from '../../components/global/Button/Button' +import '@reach/dialog/styles.css' +import Link from 'next/link' type VoteLandingProps = { instance: string @@ -16,46 +30,92 @@ type VoteLandingProps = { const BUTTON_LABEL = 'Start Voting!' -export default function VoteLanding({ instance, votingFinished }: VoteLandingProps): JSX.Element { +// export default function VoteLanding({ instance, votingFinished }: VoteLandingProps): JSX.Element { +export default function VoteLanding({ instance }: VoteLandingProps): JSX.Element { const { conference } = useConfig() - const router = useRouter() + //const router = useRouter() - function onClickHandler() { - Cookies.set(PRIVACY_ACCEPTED, 'true', { expires: 90 }) - router.push(`/vote/voting`) + function onSubmitForm(e: FormEvent) { + e.preventDefault() + const formData = new FormData(e.target as HTMLFormElement) + + // Cookies.set(PRIVACY_ACCEPTED, 'true', { expires: 90 }); + Cookies.set('vote-ticket', formData.get('ticket'), { expires: 90 }) + Cookies.set('vote-lastname', formData.get('lastname'), { expires: 90 }) + // router.push(`/vote/voting`); } - return ( -
- - {`${instance} Conference Voting`} - Here's how voting works: - - You'll be presented with a couple of talk options. Have a read of the abstract and simply select the talk - which sounds the best to you based on your interests. If you really can't pick between the two, simply choose - "It's a draw!". - - - Once you've made your selection, two new options will appear. You can continue to vote on the options - presented for as long as you like - every vote will count towards formulating the best agenda possible for - this year. - - - Voting closes on {votingFinished}, so you have between now and then to have your say. You can leave and come - back any time until the closing day to get your votes in. - - Happy Voting! + const [showDialog, setShowDialog] = React.useState(true) + const [showBuyTicket, setShowBuyTicket] = React.useState(false) + const [showBoughtTicket, setShowBoughtTicket] = React.useState(false) + const close = () => setShowDialog(false) - - By selecting '{BUTTON_LABEL}' I have read and accepted the{' '} - DDDPerth Privacy statement. - + return ( + + + + {!showBuyTicket && !showBoughtTicket && ( + +

Have you bought your ticket to DDD Melbourne?

- - {BUTTON_LABEL} - -
-
+ + + + + + )} + {showBuyTicket && ( + + Did you know that ticket holder votes count more? You can buy your ticket{' '} + here for only {conference.TicketPrice}. + + )} + {showBoughtTicket && Wonderful! Enjoy voting! :)} + {(showBoughtTicket || showBuyTicket) && ( + + )} + + +
+ + {`${instance} Conference Voting`} + Here's how voting works: +
    +
  1. Enter your {conference.Name} ticket number and last name, then press ‘Start voting!’.
  2. +
  3. No ticket? Just press ‘Start voting!’ to begin. (Buying a ticket helps your vote count more!)
  4. +
  5. + You’ll see two talks next. Read the session information and pick your favourite of the two. If you can’t + decide, choose, “It’s a draw!”{' '} +
  6. +
  7. Once you’ve made your selection, you’ll get two new talks to pick from.
  8. +
  9. + Keep voting for as many talks as you like. You can leave and come back any time until the closing date and + your votes will be saved. +
  10. +
+ Voting closes at {formatInTimeZone(conference.VotingOpenUntil, conference.TimeZone, 'MMMM d hh:mma')} + + + + + + + + + + + {BUTTON_LABEL} + + +
+
+ ) } From 6da722d4ef3a795fa890aaf03799659e95aec1dd Mon Sep 17 00:00:00 2001 From: Dmitry Pokidov Date: Sat, 28 Oct 2023 21:56:13 +1100 Subject: [PATCH 2/8] Deploy on PR --- .../workflows/azure-static-web-apps-happy-river-0aceb3600.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/azure-static-web-apps-happy-river-0aceb3600.yml b/.github/workflows/azure-static-web-apps-happy-river-0aceb3600.yml index d48ec91c..058ae799 100644 --- a/.github/workflows/azure-static-web-apps-happy-river-0aceb3600.yml +++ b/.github/workflows/azure-static-web-apps-happy-river-0aceb3600.yml @@ -6,8 +6,6 @@ on: - main pull_request: types: [opened, synchronize, reopened, closed] - branches: - - melb-2024 jobs: build_and_deploy_job: From 89c7144c4ec53d576732fa70a96a66ffe7a6539b Mon Sep 17 00:00:00 2001 From: Dmitry Pokidov Date: Tue, 31 Oct 2023 21:18:48 +1100 Subject: [PATCH 3/8] UI fixes --- pages/vote/landing.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pages/vote/landing.tsx b/pages/vote/landing.tsx index 00a70f97..4094b211 100644 --- a/pages/vote/landing.tsx +++ b/pages/vote/landing.tsx @@ -91,7 +91,7 @@ export default function VoteLanding({ instance }: VoteLandingProps): JSX.Element
  • No ticket? Just press ‘Start voting!’ to begin. (Buying a ticket helps your vote count more!)
  • You’ll see two talks next. Read the session information and pick your favourite of the two. If you can’t - decide, choose, “It’s a draw!”{' '} + decide, choose “It’s a draw!”
  • Once you’ve made your selection, you’ll get two new talks to pick from.
  • @@ -99,7 +99,12 @@ export default function VoteLanding({ instance }: VoteLandingProps): JSX.Element your votes will be saved.
  • - Voting closes at {formatInTimeZone(conference.VotingOpenUntil, conference.TimeZone, 'MMMM d hh:mma')} +

    + + Voting closes on{' '} + {formatInTimeZone(conference.VotingOpenUntil, conference.TimeZone, "iiii, d MMMM 'at' hh:mma")} + +

    From e6f572fd783dabe30177f2f1cbd8234715e7c076 Mon Sep 17 00:00:00 2001 From: Dmitry Pokidov Date: Tue, 31 Oct 2023 22:13:26 +1100 Subject: [PATCH 4/8] Wiring server side for voting --- .env.local | 12 ++++++------ components/ActionBar/ActionBar.test.tsx | 2 +- config/actions.ts | 16 ++++++++-------- config/menu.ts | 8 ++++---- pages/vote/landing.tsx | 8 ++++---- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/.env.local b/.env.local index e06f1069..cfb8016d 100644 --- a/.env.local +++ b/.env.local @@ -1,9 +1,9 @@ NEXT_PUBLIC_APPINSIGHTS_INSTRUMENTATIONKEY=2f1d6a9c-1b88-4f3d-bba1-64b11ffd2362 -NEXT_PUBLIC_GET_SUBMISSIONS_URL=http://localhost:7071/api/GetSubmissions -NEXT_PUBLIC_SUBMIT_VOTE_URL=http://localhost:7071/api/SubmitVote -NEXT_PUBLIC_GET_AGENDA_URL=http://localhost:7071/api/GetAgenda -NEXT_PUBLIC_SUBMIT_FEEDBACK_URL=http://localhost:7071/api/SubmitFeedback +NEXT_PUBLIC_GET_SUBMISSIONS_URL=https://dddmelb-2024.azurewebsites.net/api/GetSubmissions +NEXT_PUBLIC_SUBMIT_VOTE_URL=https://dddmelb-2024.azurewebsites.net/api/SubmitVote +NEXT_PUBLIC_GET_AGENDA_URL=https://dddmelb-2024.azurewebsites.net/api/GetAgenda +NEXT_PUBLIC_SUBMIT_FEEDBACK_URL=https://dddmelb-2024.azurewebsites.net/api/SubmitFeedback NEXT_PUBLIC_TESTING_MODE=false NEXT_PUBLIC_BASE_URL=https://www.dddmelbourne.com -NEXT_PUBLIC_ELO_PAIR=http://localhost:7071/api/EloVotingGetPair -NEXT_PUBLIC_ELO_VOTE=http://localhost:7071/api/EloVotingSubmitPair +NEXT_PUBLIC_ELO_PAIR=https://dddmelb-2024.azurewebsites.net/api/EloVotingGetPair +NEXT_PUBLIC_ELO_VOTE=https://dddmelb-2024.azurewebsites.net/api/EloVotingSubmitPair diff --git a/components/ActionBar/ActionBar.test.tsx b/components/ActionBar/ActionBar.test.tsx index 0383c6b8..32633c92 100644 --- a/components/ActionBar/ActionBar.test.tsx +++ b/components/ActionBar/ActionBar.test.tsx @@ -40,7 +40,7 @@ describe('', () => { expect(screen.getByText(/submit presentation/i)).toBeInTheDocument() }) - test.skip('Show link when voting opens', () => { + test('Show link when voting opens', () => { renderActionBar(add(conference.VotingOpenFrom, { minutes: 1 })) expect(screen.getByText(/vote for/i)).toBeInTheDocument() diff --git a/config/actions.ts b/config/actions.ts index 75d8e169..f42d8539 100644 --- a/config/actions.ts +++ b/config/actions.ts @@ -11,14 +11,6 @@ export default function getConferenceActions(conference: Conference, dates: Date }) } - if (dates.VotingOpen) { - // actions.push({ - // Category: 'voting', - // Title: 'Vote for agenda', - // Url: '/vote', - // }) - } - if (dates.RegistrationOpen) { actions.push({ Category: 'tickets', @@ -27,6 +19,14 @@ export default function getConferenceActions(conference: Conference, dates: Date }) } + if (dates.VotingOpen) { + actions.push({ + Category: 'voting', + Title: 'Vote for agenda', + Url: '/vote', + }) + } + if (dates.RegistrationOpen) { actions.push({ Category: 'training', diff --git a/config/menu.ts b/config/menu.ts index 15227a4e..f94dda05 100644 --- a/config/menu.ts +++ b/config/menu.ts @@ -42,10 +42,10 @@ export default function Menu(conference: Conference, dates: Dates): { Top: MenuI } if (dates.VotingOpen) { - // topMenu.push({ - // href: '/vote', - // name: 'Vote', - // }) + topMenu.push({ + href: '/vote', + name: 'Vote', + }) } if (dates.WeekBefore) { diff --git a/pages/vote/landing.tsx b/pages/vote/landing.tsx index 4094b211..81cd999c 100644 --- a/pages/vote/landing.tsx +++ b/pages/vote/landing.tsx @@ -3,7 +3,6 @@ import { Main } from 'layouts/main' import { GetServerSideProps } from 'next' import { getCommonServerSideProps } from 'components/utils/getCommonServerSideProps' import { Text } from 'components/global/text' -// import { useRouter } from 'next/router' import { PRIVACY_ACCEPTED } from '../../components/Voting/VoteConst' import Cookies from 'js-cookie' import { @@ -22,6 +21,7 @@ import { DialogOverlay } from '@reach/dialog' import { Button } from '../../components/global/Button/Button' import '@reach/dialog/styles.css' import Link from 'next/link' +import { useRouter } from 'next/router' type VoteLandingProps = { instance: string @@ -33,16 +33,16 @@ const BUTTON_LABEL = 'Start Voting!' // export default function VoteLanding({ instance, votingFinished }: VoteLandingProps): JSX.Element { export default function VoteLanding({ instance }: VoteLandingProps): JSX.Element { const { conference } = useConfig() - //const router = useRouter() + const router = useRouter() function onSubmitForm(e: FormEvent) { e.preventDefault() const formData = new FormData(e.target as HTMLFormElement) - // Cookies.set(PRIVACY_ACCEPTED, 'true', { expires: 90 }); + Cookies.set(PRIVACY_ACCEPTED, 'true', { expires: 90 }) Cookies.set('vote-ticket', formData.get('ticket'), { expires: 90 }) Cookies.set('vote-lastname', formData.get('lastname'), { expires: 90 }) - // router.push(`/vote/voting`); + router.push(`/vote/voting`) } const [showDialog, setShowDialog] = React.useState(true) From d20f4bcec10c993684e792bf78bd1b4f3ba8149b Mon Sep 17 00:00:00 2001 From: Dmitry Pokidov Date: Thu, 2 Nov 2023 22:31:33 +1100 Subject: [PATCH 5/8] Added spinner, default expanded view on mobile, minor styling tweaks --- components/Voting/EloVote.styled.tsx | 1 + pages/vote/elo.tsx | 30 +++++++++++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/components/Voting/EloVote.styled.tsx b/components/Voting/EloVote.styled.tsx index 10895834..d96855eb 100644 --- a/components/Voting/EloVote.styled.tsx +++ b/components/Voting/EloVote.styled.tsx @@ -24,6 +24,7 @@ export const StyledEloVoteContainer = styled('div') marginInlineStart: 'auto', marginInlineEnd: 'auto', maxBlockSize: '65vh', + minHeight: '70vh', }), ({ variant }) => ({ [breakpointMax('md')]: { diff --git a/pages/vote/elo.tsx b/pages/vote/elo.tsx index fcedecdd..eb5c44e4 100644 --- a/pages/vote/elo.tsx +++ b/pages/vote/elo.tsx @@ -68,11 +68,29 @@ async function postPair(winningSessionId: string, losingSessionId: string, isDra } } -export default function Elo({ sessions, votingSessionId, userDefinedLayout = 'stacked' }: EloProps): JSX.Element { +export default function Elo({ sessions, votingSessionId, userDefinedLayout = 'expanded' }: EloProps): JSX.Element { const { conference } = useConfig() const [sessionPair, setSessionPair] = useState(sessions) const [nextPair, setNextPair] = useState(undefined) const [layoutVariant, setLayoutVariant] = useState(userDefinedLayout) + const [loading, setLoading] = useState(false) + + const spinner = + '\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' useEffect(() => { // the cookie is used for reloads, it is read in `getServerSideProps` @@ -89,8 +107,10 @@ export default function Elo({ sessions, votingSessionId, userDefinedLayout = 'st useEffect(() => { async function getPair() { + setLoading(true) const data = await fetchPair(votingSessionId) setNextPair(data) + setLoading(false) } if (typeof nextPair === 'undefined') { @@ -99,6 +119,7 @@ export default function Elo({ sessions, votingSessionId, userDefinedLayout = 'st }, [next, nextPair, votingSessionId]) async function sessionChoiceHandler(winningSession: EloSession, losingSession: EloSession, isDraw = false) { + setLoading(true) await postPair(winningSession.Id, losingSession.Id, isDraw) logEvent('voting', 'vote', { variant: layoutVariant, @@ -129,7 +150,6 @@ export default function Elo({ sessions, votingSessionId, userDefinedLayout = 'st onSessionChoice={sessionChoiceHandler} layout={layoutVariant} /> - It's a Draw! @@ -162,6 +184,7 @@ export default function Elo({ sessions, votingSessionId, userDefinedLayout = 'st window.scrollTo(0, 0) sessionChoiceHandler(sessionPair.SubmissionB, sessionPair.SubmissionA, false) }} + disabled={loading} > Option 2 @@ -175,6 +198,7 @@ export default function Elo({ sessions, votingSessionId, userDefinedLayout = 'st /> Change layout? {layoutVariant === 'stacked' ? 'Expand abstracts' : 'Stack talks'} +
    {loading && }
    ) @@ -191,7 +215,7 @@ export const getServerSideProps: GetServerSideProps = async (context) const validLayouts: LayoutVariant[] = ['expanded', 'stacked'] const userDefinedLayout: LayoutVariant = [...(validLayouts as string[])].includes(layoutCookie) ? (layoutCookie as LayoutVariant) - : 'stacked' + : 'expanded' if (!dates.VotingOpen) { return { notFound: true } From c60fba463441c37e3aa9440639b01c01dc941004 Mon Sep 17 00:00:00 2001 From: Dmitry Pokidov Date: Sun, 5 Nov 2023 23:07:55 +1100 Subject: [PATCH 6/8] Add link to tickets and note about voting --- pages/vote/elo.tsx | 4 ++++ pages/vote/landing.tsx | 5 ++++- public/static/voting/ticket-example.png | Bin 0 -> 28487 bytes 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 public/static/voting/ticket-example.png diff --git a/pages/vote/elo.tsx b/pages/vote/elo.tsx index eb5c44e4..b1350814 100644 --- a/pages/vote/elo.tsx +++ b/pages/vote/elo.tsx @@ -199,6 +199,10 @@ export default function Elo({ sessions, votingSessionId, userDefinedLayout = 'ex Change layout? {layoutVariant === 'stacked' ? 'Expand abstracts' : 'Stack talks'}
    {loading && }
    + + Keep voting for as many talks as you like. You can leave and come back any time until the closing date and + your votes will be saved. + ) diff --git a/pages/vote/landing.tsx b/pages/vote/landing.tsx index 81cd999c..5f9d968c 100644 --- a/pages/vote/landing.tsx +++ b/pages/vote/landing.tsx @@ -88,7 +88,10 @@ export default function VoteLanding({ instance }: VoteLandingProps): JSX.Element Here's how voting works:
    1. Enter your {conference.Name} ticket number and last name, then press ‘Start voting!’.
    2. -
    3. No ticket? Just press ‘Start voting!’ to begin. (Buying a ticket helps your vote count more!)
    4. +
    5. + No ticket? Just press ‘Start voting!’ to begin. (Buying a ticket helps your + vote count more!) +
    6. You’ll see two talks next. Read the session information and pick your favourite of the two. If you can’t decide, choose “It’s a draw!” diff --git a/public/static/voting/ticket-example.png b/public/static/voting/ticket-example.png new file mode 100644 index 0000000000000000000000000000000000000000..1b9d932bde58c621b311e1fbd245adff43abf32f GIT binary patch literal 28487 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 Date: Mon, 6 Nov 2023 21:21:33 +1100 Subject: [PATCH 7/8] Added one more button to buy ticket --- pages/vote/landing.tsx | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/pages/vote/landing.tsx b/pages/vote/landing.tsx index 5f9d968c..82c86b30 100644 --- a/pages/vote/landing.tsx +++ b/pages/vote/landing.tsx @@ -18,7 +18,7 @@ import { import { formatInTimeZone } from 'date-fns-tz' import React, { FormEvent, Fragment } from 'react' import { DialogOverlay } from '@reach/dialog' -import { Button } from '../../components/global/Button/Button' +import { Button, ButtonAnchor } from '../../components/global/Button/Button' import '@reach/dialog/styles.css' import Link from 'next/link' import { useRouter } from 'next/router' @@ -69,16 +69,28 @@ export default function VoteLanding({ instance }: VoteLandingProps): JSX.Element )} {showBuyTicket && ( - - Did you know that ticket holder votes count more? You can buy your ticket{' '} - here for only {conference.TicketPrice}. - + + + Did you know that ticket holder votes count more? You can buy your ticket{' '} + here for only {conference.TicketPrice}. + + + + Get Ticket + + + + )} - {showBoughtTicket && Wonderful! Enjoy voting! :)} - {(showBoughtTicket || showBuyTicket) && ( - + {showBoughtTicket && ( + + Wonderful! Enjoy voting! :) + + )} From 8d5ffd736acfa53f3c848ac8ab461ae90bfc17e7 Mon Sep 17 00:00:00 2001 From: Dmitry Pokidov Date: Mon, 6 Nov 2023 21:37:46 +1100 Subject: [PATCH 8/8] Added screenshot with ticket ID --- components/Voting/landing.styled.tsx | 1 + config/conference.ts | 2 +- pages/vote/landing.tsx | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/components/Voting/landing.styled.tsx b/components/Voting/landing.styled.tsx index 574a03f6..50400130 100644 --- a/components/Voting/landing.styled.tsx +++ b/components/Voting/landing.styled.tsx @@ -31,6 +31,7 @@ export const StyledButton = styled(Button)({ display: 'block', marginInlineStart: 'auto', marginInlineEnd: 'auto', + marginTop: calcRem(20), }) export const StyledOverlayButtons = styled('div')(() => ({ diff --git a/config/conference.ts b/config/conference.ts index adcdd775..c1c4041d 100644 --- a/config/conference.ts +++ b/config/conference.ts @@ -28,7 +28,7 @@ const registrationOpenWave2From = zonedTimeToUtc('2023-10-15T08:00:00', tz) const registrationOpenUntil = null const presentationSubmissionsOpenFrom = zonedTimeToUtc('2023-09-01T08:00:00', tz) const presentationSubmissionsOpenUntil = zonedTimeToUtc('2023-11-01T23:59:59', tz) -const votingOpenFrom = zonedTimeToUtc('2023-08-20T17:00:00', tz) +const votingOpenFrom = zonedTimeToUtc('2023-11-08T00:00:00', tz) const votingOpenUntil = zonedTimeToUtc('2023-11-20T23:59:59', tz) const agendaPublishedFrom = zonedTimeToUtc('2023-12-01T17:00:00', tz) const feedbackOpenFrom = toDate(date) diff --git a/pages/vote/landing.tsx b/pages/vote/landing.tsx index 82c86b30..23995409 100644 --- a/pages/vote/landing.tsx +++ b/pages/vote/landing.tsx @@ -129,6 +129,7 @@ export default function VoteLanding({ instance }: VoteLandingProps): JSX.Element + Ticket number example {BUTTON_LABEL}