Skip to content
Snippets Groups Projects
Commit 309a986e authored by robban64's avatar robban64
Browse files

merge

parent edb97f85
No related branches found
No related tags found
No related merge requests found
......@@ -7,4 +7,4 @@ htmlcov
.pytest_cache
/.idea
.vs/
*/static
\ No newline at end of file
/server/app/static/
\ No newline at end of file
import React from 'react'
import React, { useEffect } from 'react'
import { BrowserRouter, Route, Switch } from 'react-router-dom'
import { getTypes } from './actions/typesAction'
import { useAppDispatch } from './hooks'
import AdminPage from './pages/admin/AdminPage'
import LoginPage from './pages/login/LoginPage'
import PresentationEditorPage from './pages/presentationEditor/PresentationEditorPage'
......@@ -11,6 +13,10 @@ import ViewSelectPage from './pages/views/ViewSelectPage'
import SecureRoute from './utils/SecureRoute'
const Main: React.FC = () => {
const dispatch = useAppDispatch()
useEffect(() => {
dispatch(getTypes())
}, [])
return (
<BrowserRouter>
<Switch>
......
import axios from 'axios'
import { Slide } from '../interfaces/Slide'
import { Slide } from '../interfaces/ApiModels'
import { AppDispatch } from './../store'
import Types from './types'
......
......@@ -32,9 +32,19 @@ export interface User extends NameID {
city_id: number
}
export interface Slide {
competition_id: number
id: number
order: number
timer: number
title: string
}
export interface Competition extends NameID {
font: string
city_id: number
year: number
background_image_id: number
}
export interface Team extends NameID {
......
import { Component } from 'react'
import { Media, QuestionAlternative, QuestionAnswer, QuestionType } from './ApiModels'
import { Component, QuestionAlternative, QuestionAnswer, QuestionType } from './ApiModels'
export interface RichCompetition {
name: string
......@@ -17,7 +16,6 @@ export interface RichSlide {
title: string
competition_id: number
components: Component[]
medias: Media[]
questions: RichQuestion[]
}
......
export interface Slide {
competition_id: number
id: number
order: number
timer: number
title: string
}
export interface Team {
id: number
name: string
}
......@@ -59,11 +59,12 @@ const AdminView: React.FC = () => {
const [openIndex, setOpenIndex] = React.useState(0)
const { path, url } = useRouteMatch()
const currentUser = useAppSelector((state) => state.user.userInfo)
const isAdmin = () => currentUser && currentUser.role.name === 'Admin'
const isAdmin = useAppSelector((state) => Boolean(state.roles.roles.find((x) => x.id === currentUser?.role_id)))
const dispatch = useAppDispatch()
const handleLogout = () => {
dispatch(logoutUser())
}
useEffect(() => {
dispatch(getCities())
dispatch(getRoles())
......@@ -83,7 +84,7 @@ const AdminView: React.FC = () => {
]
const renderItems = () => {
const menuItems = isAdmin() ? menuAdminItems : menuEditorItems
const menuItems = isAdmin ? menuAdminItems : menuEditorItems
return menuItems.map((value, index) => (
<ListItem
button
......@@ -105,7 +106,7 @@ const AdminView: React.FC = () => {
<AppBar position="fixed" className={classes.appBar}>
<Toolbar>
<Typography variant="h5" noWrap>
{isAdmin() ? menuAdminItems[openIndex].text : menuEditorItems[openIndex].text}
{isAdmin ? menuAdminItems[openIndex].text : menuEditorItems[openIndex].text}
</Typography>
</Toolbar>
</AppBar>
......
......@@ -31,7 +31,8 @@ const competitionSchema: Yup.SchemaOf<formType> = Yup.object({
const AddCompetition: React.FC = (props: any) => {
const [anchorEl, setAnchorEl] = React.useState<HTMLButtonElement | null>(null)
const cities = useAppSelector((state) => state.cities.cities)
const userCity = useAppSelector((state) => state.user.userInfo?.city)
const currentUser = useAppSelector((state) => state.user.userInfo)
const userCity = cities.find((city) => city.id === currentUser?.city_id)
const [selectedCity, setSelectedCity] = React.useState<City | undefined>(userCity)
const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
setAnchorEl(event.currentTarget)
......
......@@ -9,6 +9,7 @@ import React, { useEffect } from 'react'
import { useParams } from 'react-router-dom'
import { getCities } from '../../actions/cities'
import { getEditorCompetition } from '../../actions/editor'
import { getTypes } from '../../actions/typesAction'
import { useAppDispatch, useAppSelector } from '../../hooks'
import { Content } from '../views/styled'
import SettingsPanel from './components/SettingsPanel'
......@@ -69,6 +70,7 @@ const PresentationEditorPage: React.FC = () => {
useEffect(() => {
dispatch(getEditorCompetition(id))
dispatch(getCities())
dispatch(getTypes())
}, [])
return (
<PresentationEditorContainer>
......
import { AnyAction } from 'redux'
import Types from '../actions/types'
import { Slide, Team } from '../interfaces/ApiModels'
import { RichCompetition } from './../interfaces/ApiRichModels'
import { Slide } from './../interfaces/Slide'
import { Team } from './../interfaces/Team'
interface PresentationState {
competition: RichCompetition
......
import { AnyAction } from 'redux'
import Types from '../actions/types'
import { City, Role } from '../interfaces/ApiModels'
interface UserInfo {
name: string
email: string
role: Role
city: City
role_id: number
city_id: number
id: number
}
......
import app.database.controller as dbc
from app.apis import admin_required, item_response, list_response
from app.core.dto import MiscDTO
from app.database.models import City, ComponentType, MediaType, QuestionType, Role, ViewType
from app.database.models import (City, ComponentType, MediaType, QuestionType,
Role, ViewType)
from flask_jwt_extended import jwt_required
from flask_restx import Resource, reqparse
......@@ -22,7 +23,6 @@ name_parser.add_argument("name", type=str, required=True, location="json")
@api.route("/types")
class TypesList(Resource):
@jwt_required
def get(self):
result = {}
result["media_types"] = media_type_schema.dump(dbc.get.all(MediaType))
......
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