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