photo gallery init
This commit is contained in:
parent
082cef2d06
commit
826f34d798
@ -16,10 +16,11 @@ Including another URLconf
|
|||||||
"""
|
"""
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
from alkatorapi.views import register, results
|
from alkatorapi.views import register, results, photos
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
path('api/register', register),
|
path('api/register', register),
|
||||||
path('api/results', results),
|
path('api/results', results),
|
||||||
|
path('api/photos', photos),
|
||||||
]
|
]
|
||||||
|
8
alkator_table.py
Normal file
8
alkator_table.py
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
from alkatorapi.models import ALKATOR_CHOICES, User
|
||||||
|
n = 1
|
||||||
|
for user in User.objects.order_by('duration'):
|
||||||
|
if user.alkator_category == 1:
|
||||||
|
print(f'{n}. {user.duration} {ALKATOR_CHOICES[user.alkator_category-1][1]} {user.starting_number:02}')
|
||||||
|
n += 1
|
||||||
|
else:
|
||||||
|
print(f'x. {user.duration} {ALKATOR_CHOICES[user.alkator_category-1][1]} {user.starting_number:02}')
|
@ -3,6 +3,8 @@ from django.http import HttpResponse
|
|||||||
from django.views.decorators.csrf import csrf_exempt
|
from django.views.decorators.csrf import csrf_exempt
|
||||||
from datetime import date, datetime
|
from datetime import date, datetime
|
||||||
import json
|
import json
|
||||||
|
import glob
|
||||||
|
import PIL.Image
|
||||||
|
|
||||||
from .models import User, ALKATOR_CHOICES_DICT
|
from .models import User, ALKATOR_CHOICES_DICT
|
||||||
|
|
||||||
@ -58,4 +60,17 @@ def results(request):
|
|||||||
'alkator_category': ALKATOR_CHOICES_DICT[user.alkator_category],
|
'alkator_category': ALKATOR_CHOICES_DICT[user.alkator_category],
|
||||||
'starting_number': user.starting_number,
|
'starting_number': user.starting_number,
|
||||||
})
|
})
|
||||||
return HttpResponse(json.dumps(results), content_type='application/json')
|
return HttpResponse(json.dumps(results), content_type='application/json')
|
||||||
|
|
||||||
|
|
||||||
|
def photos(request):
|
||||||
|
files = glob.glob("photos/*.jpg")
|
||||||
|
rtn = []
|
||||||
|
for file in files:
|
||||||
|
img = PIL.Image.open(file)
|
||||||
|
rtn.append({
|
||||||
|
'original': '/' + file,
|
||||||
|
'original_width': img.width,
|
||||||
|
'original_height': img.height,
|
||||||
|
})
|
||||||
|
return HttpResponse(json.dumps(rtn), content_type='application/json')
|
@ -62,7 +62,11 @@
|
|||||||
"@babel/preset-react": "^7.23.3",
|
"@babel/preset-react": "^7.23.3",
|
||||||
"bootstrap": "^5.3.2",
|
"bootstrap": "^5.3.2",
|
||||||
"core-js": "^3.35.1",
|
"core-js": "^3.35.1",
|
||||||
|
"react": "^18.3.1",
|
||||||
"react-data-table-component": "^7.6.2",
|
"react-data-table-component": "^7.6.2",
|
||||||
"sass": "^1.70.0"
|
"react-dom": "^18.3.1",
|
||||||
|
"react-photo-gallery": "^8.0.0",
|
||||||
|
"sass": "^1.70.0",
|
||||||
|
"styled-components": "^6.1.9"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,8 +4,10 @@ import DataTable from "react-data-table-component";
|
|||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import { createRoot } from 'react-dom/client';
|
import { createRoot } from 'react-dom/client';
|
||||||
|
|
||||||
|
import Gallery from "react-photo-gallery";
|
||||||
|
|
||||||
const addr_prefix = "" //"http://localhost:8000"
|
|
||||||
|
const addr_prefix = "http://localhost:8000"
|
||||||
|
|
||||||
|
|
||||||
class Main extends Component {
|
class Main extends Component {
|
||||||
@ -16,10 +18,19 @@ class Main extends Component {
|
|||||||
status: "",
|
status: "",
|
||||||
faq: false,
|
faq: false,
|
||||||
results: [],
|
results: [],
|
||||||
|
page: window.location.hash,
|
||||||
|
photos: [],
|
||||||
};
|
};
|
||||||
fetch(addr_prefix + "/api/results").then(resp => resp.json()).then(json => {
|
fetch(addr_prefix + "/api/results").then(resp => resp.json()).then(json => {
|
||||||
this.setState({results: json})
|
this.setState({results: json})
|
||||||
})
|
})
|
||||||
|
fetch(addr_prefix + "/api/photos").then(resp => resp.json()).then(json => {
|
||||||
|
this.setState({photos: json})
|
||||||
|
})
|
||||||
|
window.addEventListener("hashchange", (e) => {this.onHashChange(e)})
|
||||||
|
}
|
||||||
|
onHashChange(event){
|
||||||
|
this.setState({page: window.location.hash})
|
||||||
}
|
}
|
||||||
onSubmit(event){
|
onSubmit(event){
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
@ -46,191 +57,220 @@ class Main extends Component {
|
|||||||
this.setState({faq: !this.state.faq});
|
this.setState({faq: !this.state.faq});
|
||||||
}
|
}
|
||||||
render(){
|
render(){
|
||||||
|
let photos = []
|
||||||
|
for (let photo in this.state.photos){
|
||||||
|
photos.push({
|
||||||
|
src: photo.original,
|
||||||
|
width: photo.original_width,
|
||||||
|
height: photo.original_height,
|
||||||
|
})
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{this.state.status == "success" &&
|
<nav class="navbar navbar-expand-lg bg-body-tertiary">
|
||||||
<div class="absolute container-fluid alert alert-success">
|
<div class="container">
|
||||||
{this.state.text}
|
<ul class="navbar-nav mb-0">
|
||||||
</div>}
|
<li class="nav-item">
|
||||||
{this.state.status == "failed" &&
|
<a class="nav-link" aria-current="page" href="#">Domů</a>
|
||||||
<div class="absolute container-fluid alert alert-danger">
|
</li>
|
||||||
{this.state.text}
|
<li class="nav-item">
|
||||||
</div>}
|
<a class="nav-link" href="#gallery">Galerie</a>
|
||||||
{this.state.faq &&
|
</li>
|
||||||
<div class="shadow"></div>}
|
</ul>
|
||||||
{this.state.faq &&
|
|
||||||
<div class="faq" onClick={(e) => this.togglefaq()}>
|
|
||||||
<div class="container" onClick={(e) => e.stopPropagation()}>
|
|
||||||
<button type="button" class="btn-close" aria-label="Close" onClick={(e) => this.togglefaq()}></button>
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-body">
|
|
||||||
<h5 class="card-title">Proč je cena startovného taková, jaká je?</h5>
|
|
||||||
<p class="card-text">Vetšinu ceny dělá alkohol a nápoje, které se během závodu konzumují. Dostanete přívěšek s panákem, který Vám zůstává a pokud závod doběhnete, dostanete památeční medaili. Zbytek startovného tvoří výherní ceny, dále náklady spojené s organizací závodu. Výroba překážek, časovačů na čekárnách, náramky pro závodníký, tisk plakátů a jejich propagace, atd. Cenu jsme se snažili nastavit co nejnižší, zároveň takovou, abychom byli schopní Alkátor Race uskutečnit.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-body">
|
|
||||||
<h5 class="card-title">K čemu slouží Tokken?</h5>
|
|
||||||
<p class="card-text">V kontextu Alkátor Race by se to dalo spíše nazvat kontrolním bodem. Závodník doběhne na určité místo, kde tokken sebere a následně ho zanese na další stanoviště, kde ho předáte kontrolorovi. Tím dáte najevo, že jste běžel trasu správě. Je to pojistka, aby jsi byl podctivý Alkátor a nešvindloval!</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-body">
|
|
||||||
<h5 class="card-title">Jak funguje Quíz?</h5>
|
|
||||||
<p class="card-text">Jedná se o překážku, kde na daném místě vylosujete otázku a běžíte k dalšímu stanovišti ke kontrolorovi. Mezi tím si můžete promyslet jednu z ze tří odpovědí (formát A,B,C). Špatná odpopvěď znamená panáčka. Navíc to má obdobnou funkci, jako Tokken.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-body">
|
|
||||||
<h5 class="card-title">Jak funguje Ruleta?</h5>
|
|
||||||
<p class="card-text">Na stanovišti na Vás budou čekat panáčky. Obsah může být cokoliv alkoholického i nealkoholického, od dobrot po blééé. Nejlepší na tom je, že podle čichu a barvy nemáte šanci poznat, o co se jedná. Jelikož panáčky jsou uzavřené a dobarvené potravinářským barvivem.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-body">
|
|
||||||
<h5 class="card-title">Musím v Alkátor race utíkat nebo se jinak fyzicky namáhat?</h5>
|
|
||||||
<p class="card-text">Strategii závodu si určím sám s pomocí mého osobního trenéra. Tudíž se zaměřím hlavně na alkohol a abych dorazil do cíle jako hrdina a ostřílený alko-veterán.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-body">
|
|
||||||
<h5 class="card-title">Kolik spoluúčastníků mám očekávat?</h5>
|
|
||||||
<p class="card-text">Zatím je kapacita závodu 50 účastníků.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-body">
|
|
||||||
<h5 class="card-title">Co když jsem zde svůj dotaz nenašel?</h5>
|
|
||||||
<p class="card-text">Tak neváhej a kontaktuj nás na sociálních sítích nebo emailu, rádi pomůžeme.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
</nav>
|
||||||
|
{this.state.page == "#gallery" &&
|
||||||
|
<div class="container">
|
||||||
|
<Gallery photos={photos} />
|
||||||
|
</div>
|
||||||
}
|
}
|
||||||
<div class="container">
|
{this.state.page == "" &&
|
||||||
<img class="logo" src="/public/logo.svg"></img>
|
<div>
|
||||||
</div>
|
{this.state.status == "success" &&
|
||||||
<div class="container text text-center"><h1>Další ročník bude teprve oznámen!</h1></div>
|
<div class="absolute container-fluid alert alert-success">
|
||||||
{/*
|
{this.state.text}
|
||||||
<div class="container info text-center">
|
</div>}
|
||||||
<div class="row">
|
{this.state.status == "failed" &&
|
||||||
<h1 class="col val">
|
<div class="absolute container-fluid alert alert-danger">
|
||||||
<b>KDY?</b>
|
{this.state.text}
|
||||||
<br />
|
</div>}
|
||||||
4.5.2024
|
{this.state.faq &&
|
||||||
</h1>
|
<div class="shadow"></div>}
|
||||||
<h1 class="col val">
|
{this.state.faq &&
|
||||||
<b>V KOLIK?</b>
|
<div class="faq" onClick={(e) => this.togglefaq()}>
|
||||||
<br />
|
<div class="container" onClick={(e) => e.stopPropagation()}>
|
||||||
10:00
|
<button type="button" class="btn-close" aria-label="Close" onClick={(e) => this.togglefaq()}></button>
|
||||||
</h1>
|
<div class="card">
|
||||||
<h1 class="col val">
|
<div class="card-body">
|
||||||
<b>KDE?</b>
|
<h5 class="card-title">Proč je cena startovného taková, jaká je?</h5>
|
||||||
<br />
|
<p class="card-text">Vetšinu ceny dělá alkohol a nápoje, které se během závodu konzumují. Dostanete přívěšek s panákem, který Vám zůstává a pokud závod doběhnete, dostanete památeční medaili. Zbytek startovného tvoří výherní ceny, dále náklady spojené s organizací závodu. Výroba překážek, časovačů na čekárnách, náramky pro závodníký, tisk plakátů a jejich propagace, atd. Cenu jsme se snažili nastavit co nejnižší, zároveň takovou, abychom byli schopní Alkátor Race uskutečnit.</p>
|
||||||
Sobkovice
|
</div>
|
||||||
</h1>
|
</div>
|
||||||
<h1 class="col val">
|
<div class="card">
|
||||||
<b>CENA</b>
|
<div class="card-body">
|
||||||
<br />
|
<h5 class="card-title">K čemu slouží Tokken?</h5>
|
||||||
690 kč
|
<p class="card-text">V kontextu Alkátor Race by se to dalo spíše nazvat kontrolním bodem. Závodník doběhne na určité místo, kde tokken sebere a následně ho zanese na další stanoviště, kde ho předáte kontrolorovi. Tím dáte najevo, že jste běžel trasu správě. Je to pojistka, aby jsi byl podctivý Alkátor a nešvindloval!</p>
|
||||||
</h1>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="card">
|
||||||
*/}
|
<div class="card-body">
|
||||||
<div class="container">
|
<h5 class="card-title">Jak funguje Quíz?</h5>
|
||||||
<div class="row">
|
<p class="card-text">Jedná se o překážku, kde na daném místě vylosujete otázku a běžíte k dalšímu stanovišti ke kontrolorovi. Mezi tím si můžete promyslet jednu z ze tří odpovědí (formát A,B,C). Špatná odpopvěď znamená panáčka. Navíc to má obdobnou funkci, jako Tokken.</p>
|
||||||
<div class="text col-xl-6">
|
</div>
|
||||||
<p>Vítej člověče! Momentálně se nacházíš na oficiální stránce závodu ALKÁTOR RACE.</p>
|
</div>
|
||||||
|
<div class="card">
|
||||||
<p>A co že jsme si to zase vymysleli!? </p>
|
<div class="card-body">
|
||||||
|
<h5 class="card-title">Jak funguje Ruleta?</h5>
|
||||||
<p>Jedná se o překážkový závod u nás v Orlických horách. Celkem máme připravených kolem 30 překážek a trať měří kolem 4 km. V závodě tě čeká pěkných pár panáků, kdy počty se pohybují od 3-15 kousků podle toho jak dobře si na překážkách povedeš. Dále máme v závodě překážku zvanou "Čekárna" na které si deset minut odpočneš a dáš si oddychové pivínko na nejkrásnějších místech v okolí Sobkovic. Čekárny tě v závodě čekají hned čtyři. </p>
|
<p class="card-text">Na stanovišti na Vás budou čekat panáčky. Obsah může být cokoliv alkoholického i nealkoholického, od dobrot po blééé. Nejlepší na tom je, že podle čichu a barvy nemáte šanci poznat, o co se jedná. Jelikož panáčky jsou uzavřené a dobarvené potravinářským barvivem.</p>
|
||||||
|
</div>
|
||||||
<p>Pokud v průběhu závodu dostaneš pocit, že je to nad tvé síly, vždy budeš mít tu možnost přestoupit do kategorie Alkátor Race LIGHT, kde sice ztratíš možnost stanout na stupních vítězů, ale budeš moci plně regulovat svou obtížnost závodu.
|
</div>
|
||||||
Takže když budeš mít špatný den, nikdo tě nebude do ničeho nutit a ty si užiješ atmosféru akce na plné pecky.</p>
|
<div class="card">
|
||||||
|
<div class="card-body">
|
||||||
<p>Našim smělým alkátorkám nebudeme nic extra zjednodušovat, pouze na čekárnách budou konzumovat poloviční dávky piva(pokud budou chtít).
|
<h5 class="card-title">Musím v Alkátor race utíkat nebo se jinak fyzicky namáhat?</h5>
|
||||||
Pravděpodobně bude otevřena i kategorie NEAlkátor Race - zaměřena na řidiče, abstinenty a nezletilé.</p>
|
<p class="card-text">Strategii závodu si určím sám s pomocí mého osobního trenéra. Tudíž se zaměřím hlavně na alkohol a abych dorazil do cíle jako hrdina a ostřílený alko-veterán.</p>
|
||||||
|
</div>
|
||||||
<p>Pro alkátory/rky na stupních vítězů čekají úžasné ceny.</p>
|
</div>
|
||||||
|
<div class="card">
|
||||||
<p>Start závodu je v 12:00, ale check-in se zahájením akce je již od 10:00.</p>
|
<div class="card-body">
|
||||||
|
<h5 class="card-title">Kolik spoluúčastníků mám očekávat?</h5>
|
||||||
<p>Rozhodně se podívej na FAQ sekci, zde na stránce, kde najdeš důležité informace týkající se závodu ALKÁTOR RACE.</p>
|
<p class="card-text">Zatím je kapacita závodu 50 účastníků.</p>
|
||||||
<p>Sportem ku chlastu!</p>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-body">
|
||||||
|
<h5 class="card-title">Co když jsem zde svůj dotaz nenašel?</h5>
|
||||||
|
<p class="card-text">Tak neváhej a kontaktuj nás na sociálních sítích nebo emailu, rádi pomůžeme.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xl-6">
|
}
|
||||||
{this.state.results &&
|
<div class="container">
|
||||||
<table class="table results">
|
<img class="logo" src="/public/logo.svg"></img>
|
||||||
<thead>
|
</div>
|
||||||
<th>Umístění</th>
|
<div class="container text text-center"><h1>Další ročník bude teprve oznámen!</h1></div>
|
||||||
<th>Čas</th>
|
{/*
|
||||||
<th>Kategorie</th>
|
<div class="container info text-center">
|
||||||
<th>Startovní číslo</th>
|
<div class="row">
|
||||||
</thead>
|
<h1 class="col val">
|
||||||
<tbody>
|
<b>KDY?</b>
|
||||||
{this.state.results.map(user =>
|
<br />
|
||||||
<tr>
|
4.5.2024
|
||||||
<th>{user.order}</th>
|
</h1>
|
||||||
<td>{user.duration}</td>
|
<h1 class="col val">
|
||||||
<td>{user.alkator_category}</td>
|
<b>V KOLIK?</b>
|
||||||
<td>{user.starting_number}</td>
|
<br />
|
||||||
</tr>
|
10:00
|
||||||
)}
|
</h1>
|
||||||
</tbody>
|
<h1 class="col val">
|
||||||
</table>
|
<b>KDE?</b>
|
||||||
}
|
<br />
|
||||||
{/*
|
Sobkovice
|
||||||
<img src="/public/trasa.png" style={{'width': '100%', 'height': 'auto'}}/>
|
</h1>
|
||||||
*/}
|
<h1 class="col val">
|
||||||
<iframe width="100%" height="500px" src="https://www.youtube.com/embed/H1UeXTBpsXw?si=kkh2_BBJXw56gVaP" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="true" />
|
<b>CENA</b>
|
||||||
|
<br />
|
||||||
|
690 kč
|
||||||
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
*/}
|
||||||
<div class="container text text-center">
|
<div class="container">
|
||||||
<h2>Stále nevíš, jestli se zúčastníš? Přečti si náš <button type="button" class="btn btn-warning" onClick={(e) => this.togglefaq()}>FAQ</button></h2>
|
<div class="row">
|
||||||
</div>
|
<div class="text col-xl-6">
|
||||||
{/*
|
<p>Vítej člověče! Momentálně se nacházíš na oficiální stránce závodu ALKÁTOR RACE.</p>
|
||||||
<form id="form" class="container" onSubmit={(e) => this.onSubmit(e)}>
|
|
||||||
<h1>Registrace</h1>
|
<p>A co že jsme si to zase vymysleli!? </p>
|
||||||
<div class="mb-3">
|
|
||||||
<label for="first_name" class="form-label">Jméno</label>
|
<p>Jedná se o překážkový závod u nás v Orlických horách. Celkem máme připravených kolem 30 překážek a trať měří kolem 4 km. V závodě tě čeká pěkných pár panáků, kdy počty se pohybují od 3-15 kousků podle toho jak dobře si na překážkách povedeš. Dále máme v závodě překážku zvanou "Čekárna" na které si deset minut odpočneš a dáš si oddychové pivínko na nejkrásnějších místech v okolí Sobkovic. Čekárny tě v závodě čekají hned čtyři. </p>
|
||||||
<input type="text" class="form-control" id="first_name" name="first_name" />
|
|
||||||
|
<p>Pokud v průběhu závodu dostaneš pocit, že je to nad tvé síly, vždy budeš mít tu možnost přestoupit do kategorie Alkátor Race LIGHT, kde sice ztratíš možnost stanout na stupních vítězů, ale budeš moci plně regulovat svou obtížnost závodu.
|
||||||
|
Takže když budeš mít špatný den, nikdo tě nebude do ničeho nutit a ty si užiješ atmosféru akce na plné pecky.</p>
|
||||||
|
|
||||||
|
<p>Našim smělým alkátorkám nebudeme nic extra zjednodušovat, pouze na čekárnách budou konzumovat poloviční dávky piva(pokud budou chtít).
|
||||||
|
Pravděpodobně bude otevřena i kategorie NEAlkátor Race - zaměřena na řidiče, abstinenty a nezletilé.</p>
|
||||||
|
|
||||||
|
<p>Pro alkátory/rky na stupních vítězů čekají úžasné ceny.</p>
|
||||||
|
|
||||||
|
<p>Start závodu je v 12:00, ale check-in se zahájením akce je již od 10:00.</p>
|
||||||
|
|
||||||
|
<p>Rozhodně se podívej na FAQ sekci, zde na stránce, kde najdeš důležité informace týkající se závodu ALKÁTOR RACE.</p>
|
||||||
|
<p>Sportem ku chlastu!</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-xl-6">
|
||||||
|
{this.state.results &&
|
||||||
|
<table class="table results">
|
||||||
|
<thead>
|
||||||
|
<th>Umístění</th>
|
||||||
|
<th>Čas</th>
|
||||||
|
<th>Kategorie</th>
|
||||||
|
<th>Startovní číslo</th>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{this.state.results.map(user =>
|
||||||
|
<tr>
|
||||||
|
<th>{user.order}</th>
|
||||||
|
<td>{user.duration}</td>
|
||||||
|
<td>{user.alkator_category}</td>
|
||||||
|
<td>{user.starting_number}</td>
|
||||||
|
</tr>
|
||||||
|
)}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
}
|
||||||
|
{/*
|
||||||
|
<img src="/public/trasa.png" style={{'width': '100%', 'height': 'auto'}}/>
|
||||||
|
*/}
|
||||||
|
<iframe width="100%" height="500px" src="https://www.youtube.com/embed/H1UeXTBpsXw?si=kkh2_BBJXw56gVaP" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="true" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-3">
|
<div class="container text text-center">
|
||||||
<label for="last_name" class="form-label">Přijmení</label>
|
<h2>Stále nevíš, jestli se zúčastníš? Přečti si náš <button type="button" class="btn btn-warning" onClick={(e) => this.togglefaq()}>FAQ</button></h2>
|
||||||
<input type="text" class="form-control" id="last_name" name="last_name" />
|
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-3">
|
{/*
|
||||||
<label for="email" class="form-label">Emailová adresa</label>
|
<form id="form" class="container" onSubmit={(e) => this.onSubmit(e)}>
|
||||||
<input type="email" class="form-control" id="email" name="email" />
|
<h1>Registrace</h1>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="first_name" class="form-label">Jméno</label>
|
||||||
|
<input type="text" class="form-control" id="first_name" name="first_name" />
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="last_name" class="form-label">Přijmení</label>
|
||||||
|
<input type="text" class="form-control" id="last_name" name="last_name" />
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="email" class="form-label">Emailová adresa</label>
|
||||||
|
<input type="email" class="form-control" id="email" name="email" />
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="date_of_birth" class="form-label">Datum narození</label>
|
||||||
|
<input type="date" class="form-control" id="date_of_birth" name="date_of_birth" max={new Date().toJSON().slice(0, 10)} />
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="address" class="form-label">Adresa (kvůli fakturaci)</label>
|
||||||
|
<input type="text" class="form-control" id="address" name="address" />
|
||||||
|
</div>
|
||||||
|
<div class="mb-3 form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" id="agreement" name="agreement" />
|
||||||
|
<label class="form-check-label" for="agreement">Souhlas se <a href="/public/ochrana_osobnich_udaju.pdf">zpracováním osobních údajů</a> a <a href="/public/reverz.pdf">podmínkami závodu</a>.</label>
|
||||||
|
</div>
|
||||||
|
<button type="submit" class="btn btn-primary">Odeslat</button>
|
||||||
|
</form>
|
||||||
|
*/}
|
||||||
|
<div class="container text-center social">
|
||||||
|
<div class="row">
|
||||||
|
<a class="col-lg-3" style={{"color": "black"}} href="mailto:info@alkator.cz"><b>info@alkator.cz</b></a>
|
||||||
|
<a class="col-lg-3" href="https://www.facebook.com/AlkatorRace"><img height="40px" src="/public/fb_logo.svg" /></a>
|
||||||
|
<a class="col-lg-3" href="https://www.youtube.com/@AlkatorRace"><img height="40px" src="/public/youtube_logo.svg"/></a>
|
||||||
|
<a class="col-lg-3" href="https://www.instagram.com/alkator_race/"><img height="40px" src="/public/instagram_logo.svg" /></a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-3">
|
<div class="container video">
|
||||||
<label for="date_of_birth" class="form-label">Datum narození</label>
|
<iframe width="100%" height="800px" src="https://www.youtube.com/embed/v3r2IAPdFFQ?si=kkh2_BBJXw56gVaP" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="true"></iframe>
|
||||||
<input type="date" class="form-control" id="date_of_birth" name="date_of_birth" max={new Date().toJSON().slice(0, 10)} />
|
|
||||||
</div>
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="address" class="form-label">Adresa (kvůli fakturaci)</label>
|
|
||||||
<input type="text" class="form-control" id="address" name="address" />
|
|
||||||
</div>
|
|
||||||
<div class="mb-3 form-check">
|
|
||||||
<input type="checkbox" class="form-check-input" id="agreement" name="agreement" />
|
|
||||||
<label class="form-check-label" for="agreement">Souhlas se <a href="/public/ochrana_osobnich_udaju.pdf">zpracováním osobních údajů</a> a <a href="/public/reverz.pdf">podmínkami závodu</a>.</label>
|
|
||||||
</div>
|
|
||||||
<button type="submit" class="btn btn-primary">Odeslat</button>
|
|
||||||
</form>
|
|
||||||
*/}
|
|
||||||
<div class="container text-center social">
|
|
||||||
<div class="row">
|
|
||||||
<a class="col-lg-3" style={{"color": "black"}} href="mailto:info@alkator.cz"><b>info@alkator.cz</b></a>
|
|
||||||
<a class="col-lg-3" href="https://www.facebook.com/AlkatorRace"><img height="40px" src="/public/fb_logo.svg" /></a>
|
|
||||||
<a class="col-lg-3" href="https://www.youtube.com/@AlkatorRace"><img height="40px" src="/public/youtube_logo.svg"/></a>
|
|
||||||
<a class="col-lg-3" href="https://www.instagram.com/alkator_race/"><img height="40px" src="/public/instagram_logo.svg" /></a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="container video">
|
}
|
||||||
<iframe width="100%" height="800px" src="https://www.youtube.com/embed/v3r2IAPdFFQ?si=kkh2_BBJXw56gVaP" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="true"></iframe>
|
|
||||||
</div>
|
|
||||||
<div class="container text">
|
<div class="container text">
|
||||||
<a href="/public/reverz.pdf">Reverz</a><br />
|
<a href="/public/reverz.pdf">Reverz</a><br />
|
||||||
<a href="/public/ochrana_osobnich_udaju.pdf">Ochrana osobních údajů</a><br />
|
<a href="/public/ochrana_osobnich_udaju.pdf">Ochrana osobních údajů</a><br />
|
||||||
|
0
photos/.gitkeep
Normal file
0
photos/.gitkeep
Normal file
Loading…
x
Reference in New Issue
Block a user