{% extends 'base.html.twig' %}
{% block title %}Zatoka Kodu - Rejestracja{% endblock %}
{% block body %}
<main>
<section class="min-vh-100 d-flex align-items-center justify-content-center bg-white py-5 px-3">
<div class="container">
<div class="row justify-content-center">
<div class="col-md-10 col-lg-8 col-xl-6">
<div class="text-center mb-4">
<span class="display-4">馃憢</span>
<h1 class="h3 fw-bold mt-2">Witamy w Zatoce Kodu</h1>
<p class="text-muted">Wype艂nij formularz, aby zapisa膰 swoje dziecko na zaj臋cia</p>
</div>
<form action="/zapisz_na_kurs" method="post" class="bg-light p-4 p-md-5 rounded-4 shadow-sm" id="client_form">
{% set fields = [
{'label': 'Imi臋 dziecka', 'name': 'child_name', 'icon': 'bi-person-circle'},
{'label': 'Nazwisko dziecka', 'name': 'child_surname', 'icon': 'bi-person-circle'},
{'label': 'Imi臋 rodzica', 'name': 'parent_name', 'icon': 'bi-person-circle'},
{'label': 'Nazwisko rodzica', 'name': 'parent_surname', 'icon': 'bi-person-circle'},
{'label': 'Adres email', 'name': 'email', 'type': 'email', 'icon': 'bi-envelope-fill'},
{'label': 'Telefon', 'name': 'phone', 'type': 'tel', 'icon': 'bi-phone-fill'},
{'label': 'Miasto', 'name': 'city', 'icon': 'bi-geo-alt-fill'},
{'label': 'Szko艂a', 'name': 'school', 'icon': 'bi-building'},
{'label': 'Klasa', 'name': 'class', 'icon': 'bi-people-fill'}
] %}
{% for field in fields %}
<div class="mb-3">
<label class="form-label">{{ field.label }} *</label>
<div class="input-group">
<span class="input-group-text bg-white border-end-0"><i class="bi {{ field.icon }}"></i></span>
<input type="{{ field.type|default('text') }}" name="{{ field.name }}" class="form-control border-start-0" placeholder="{{ field.label }}" required>
</div>
{% if field.name == 'email' %}
<div id="emailHelp" class="form-text text-danger" style="display:none;">Niepoprawny format adresu e-mail.</div>
{% endif %}
{% if field.name == 'phone' %}
<div id="phoneHelp" class="form-text text-danger" style="display:none;">Niepoprawny format numeru telefonu. Mo偶esz wpisa膰 cyfry i opcjonalnie + na pocz膮tku.</div>
{% endif %}
</div>
{% endfor %}
<div class="mb-3">
<label class="form-label">Model P艂atno艣ci *</label>
<div class="input-group">
<span class="input-group-text bg-white border-end-0"><i class="bi bi-credit-card-2-front-fill"></i></span>
<select class="form-select border-start-0" name="payment" required>
<option value="" disabled selected>Wybierz model p艂atno艣ci</option>
<option value="miesieczna">Miesi臋czny (8 x 189 z艂) Cena za zaj臋cia: 50 z艂</option>
<option value="kwartalna">Kwartalny (3 x 420 z艂) Cena za zja臋cia: 42 z艂</option>
</select>
</div>
</div>
<div class="mb-3">
<label class="form-label">Has艂o *</label>
<div class="input-group">
<span class="input-group-text bg-white border-end-0"><i class="bi bi-lock-fill"></i></span>
<input type="password" name="password" id="password" class="form-control border-start-0" placeholder="Has艂o" minlength="6" required>
</div>
<div id="passwordHelpBlock" class="form-text text-danger" style="display:none;">Has艂o musi mie膰 co najmniej 6 znak贸w.</div>
</div>
<div class="mb-3">
<label class="form-label">Powt贸rz has艂o *</label>
<div class="input-group">
<span class="input-group-text bg-white border-end-0"><i class="bi bi-lock-fill"></i></span>
<input type="password" name="password-repeat" id="password-repeat" class="form-control border-start-0" placeholder="Powt贸rz has艂o" required>
</div>
<div id="passwordHelpBlock2" class="form-text text-danger" style="display:none;">Has艂a nie s膮 takie same.</div>
</div>
<div class="form-check my-3">
<input class="form-check-input" type="checkbox" name="permission" id="permission" required>
<label class="form-check-label small" for="permission">
Wyra偶am zgod臋 na przetwarzanie moich danych osobowych oraz danych osobowych mojego dziecka: imi臋 i nazwisko dziecka, imi臋 i nazwisko rodzica/opiekuna prawnego, dane kontaktowe (numer telefonu, adres e-mail), przez Programmers sp z o.o. w celu rejestracji dziecka na zaj臋cia oraz przygotowania umowy i realizacji 艣wiadcze艅 wynikaj膮cych z uczestnictwa w zaj臋ciach. Administratorem danych osobowych jest Programmers sp z o.o. Dane te b臋d膮 przetwarzane zgodnie z Rozporz膮dzeniem Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. (RODO).
</label>
</div>
<div class="align-items-center mb-5">
<div class="d-grid">
<div class="g-recaptcha" data-sitekey="6Lc4NSQrAAAAAPo_MUEoj18JriAWuWj933iAian0"></div>
</div>
</div>
<input type="hidden" value="{% if course_id is defined %}{{ course_id }}{% endif %}" name="course">
<input type="hidden" value="{% if course_id is defined %}{% if group_id matches '/^\\d+$/' %}{{ group_id }}{% endif %}{% endif %}" name="group">
<input type="hidden" value="{% if type is defined %}{{ type }}{% endif %}" name="type">
<input type="hidden" value="{% if district is defined %}{{ district }}{% else %}rejestracja{% endif %}" name="district">
<div class="d-grid">
<button id="register_button" type="submit" class="btn btn-primary btn-lg rounded-pill">Zapisz dziecko</button>
</div>
</form>
</div>
</div>
</div>
</section>
</main>
{% endblock %}
{% block js %}
{{ parent() }}
<script src="{{ asset('./assets/js/jquery-3.6.4.min.js') }}"></script>
<script>
const passwordInput = document.getElementById('password');
const repeatPasswordInput = document.getElementById('password-repeat');
const emailInput = document.querySelector('[name="email"]');
const phoneInput = document.querySelector('[name="phone"]');
const form = document.getElementById('client_form');
function validateForm(event) {
let valid = true;
const requiredFields = form.querySelectorAll('[required]');
requiredFields.forEach(field => {
if (!field.value.trim()) {
field.classList.add('is-invalid');
valid = false;
} else {
field.classList.remove('is-invalid');
}
});
const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/;
if (!emailRegex.test(emailInput.value.trim())) {
emailInput.classList.add('is-invalid');
document.getElementById('emailHelp').style.display = 'block';
valid = false;
} else {
emailInput.classList.remove('is-invalid');
document.getElementById('emailHelp').style.display = 'none';
}
const phoneRegex = /^\+?[0-9]{9,15}$/;
if (!phoneRegex.test(phoneInput.value.trim())) {
phoneInput.classList.add('is-invalid');
document.getElementById('phoneHelp').style.display = 'block';
valid = false;
} else {
phoneInput.classList.remove('is-invalid');
document.getElementById('phoneHelp').style.display = 'none';
}
// Has艂o - min 6 znak贸w
if (passwordInput.value.length < 6) {
passwordInput.classList.add('is-invalid');
document.getElementById('passwordHelpBlock').style.display = 'block';
valid = false;
} else {
passwordInput.classList.remove('is-invalid');
document.getElementById('passwordHelpBlock').style.display = 'none';
}
// Por贸wnanie hase艂
if (passwordInput.value.length >= 6 && passwordInput.value !== repeatPasswordInput.value) {
repeatPasswordInput.classList.add('is-invalid');
document.getElementById('passwordHelpBlock2').style.display = 'block';
valid = false;
} else {
repeatPasswordInput.classList.remove('is-invalid');
document.getElementById('passwordHelpBlock2').style.display = 'none';
}
return valid;
}
function sendRequest(formData) {
const xhr = new XMLHttpRequest();
xhr.open('POST', '/zapisz_na_kurs', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
const jsonObj = JSON.parse(xhr.responseText);
if (jsonObj.status == "success") {
// document.getElementById('form_div').classList.add('text-center');
{% if group_id is defined %}
{% if group_id matches '/^\\d+$/' %}
window.location.href = "{{ path('register_success')}}";
{% else %}
window.location.href = "{{ path('register_waiting_list')}}";
{% endif %}
{% else %}
window.location.href = "{{ path('register_success')}}";
{% endif %}
} else if (jsonObj.status == "error3") {
window.location.href = "{{ path('account_exsist')}}";
}
} else {
alert('B艂膮d po艂膮czenia z serwerem.');
}
}
};
xhr.send(formData);
}
form.addEventListener('submit', function (event) {
event.preventDefault();
if (!validateForm(event)) {
return;
}
const data = {};
new FormData(form).forEach((value, key) => {
data[key] = value;
});
sendRequest(JSON.stringify(data));
});
</script>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
{% endblock %}