Skip to content
Snippets Groups Projects
Commit bce6c6c6 authored by Albin Henriksson's avatar Albin Henriksson
Browse files

Resolve "Add slide button"

parent bd276e1d
No related branches found
No related tags found
1 merge request!76Resolve "Add slide button"
Pipeline #41473 passed with warnings
import { Button, CircularProgress, Divider, Typography } from '@material-ui/core' import { Button, CircularProgress, Divider, Menu, MenuItem, Typography } from '@material-ui/core'
import AppBar from '@material-ui/core/AppBar' import AppBar from '@material-ui/core/AppBar'
import CssBaseline from '@material-ui/core/CssBaseline' import CssBaseline from '@material-ui/core/CssBaseline'
import Drawer from '@material-ui/core/Drawer' import Drawer from '@material-ui/core/Drawer'
import List from '@material-ui/core/List'
import ListItemText from '@material-ui/core/ListItemText' import ListItemText from '@material-ui/core/ListItemText'
import { createStyles, makeStyles, Theme } from '@material-ui/core/styles' import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'
import AddOutlinedIcon from '@material-ui/icons/AddOutlined'
import BuildOutlinedIcon from '@material-ui/icons/BuildOutlined' import BuildOutlinedIcon from '@material-ui/icons/BuildOutlined'
import CreateOutlinedIcon from '@material-ui/icons/CreateOutlined' import CreateOutlinedIcon from '@material-ui/icons/CreateOutlined'
import DnsOutlinedIcon from '@material-ui/icons/DnsOutlined' import DnsOutlinedIcon from '@material-ui/icons/DnsOutlined'
import InfoOutlinedIcon from '@material-ui/icons/InfoOutlined' import InfoOutlinedIcon from '@material-ui/icons/InfoOutlined'
import axios from 'axios'
import React, { useEffect } from 'react' import React, { useEffect } from 'react'
import { Link, useParams } from 'react-router-dom' import { Link, useParams } from 'react-router-dom'
import { getCities } from '../../actions/cities' import { getCities } from '../../actions/cities'
...@@ -16,6 +17,7 @@ import { getEditorCompetition, setEditorSlideId } from '../../actions/editor' ...@@ -16,6 +17,7 @@ import { getEditorCompetition, setEditorSlideId } from '../../actions/editor'
import { getTypes } from '../../actions/typesAction' import { getTypes } from '../../actions/typesAction'
import { useAppDispatch, useAppSelector } from '../../hooks' import { useAppDispatch, useAppSelector } from '../../hooks'
import { RichSlide } from '../../interfaces/ApiRichModels' import { RichSlide } from '../../interfaces/ApiRichModels'
import { RemoveMenuItem } from '../admin/styledComp'
import { Content } from '../views/styled' import { Content } from '../views/styled'
import SettingsPanel from './components/SettingsPanel' import SettingsPanel from './components/SettingsPanel'
import SlideEditor from './components/SlideEditor' import SlideEditor from './components/SlideEditor'
...@@ -23,14 +25,17 @@ import { ...@@ -23,14 +25,17 @@ import {
CenteredSpinnerContainer, CenteredSpinnerContainer,
HomeIcon, HomeIcon,
PresentationEditorContainer, PresentationEditorContainer,
SlideList,
SlideListItem, SlideListItem,
ToolBarContainer, ToolBarContainer,
ViewButton, ViewButton,
ViewButtonGroup, ViewButtonGroup,
} from './styled' } from './styled'
function createSlide(name: string) { const initialState = {
return { name } mouseX: null,
mouseY: null,
slideOrder: null,
} }
const leftDrawerWidth = 150 const leftDrawerWidth = 150
...@@ -92,6 +97,45 @@ const PresentationEditorPage: React.FC = () => { ...@@ -92,6 +97,45 @@ const PresentationEditorPage: React.FC = () => {
dispatch(setEditorSlideId(id)) dispatch(setEditorSlideId(id))
} }
const createNewSlide = async () => {
await axios.post(`/competitions/${id}/slides`, { title: 'new slide' })
dispatch(getEditorCompetition(id))
}
const [contextState, setContextState] = React.useState<{
mouseX: null | number
mouseY: null | number
slideOrder: null | number
}>(initialState)
const handleRightClick = (event: React.MouseEvent<HTMLDivElement>, slideOrder: number) => {
event.preventDefault()
setContextState({
mouseX: event.clientX - 2,
mouseY: event.clientY - 4,
slideOrder: slideOrder,
})
}
const handleClose = () => {
setContextState(initialState)
}
const handleRemoveSlide = async () => {
await axios.delete(`/competitions/${id}/slides/${contextState.slideOrder}`)
dispatch(getEditorCompetition(id))
setContextState(initialState)
}
const handleDuplicateSlide = async () => {
const response = await axios.post(`/competitions/${id}/slides`)
const newOrder = response.data.items[response.data.total_count - 1].order
const oldSlide = competition.slides.find((slide) => slide.order === contextState.slideOrder)
await axios.put(`/competitions/${id}/slides/${newOrder}`, { timer: oldSlide?.timer, title: oldSlide?.title })
dispatch(getEditorCompetition(id))
setContextState(initialState)
}
const renderSlideIcon = (slide: RichSlide) => { const renderSlideIcon = (slide: RichSlide) => {
switch (slide.questions[0].type_id) { switch (slide.questions[0].type_id) {
case 0: case 0:
...@@ -139,21 +183,31 @@ const PresentationEditorPage: React.FC = () => { ...@@ -139,21 +183,31 @@ const PresentationEditorPage: React.FC = () => {
> >
<div className={classes.toolbar} /> <div className={classes.toolbar} />
<Divider /> <Divider />
<List> <SlideList>
{competition.slides && <div>
competition.slides.map((slide) => ( {competition.slides &&
<SlideListItem competition.slides.map((slide) => (
divider <SlideListItem
button divider
key={slide.id} button
selected={slide.id === activeSlideId} key={slide.id}
onClick={() => setActiveSlideId(slide.id)} selected={slide.id === activeSlideId}
> onClick={() => setActiveSlideId(slide.id)}
{renderSlideIcon(slide)} onContextMenu={(event) => handleRightClick(event, slide.order)}
<ListItemText primary={slide.title} /> >
</SlideListItem> {renderSlideIcon(slide)}
))} <ListItemText primary={`Sida ${slide.order + 1}`} />
</List> </SlideListItem>
))}
</div>
<div>
<Divider />
<SlideListItem divider button onClick={() => createNewSlide()}>
<ListItemText primary="Ny sida" />
<AddOutlinedIcon />
</SlideListItem>
</div>
</SlideList>
</Drawer> </Drawer>
<div className={classes.toolbar} /> <div className={classes.toolbar} />
<Drawer <Drawer
...@@ -176,6 +230,20 @@ const PresentationEditorPage: React.FC = () => { ...@@ -176,6 +230,20 @@ const PresentationEditorPage: React.FC = () => {
<Content leftDrawerWidth={leftDrawerWidth} rightDrawerWidth={rightDrawerWidth}> <Content leftDrawerWidth={leftDrawerWidth} rightDrawerWidth={rightDrawerWidth}>
<SlideEditor /> <SlideEditor />
</Content> </Content>
<Menu
keepMounted
open={contextState.mouseY !== null}
onClose={handleClose}
anchorReference="anchorPosition"
anchorPosition={
contextState.mouseY !== null && contextState.mouseX !== null
? { top: contextState.mouseY, left: contextState.mouseX }
: undefined
}
>
<MenuItem onClick={handleDuplicateSlide}>Duplicera</MenuItem>
<RemoveMenuItem onClick={handleRemoveSlide}>Ta bort</RemoveMenuItem>
</Menu>
</PresentationEditorContainer> </PresentationEditorContainer>
) )
} }
......
...@@ -117,7 +117,7 @@ const CompetitionSettings: React.FC = () => { ...@@ -117,7 +117,7 @@ const CompetitionSettings: React.FC = () => {
{/*TODO: fixa så cities laddar in i statet likt i CompetitionManager*/} {/*TODO: fixa så cities laddar in i statet likt i CompetitionManager*/}
<Select <Select
value={cities.find((city) => city.id === competition.city_id)?.name || ''} value={cities.find((city) => city.id === competition.city_id)?.name || ''}
label="RegionSelect" label="Region"
onChange={handleChange} onChange={handleChange}
> >
{cities.map((city) => ( {cities.map((city) => (
......
import { Button, ListItem, Toolbar } from '@material-ui/core' import { Button, List, ListItem, Toolbar } from '@material-ui/core'
import styled from 'styled-components' import styled from 'styled-components'
export const ToolBarContainer = styled(Toolbar)` export const ToolBarContainer = styled(Toolbar)`
...@@ -16,6 +16,14 @@ export const ViewButtonGroup = styled.div` ...@@ -16,6 +16,14 @@ export const ViewButtonGroup = styled.div`
flex-direction: row; flex-direction: row;
` `
export const SlideList = styled(List)`
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
padding: 0px;
`
export const SlideListItem = styled(ListItem)` export const SlideListItem = styled(ListItem)`
text-align: center; text-align: center;
height: 60px; height: 60px;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment