From 1d40817dbb5641fb18c97abf7c9dab6a06d6d4c3 Mon Sep 17 00:00:00 2001 From: Emil Wahlqvist <emiwa210@student.liu.se> Date: Thu, 22 Apr 2021 08:24:18 +0000 Subject: [PATCH] Resolve "Minor editor fixes/adds" --- client/public/t8-circled.png | Bin 0 -> 43380 bytes client/src/actions/editor.ts | 7 +- client/src/interfaces/ApiModels.ts | 2 +- client/src/interfaces/ApiRichModels.ts | 2 +- .../PresentationEditorPage.tsx | 50 +++- .../components/CompetitionSettings.tsx | 85 ++++-- .../components/SlideSettings.tsx | 270 ++++++++++++++---- client/src/reducers/editorReducer.ts | 4 +- server/app/apis/slides.py | 1 - server/populate.py | 13 +- 10 files changed, 329 insertions(+), 105 deletions(-) create mode 100644 client/public/t8-circled.png diff --git a/client/public/t8-circled.png b/client/public/t8-circled.png new file mode 100644 index 0000000000000000000000000000000000000000..b9a56df2c7bde99bb37a42176bccdd2728499e83 GIT binary patch literal 43380 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 literal 0 HcmV?d00001 diff --git a/client/src/actions/editor.ts b/client/src/actions/editor.ts index ac26dbdb..903dfa7b 100644 --- a/client/src/actions/editor.ts +++ b/client/src/actions/editor.ts @@ -1,8 +1,8 @@ import axios from 'axios' -import { AppDispatch } from './../store' +import { AppDispatch, RootState } from './../store' import Types from './types' -export const getEditorCompetition = (id: string) => async (dispatch: AppDispatch) => { +export const getEditorCompetition = (id: string) => async (dispatch: AppDispatch, getState: () => RootState) => { await axios .get(`/competitions/${id}`) .then((res) => { @@ -10,6 +10,9 @@ export const getEditorCompetition = (id: string) => async (dispatch: AppDispatch type: Types.SET_EDITOR_COMPETITION, payload: res.data, }) + if (getState().editor.activeSlideId === -1 && res.data.slides[0]) { + setEditorSlideId(res.data.slides[0].id)(dispatch) + } }) .catch((err) => { console.log(err) diff --git a/client/src/interfaces/ApiModels.ts b/client/src/interfaces/ApiModels.ts index 14d7bf5b..650814f1 100644 --- a/client/src/interfaces/ApiModels.ts +++ b/client/src/interfaces/ApiModels.ts @@ -61,7 +61,7 @@ export interface Question extends NameID { export interface QuestionAlternative { id: number text: string - value: boolean + value: number question_id: number } export interface QuestionAnswer { diff --git a/client/src/interfaces/ApiRichModels.ts b/client/src/interfaces/ApiRichModels.ts index 99ee4ec2..ebc2f885 100644 --- a/client/src/interfaces/ApiRichModels.ts +++ b/client/src/interfaces/ApiRichModels.ts @@ -34,5 +34,5 @@ export interface RichQuestion { total_score: number question_type: QuestionType type_id: number - question_alternatives: QuestionAlternative[] + alternatives: QuestionAlternative[] } diff --git a/client/src/pages/presentationEditor/PresentationEditorPage.tsx b/client/src/pages/presentationEditor/PresentationEditorPage.tsx index bd854980..09ef5181 100644 --- a/client/src/pages/presentationEditor/PresentationEditorPage.tsx +++ b/client/src/pages/presentationEditor/PresentationEditorPage.tsx @@ -1,16 +1,17 @@ -import { Button, CircularProgress, Divider, Menu, MenuItem, Typography } from '@material-ui/core' +import { Button, Checkbox, CircularProgress, Divider, Menu, MenuItem, Typography } from '@material-ui/core' import AppBar from '@material-ui/core/AppBar' +import { CheckboxProps } from '@material-ui/core/Checkbox' import CssBaseline from '@material-ui/core/CssBaseline' import Drawer from '@material-ui/core/Drawer' import ListItemText from '@material-ui/core/ListItemText' -import { createStyles, makeStyles, Theme } from '@material-ui/core/styles' +import { createStyles, makeStyles, Theme, withStyles } from '@material-ui/core/styles' import AddOutlinedIcon from '@material-ui/icons/AddOutlined' import BuildOutlinedIcon from '@material-ui/icons/BuildOutlined' import CreateOutlinedIcon from '@material-ui/icons/CreateOutlined' import DnsOutlinedIcon from '@material-ui/icons/DnsOutlined' import InfoOutlinedIcon from '@material-ui/icons/InfoOutlined' import axios from 'axios' -import React, { useEffect } from 'react' +import React, { useEffect, useState } from 'react' import { Link, useParams } from 'react-router-dom' import { getCities } from '../../actions/cities' import { getEditorCompetition, setEditorSlideId } from '../../actions/editor' @@ -72,6 +73,12 @@ const useStyles = makeStyles((theme: Theme) => backgroundColor: theme.palette.background.default, padding: theme.spacing(3), }, + alignCheckboxText: { + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + paddingRight: 20, + }, }) ) @@ -86,7 +93,6 @@ const PresentationEditorPage: React.FC = () => { const activeSlideId = useAppSelector((state) => state.editor.activeSlideId) const competition = useAppSelector((state) => state.editor.competition) const competitionLoading = useAppSelector((state) => state.editor.loading) - // TODO: wait for dispatch to finish useEffect(() => { dispatch(getEditorCompetition(id)) dispatch(getCities()) @@ -134,18 +140,31 @@ const PresentationEditorPage: React.FC = () => { } const renderSlideIcon = (slide: RichSlide) => { - switch (slide.questions && slide.questions[0].type_id) { - case 0: - return <InfoOutlinedIcon></InfoOutlinedIcon> // information slide - case 1: - return <CreateOutlinedIcon></CreateOutlinedIcon> // text question - case 2: - return <BuildOutlinedIcon></BuildOutlinedIcon> // practical qustion - case 3: - return <DnsOutlinedIcon></DnsOutlinedIcon> // multiple choice question + if (slide.questions && slide.questions[0] && slide.questions[0].type_id) { + switch (slide.questions[0].type_id) { + case 1: + return <CreateOutlinedIcon /> // text question + case 2: + return <BuildOutlinedIcon /> // practical qustion + case 3: + return <DnsOutlinedIcon /> // multiple choice question + } + } else { + return <InfoOutlinedIcon /> // information slide } } + const GreenCheckbox = withStyles({ + root: { + color: '#FFFFFF', + '&$checked': { + color: '#FFFFFF', + }, + }, + checked: {}, + })((props: CheckboxProps) => <Checkbox color="default" {...props} />) + const [checkbox, setCheckbox] = useState(false) + return ( <PresentationEditorContainer> <CssBaseline /> @@ -157,7 +176,12 @@ const PresentationEditorPage: React.FC = () => { <Typography variant="h6" noWrap> {competition.name} </Typography> + <ViewButtonGroup> + <GreenCheckbox checked={checkbox} onChange={(event) => setCheckbox(event.target.checked)} /> + <Typography className={classes.alignCheckboxText} variant="button"> + Applicera ändringar på samtliga vyer + </Typography> <ViewButton variant="contained" color="secondary"> Åskådarvy </ViewButton> diff --git a/client/src/pages/presentationEditor/components/CompetitionSettings.tsx b/client/src/pages/presentationEditor/components/CompetitionSettings.tsx index b0834e35..75d41840 100644 --- a/client/src/pages/presentationEditor/components/CompetitionSettings.tsx +++ b/client/src/pages/presentationEditor/components/CompetitionSettings.tsx @@ -1,5 +1,10 @@ import { Button, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, Divider, FormControl, InputLabel, @@ -9,11 +14,12 @@ import { MenuItem, Select, TextField, + Typography, } from '@material-ui/core' import { createStyles, makeStyles, Theme } from '@material-ui/core/styles' import CloseIcon from '@material-ui/icons/Close' import axios from 'axios' -import React from 'react' +import React, { useState } from 'react' import { useParams } from 'react-router-dom' import { getEditorCompetition } from '../../../actions/editor' import { useAppDispatch, useAppSelector } from '../../../hooks' @@ -35,7 +41,6 @@ const useStyles = makeStyles((theme: Theme) => }, textCenter: { textAlign: 'center', - background: 'white', }, center: { display: 'flex', @@ -52,6 +57,12 @@ const useStyles = makeStyles((theme: Theme) => width: '87%', background: 'white', }, + addButtons: { + padding: 5, + }, + panelList: { + padding: 0, + }, }) ) @@ -73,15 +84,6 @@ const CompetitionSettings: React.FC = () => { .catch(console.log) } - const handleClick = async (tid: number) => { - await axios - .delete(`/competitions/${id}/teams/${tid}`) - .then(() => { - dispatch(getEditorCompetition(id)) - }) - .catch(console.log) - } - const cities = useAppSelector((state) => state.cities.cities) const updateCompetitionCity = async (city: City) => { await axios @@ -100,6 +102,36 @@ const CompetitionSettings: React.FC = () => { }) } + const removeTeam = async (tid: number) => { + await axios + .delete(`/competitions/${id}/teams/${tid}`) + .then(() => { + dispatch(getEditorCompetition(id)) + }) + .catch(console.log) + } + const addTeam = async () => { + setAddTeamOpen(false) + await axios + .post(`/competitions/${id}/teams`, { name: selectedTeamName }) + .then(() => { + dispatch(getEditorCompetition(id)) + }) + .catch(console.log) + } + // For "add team" dialog + const [addTeamOpen, setAddTeamOpen] = useState(false) + const openAddTeam = () => { + setAddTeamOpen(true) + } + const closeAddTeam = () => { + setAddTeamOpen(false) + } + let selectedTeamName = '' + const updateSelectedTeamName = (event: React.ChangeEvent<{ value: string }>) => { + selectedTeamName = event.target.value + } + return ( <div className={classes.textInputContainer}> <form noValidate autoComplete="off"> @@ -113,8 +145,7 @@ const CompetitionSettings: React.FC = () => { /> <Divider /> <FormControl variant="outlined" className={classes.dropDown}> - <InputLabel id="region-selection-label">Region</InputLabel> - {/*TODO: fixa så cities laddar in i statet likt i CompetitionManager*/} + <InputLabel>Region</InputLabel> <Select value={cities.find((city) => city.id === competition.city_id)?.name || ''} label="Region" @@ -129,7 +160,7 @@ const CompetitionSettings: React.FC = () => { </FormControl> </form> - <List> + <List className={classes.panelList}> <ListItem> <ListItemText className={classes.textCenter} primary="Lag" /> </ListItem> @@ -138,13 +169,31 @@ const CompetitionSettings: React.FC = () => { <div key={team.id}> <ListItem divider button> <ListItemText primary={team.name} /> - <CloseIcon onClick={() => handleClick(team.id)} /> + <CloseIcon onClick={() => removeTeam(team.id)} /> </ListItem> </div> ))} - <ListItem className={classes.center} button> - <Button>Lägg till lag</Button> + + <ListItem className={classes.center} button onClick={openAddTeam}> + <Typography className={classes.addButtons} variant="button"> + Lägg till lag + </Typography> </ListItem> + <Dialog open={addTeamOpen} onClose={closeAddTeam}> + <DialogTitle className={classes.center}>Lägg till lag</DialogTitle> + <DialogContent> + <DialogContentText>Skriv namnet på laget och klicka sedan på bekräfta.</DialogContentText> + <TextField autoFocus margin="dense" label="Lagnamn" fullWidth onChange={updateSelectedTeamName} /> + </DialogContent> + <DialogActions> + <Button onClick={closeAddTeam} color="secondary"> + Avbryt + </Button> + <Button onClick={addTeam} color="primary"> + Bekräfta + </Button> + </DialogActions> + </Dialog> </List> <ListItem button> @@ -153,7 +202,7 @@ const CompetitionSettings: React.FC = () => { src="https://i1.wp.com/stickoutmedia.se/wp-content/uploads/2021/01/placeholder-3.png?ssl=1" className={classes.importedImage} /> - <ListItemText className={classes.textCenter} primary="Välj bakgrundsbild ..." /> + <ListItemText className={classes.textCenter}>Välj bakgrundsbild ...</ListItemText> </ListItem> </div> ) diff --git a/client/src/pages/presentationEditor/components/SlideSettings.tsx b/client/src/pages/presentationEditor/components/SlideSettings.tsx index c61d478e..e59586bb 100644 --- a/client/src/pages/presentationEditor/components/SlideSettings.tsx +++ b/client/src/pages/presentationEditor/components/SlideSettings.tsx @@ -1,6 +1,11 @@ import { Button, Checkbox, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, FormControl, InputLabel, List, @@ -9,18 +14,18 @@ import { MenuItem, Select, TextField, + Typography, } from '@material-ui/core' import { CheckboxProps } from '@material-ui/core/Checkbox' import { green, grey } from '@material-ui/core/colors' import { createStyles, makeStyles, Theme, withStyles } from '@material-ui/core/styles' import CloseIcon from '@material-ui/icons/Close' -import MoreHorizOutlinedIcon from '@material-ui/icons/MoreHorizOutlined' import axios from 'axios' -import React, { useState } from 'react' +import React, { useEffect, useState } from 'react' import { useParams } from 'react-router-dom' import { getEditorCompetition } from '../../../actions/editor' import { useAppDispatch, useAppSelector } from '../../../hooks' -import { TextComponent } from '../../../interfaces/ApiModels' +import { QuestionAlternative, TextComponent } from '../../../interfaces/ApiModels' import { HiddenInput } from './styled' const useStyles = makeStyles((theme: Theme) => @@ -39,7 +44,6 @@ const useStyles = makeStyles((theme: Theme) => }, textCenter: { textAlign: 'center', - background: 'white', }, center: { display: 'flex', @@ -50,6 +54,7 @@ const useStyles = makeStyles((theme: Theme) => margin: theme.spacing(2), width: '87%', background: 'white', + padding: 0, }, clickableIcon: { cursor: 'pointer', @@ -63,6 +68,16 @@ const useStyles = makeStyles((theme: Theme) => whiteBackground: { background: 'white', }, + addButtons: { + padding: 5, + }, + panelList: { + padding: 0, + }, + addImageButton: { + padding: 5, + cursor: 'pointer', + }, }) ) @@ -75,23 +90,22 @@ const SlideSettings: React.FC = () => { const { id }: CompetitionParams = useParams() const dispatch = useAppDispatch() const competition = useAppSelector((state) => state.editor.competition) - let currentSlide = competition.slides[0] - // Init currentSlide if slides are not in order - for (const slide of competition.slides) { - if (slide.order === 1) { - currentSlide = slide - break - } - } + const activeSlideId = useAppSelector((state) => state.editor.activeSlideId) + const activeSlide = useAppSelector((state) => + state.editor.competition.slides.find((slide) => slide && slide.id === state.editor.activeSlideId) + ) - const handleCloseAnswerClick = async (alternative: number) => { - await axios - // TODO: implementera API för att kunnata bort svarsalternativ - .delete(`/competitions/${id}/slide/question/alternative/${alternative}`) - .then(() => { - dispatch(getEditorCompetition(id)) - }) - .catch(console.log) + const handleCloseAnswerClick = async (alternative_id: number) => { + if (activeSlide && activeSlide.questions[0]) { + await axios + .delete( + `/competitions/${id}/slides/${activeSlideId}/questions/${activeSlide?.questions[0].id}/alternatives/${alternative_id}` + ) + .then(() => { + dispatch(getEditorCompetition(id)) + }) + .catch(console.log) + } } const texts = useAppSelector( @@ -110,25 +124,97 @@ const SlideSettings: React.FC = () => { } const [pictures, setPictures] = useState(pictureList) - const updateSlideType = async (event: React.ChangeEvent<{ value: unknown }>) => { - await axios - // TODO: implementera API för att kunna ändra i questions->type_id - .put(`/competitions/${id}/slides/${currentSlide?.id}`, { type_id: event.target.value }) - .then(() => { - dispatch(getEditorCompetition(id)) - }) - .catch(console.log) + const updateSlideType = async () => { + closeSlideTypeDialog() + if (activeSlide) { + if (activeSlide.questions[0] && activeSlide.questions[0].type_id !== selectedSlideType) { + if (selectedSlideType === 0) { + // Change slide type from a question type to information + await axios + .delete(`/competitions/${id}/slides/${activeSlide.order}/questions/${activeSlide.questions[0].id}`) + .then(() => { + dispatch(getEditorCompetition(id)) + }) + .catch(console.log) + } else { + // Change slide type from question type to another question type + await axios + .delete(`/competitions/${id}/slides/${activeSlide.order}/questions/${activeSlide.questions[0].id}`) + .catch(console.log) + await axios + .post(`/competitions/${id}/slides/${activeSlide.order}/questions`, { + name: 'Ny fråga', + total_score: 0, + type_id: selectedSlideType, + slide_id: activeSlide.id, + }) + .then(() => { + dispatch(getEditorCompetition(id)) + }) + .catch(console.log) + } + } else if (selectedSlideType !== 0) { + // Change slide type from information to a question type + await axios + .post(`/competitions/${id}/slides/${activeSlide.order}/questions`, { + name: 'Ny fråga', + total_score: 0, + type_id: selectedSlideType, + slide_id: activeSlide.id, + }) + .then(() => { + dispatch(getEditorCompetition(id)) + }) + .catch(console.log) + } + } } - const updateAlternativeValue = async (event: React.ChangeEvent<HTMLInputElement>) => { - // Wheter the alternative is true or false - await axios - // TODO: implementera API för att kunna ändra i alternatives->value - .put(`/competitions/${id}/slides/${currentSlide?.id}`, { value: event.target.value }) - .then(() => { - dispatch(getEditorCompetition(id)) - }) - .catch(console.log) + const updateAlternativeValue = async (alternative: QuestionAlternative) => { + if (activeSlide && activeSlide.questions[0]) { + let newValue: number + if (alternative.value === 0) { + newValue = 1 + } else newValue = 0 + console.log('newValue: ' + newValue) + await axios + .put( + `/competitions/${id}/slides/${activeSlide?.id}/questions/${activeSlide?.questions[0].id}/alternatives/${alternative.id}`, + { value: newValue } + ) + .then(() => { + dispatch(getEditorCompetition(id)) + }) + .catch(console.log) + } + } + + const updateAlternativeText = async (alternative_id: number, newText: string) => { + if (activeSlide && activeSlide.questions[0]) { + await axios + .put( + `/competitions/${id}/slides/${activeSlide?.id}/questions/${activeSlide?.questions[0].id}/alternatives/${alternative_id}`, + { text: newText } + ) + .then(() => { + dispatch(getEditorCompetition(id)) + }) + .catch(console.log) + } + } + + const addAlternative = async () => { + if (activeSlide && activeSlide.questions[0]) { + await axios + .post( + `/competitions/${id}/slides/${activeSlide?.order}/questions/${activeSlide?.questions[0].id}/alternatives`, + { text: '', value: 0 } + ) + .then(() => { + dispatch(getEditorCompetition(id)) + }) + .catch(console.log) + } } const handleFileSelected = (e: React.ChangeEvent<HTMLInputElement>): void => { @@ -163,27 +249,86 @@ const SlideSettings: React.FC = () => { checked: {}, })((props: CheckboxProps) => <Checkbox color="default" {...props} />) + const updateTimer = async (event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>) => { + setTimer(+event.target.value) + if (activeSlide) { + await axios + .put(`/competitions/${id}/slides/${activeSlide.order}`, { timer: event.target.value }) + .then(() => { + dispatch(getEditorCompetition(id)) + }) + .catch(console.log) + } + } + const [timer, setTimer] = useState<number | undefined>(0) + useEffect(() => { + setTimer(activeSlide?.timer) + }, [activeSlide]) + + // For "slide type" dialog + const [selectedSlideType, setSelectedSlideType] = useState(0) + const [slideTypeDialog, setSlideTypeDialog] = useState(false) + const openSlideTypeDialog = (type_id: number) => { + setSelectedSlideType(type_id) + setSlideTypeDialog(true) + } + const closeSlideTypeDialog = () => { + setSlideTypeDialog(false) + } + + const numberToBool = (num: number) => { + if (num === 0) return false + else return true + } + return ( <div className={classes.textInputContainer}> <div className={classes.whiteBackground}> <FormControl variant="outlined" className={classes.dropDown}> - <InputLabel id="slide-type-selection-label">Sidtyp</InputLabel> - <Select value={currentSlide?.questions[0].type_id || 0} label="Sidtyp" onChange={updateSlideType}> + <InputLabel>Sidtyp</InputLabel> + <Select value={activeSlide?.questions[0]?.type_id || 0} label="Sidtyp" className={classes.panelList}> <MenuItem value={0}> - <Button>Informationssida</Button> + <Typography variant="button" onClick={() => openSlideTypeDialog(0)}> + Informationssida + </Typography> </MenuItem> <MenuItem value={1}> - <Button>Skriftlig fråga</Button> + <Typography variant="button" onClick={() => openSlideTypeDialog(1)}> + Skriftlig fråga + </Typography> </MenuItem> <MenuItem value={2}> - <Button>Praktisk fråga</Button> + <Typography variant="button" onClick={() => openSlideTypeDialog(2)}> + Praktisk fråga + </Typography> </MenuItem> <MenuItem value={3}> - <Button>Flervalsfråga</Button> + <Typography variant="button" onClick={() => openSlideTypeDialog(3)}> + Flervalsfråga + </Typography> </MenuItem> </Select> </FormControl> </div> + <Dialog open={slideTypeDialog} onClose={closeSlideTypeDialog}> + <DialogTitle className={classes.center} color="secondary"> + Varning! + </DialogTitle> + <DialogContent> + <DialogContentText> + Om du ändrar sidtypen kommer eventuella frågeinställningar gå förlorade. Det inkluderar: frågans namn, poäng + och svarsalternativ.{' '} + </DialogContentText> + </DialogContent> + <DialogActions> + <Button onClick={closeSlideTypeDialog} color="secondary"> + Avbryt + </Button> + <Button onClick={updateSlideType} color="primary"> + Bekräfta + </Button> + </DialogActions> + </Dialog> <ListItem> <TextField @@ -193,11 +338,13 @@ const SlideSettings: React.FC = () => { helperText="Lämna blank för att inte använda timerfunktionen" label="Timer" type="number" - value={currentSlide?.timer} + defaultValue={activeSlide?.timer || 0} + onChange={updateTimer} + value={timer} /> </ListItem> - <List> + <List className={classes.panelList}> <ListItem divider> <ListItemText className={classes.textCenter} @@ -205,30 +352,32 @@ const SlideSettings: React.FC = () => { secondary="(Fyll i rutan höger om textfältet för att markera korrekt svar)" /> </ListItem> - {currentSlide && - currentSlide.questions[0] && - currentSlide.questions[0].question_alternatives && - currentSlide.questions[0].question_alternatives.map((alt) => ( + {activeSlide && + activeSlide.questions[0] && + activeSlide.questions[0].alternatives && + activeSlide.questions[0].alternatives.map((alt) => ( <div key={alt.id}> <ListItem divider> <TextField className={classes.textInput} id="outlined-basic" - label={`Svar ${alt.id}`} - value={alt.text} + defaultValue={alt.text} + onChange={(event) => updateAlternativeText(alt.id, event.target.value)} variant="outlined" /> - <GreenCheckbox checked={alt.value} onChange={updateAlternativeValue} /> + <GreenCheckbox checked={numberToBool(alt.value)} onChange={() => updateAlternativeValue(alt)} /> <CloseIcon className={classes.clickableIcon} onClick={() => handleCloseAnswerClick(alt.id)} /> </ListItem> </div> ))} - <ListItem className={classes.center} button> - <Button>Lägg till svarsalternativ</Button> + <ListItem className={classes.center} button onClick={addAlternative}> + <Typography className={classes.addButtons} variant="button"> + Lägg till svarsalternativ + </Typography> </ListItem> </List> - <List> + <List className={classes.panelList}> <ListItem divider> <ListItemText className={classes.textCenter} primary="Text" /> </ListItem> @@ -237,17 +386,18 @@ const SlideSettings: React.FC = () => { <div key={text.id}> <ListItem divider> <TextField className={classes.textInput} label={text.data.text} variant="outlined" /> - <MoreHorizOutlinedIcon className={classes.clickableIcon} /> <CloseIcon className={classes.clickableIcon} /> </ListItem> </div> ))} <ListItem className={classes.center} button onClick={handleAddText}> - <Button>Lägg till text</Button> + <Typography className={classes.addButtons} variant="button"> + Lägg till text + </Typography> </ListItem> </List> - <List> + <List className={classes.panelList}> <ListItem divider> <ListItemText className={classes.textCenter} primary="Bilder" /> </ListItem> @@ -267,8 +417,8 @@ const SlideSettings: React.FC = () => { <ListItem className={classes.center} button> <HiddenInput accept="image/*" id="contained-button-file" multiple type="file" onChange={handleFileSelected} /> - <label htmlFor="contained-button-file"> - <Button component="span">Lägg till bild</Button> + <label className={classes.addImageButton} htmlFor="contained-button-file"> + <Typography variant="button">Lägg till bild</Typography> </label> </ListItem> </List> diff --git a/client/src/reducers/editorReducer.ts b/client/src/reducers/editorReducer.ts index 81b10c32..20d0b428 100644 --- a/client/src/reducers/editorReducer.ts +++ b/client/src/reducers/editorReducer.ts @@ -17,7 +17,7 @@ const initialState: EditorState = { slides: [], teams: [], }, - activeSlideId: 0, + activeSlideId: -1, loading: true, } @@ -25,8 +25,8 @@ export default function (state = initialState, action: AnyAction) { switch (action.type) { case Types.SET_EDITOR_COMPETITION: return { + ...state, competition: action.payload as RichCompetition, - activeSlideId: action.payload.slides[0].id as number, loading: false, } case Types.SET_EDITOR_SLIDE_ID: diff --git a/server/app/apis/slides.py b/server/app/apis/slides.py index 4720fd44..93250b3a 100644 --- a/server/app/apis/slides.py +++ b/server/app/apis/slides.py @@ -24,7 +24,6 @@ class SlidesList(Resource): def post(self, CID): item_comp = dbc.get.one(Competition, CID) item_slide = dbc.add.slide(item_comp) - dbc.add.question(f"Fråga {item_slide.order + 1}", 10, 0, item_slide) dbc.utils.refresh(item_comp) return list_response(list_schema.dump(item_comp.slides)) diff --git a/server/populate.py b/server/populate.py index 609193ba..f3710184 100644 --- a/server/populate.py +++ b/server/populate.py @@ -82,13 +82,12 @@ def _add_items(): h = random.randrange(150, 400) dbc.add.component(1, item_slide, {"text": f"hej{k}"}, x, y, w, h) - # TODO: Remove comments when slide without questions is fixed - # item_slide = dbc.add.slide(item_comp) - # item_slide.title = f"Slide {len(item_comp.slides)}" - # item_slide.body = f"Body {len(item_comp.slides)}" - # item_slide.timer = 100 + j - # # item_slide.settings = "{}" - # dbc.utils.commit_and_refresh(item_slide) + item_slide = dbc.add.slide(item_comp) + item_slide.title = f"Slide {len(item_comp.slides)}" + item_slide.body = f"Body {len(item_comp.slides)}" + item_slide.timer = 100 + j + # item_slide.settings = "{}" + dbc.utils.commit_and_refresh(item_slide) # Add teams for name in teams: -- GitLab