feat(superpilot-web): wdrozenie webowej bazy pilotow z profilem, wyszukiwarka i zleceniami

- Wyszukiwarka ofert w stylu Pracuj.pl z multiselectem destynacji i filtrem bazy pilota
- Przeprojektowany profil pilota zgodny ze standardem UX/UI 2026 i aplikacja mobile
- Spokojny, ustrukturyzowany modal rezerwacji i zapytań ofertowych (booking-modal)
- Panel zleceń i zapytań ofertowych biura (inquiries.php) powiazany z awatarem profilu
- Integracja linku do Superpilota w menu glownym Travel Managera
This commit is contained in:
oskarn
2026-09-18 14:20:36 +02:00
parent 373bffa573
commit 8c42888f52
13 changed files with 4673 additions and 0 deletions
+165
View File
@@ -0,0 +1,165 @@
<!-- Modal Rezerwacji / Zapytania Ofertowego (Standard UX/UI 2026) -->
<div class="modal fade" id="bookingModal" tabindex="-1" aria-labelledby="bookingModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content border-0 shadow-lg" style="border-radius: var(--radius-md); overflow: hidden;">
<!-- Spokojny, czytelny nagłówek modala -->
<div class="modal-header bg-white border-bottom py-3 px-4">
<div class="d-flex align-items-center gap-2">
<div class="rounded-circle d-flex align-items-center justify-content-center" style="width: 36px; height: 36px; background: var(--primary-light); color: var(--primary); font-size: 1.2rem;">
<i class='bx bx-calendar-check'></i>
</div>
<div>
<h5 class="modal-title fw-bold text-navy mb-0" id="bookingModalLabel" style="font-size: 1.05rem;">
Zapytanie o Dostępność & Rezerwacja Terminu
</h5>
<small class="text-muted" style="font-size: 0.76rem;">
Zlecenie trafi bezpośrednio do aplikacji mobilnej pilota z możliwością natychmiastowej akceptacji
</small>
</div>
</div>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Zamknij"></button>
</div>
<form id="pilotBookingForm">
<div class="modal-body p-4">
<!-- Podsumowanie wybranego pilota (Spokojna karta) -->
<div class="d-flex align-items-center justify-content-between p-3 rounded-3 mb-4" style="background: #f8f9fd; border: 1px solid var(--border-color);">
<div class="d-flex align-items-center gap-3">
<div class="rounded-3 d-flex align-items-center justify-content-center text-white fw-bold" style="width: 44px; height: 44px; background: linear-gradient(135deg, var(--primary) 0%, #767bf7 100%); font-size: 1.1rem; flex-shrink: 0;">
OK
</div>
<div>
<div class="d-flex align-items-center gap-2">
<span class="fw-bold text-dark" id="bookingPilotNameDisplay" style="font-size: 0.95rem;">Oskar Kaczmarek</span>
<span class="pilot-academy-badge" style="font-size: 0.68rem; padding: 2px 8px;">
<i class='bx bx-check-shield'></i> Superpilot Academy
</span>
</div>
<div class="text-muted small d-flex align-items-center gap-2 mt-1" style="font-size: 0.76rem;">
<span><i class='bx bx-compass text-primary'></i> Pilot Wycieczek & Przewodnik</span>
<span>•</span>
<span><i class='bx bx-map-pin text-muted'></i> Baza: Warszawa</span>
</div>
</div>
</div>
<div class="text-end">
<span class="profile-meta-rating" style="font-size: 0.75rem;">
<i class='bx bxs-star text-warning'></i> 4.9 (18 opinii)
</span>
</div>
</div>
<input type="hidden" id="bookingPilotId" value="1">
<input type="hidden" id="bookingPilotName" value="Oskar Kaczmarek">
<!-- Sekcja 1: Wybór wycieczki z Travel Managera -->
<div class="mb-3">
<label class="form-label fw-bold text-dark small mb-1">
Powiąż z imprezą w Travel Managerze:
</label>
<select class="form-select form-select-sm fw-semibold" id="bookingTourSelect" style="font-size: 0.84rem; padding: 0.5rem 0.75rem;">
<option value="12" selected>Wycieczka #12: Klasyczne Włochy (16.09 - 24.09.2027) • 44 uczestników</option>
<option value="15">Wycieczka #15: Magia Toskanii i Rzym (05.10 - 12.10.2027) • 38 uczestników</option>
<option value="21">Wycieczka #21: Andaluzja i Gibraltar (12.11 - 19.11.2027) • 40 uczestników</option>
<option value="new">+ Utwórz zapytanie niestandardowe / Inny termin...</option>
</select>
<div class="text-muted mt-1" style="font-size: 0.72rem;">
Wybranie imprezy automatycznie przeniesie ramowy program trasy do aplikacji pilota.
</div>
</div>
<!-- Sekcja 2: Termin i Trasa (2 kolumny) -->
<div class="row g-3 mb-3">
<div class="col-md-6">
<label class="form-label fw-bold text-dark small mb-1">Termin realizacji zlecenia:</label>
<div class="input-group input-group-sm">
<span class="input-group-text bg-light text-muted"><i class='bx bx-calendar'></i></span>
<input type="text" class="form-control fw-semibold" id="bookingDates" value="16.09.2027 - 24.09.2027" required>
</div>
</div>
<div class="col-md-6">
<label class="form-label fw-bold text-dark small mb-1">Destynacja i trasa:</label>
<div class="input-group input-group-sm">
<span class="input-group-text bg-light text-muted"><i class='bx bx-map-pin'></i></span>
<input type="text" class="form-control fw-semibold" id="bookingDestination" value="🇮🇹 Włochy (Wenecja - Florencja - Rzym)" required>
</div>
</div>
</div>
<!-- Sekcja 3: Finanse i Świadczenia (2 kolumny) -->
<div class="row g-3 mb-3">
<div class="col-md-6">
<label class="form-label fw-bold text-dark small mb-1">Proponowana stawka dzienna netto:</label>
<div class="input-group input-group-sm mb-1">
<span class="input-group-text bg-light fw-bold text-dark">PLN</span>
<input type="number" class="form-control fw-bold text-dark" id="bookingRate" value="550" step="50">
<span class="input-group-text bg-light text-muted">/ dzień netto</span>
</div>
<div class="text-muted" style="font-size: 0.72rem;">
Szacowany koszt zlecenia (9 dni): <strong class="text-dark">4 950 PLN netto</strong>
</div>
</div>
<div class="col-md-6">
<label class="form-label fw-bold text-dark small mb-1">Świadczenia zapewniane przez biuro:</label>
<div class="p-2 border rounded-2 bg-light" style="font-size: 0.78rem;">
<div class="form-check mb-1">
<input class="form-check-input" type="checkbox" id="benefitHotel" checked>
<label class="form-check-label text-dark" for="benefitHotel">
Pokój 1-osobowy dla pilota w hotelach
</label>
</div>
<div class="form-check mb-1">
<input class="form-check-input" type="checkbox" id="benefitMeals" checked>
<label class="form-check-label text-dark" for="benefitMeals">
Wyżywienie (śniadania + obiadokolacje)
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="benefitInsurance" checked>
<label class="form-check-label text-dark" for="benefitInsurance">
Ubezpieczenie KL / NNW w trakcie trasy
</label>
</div>
</div>
</div>
</div>
<!-- Sekcja 4: Wiadomość dla pilota -->
<div class="mb-3">
<label class="form-label fw-bold text-dark small mb-1">Wiadomość / uwagi do zlecenia:</label>
<textarea class="form-control" rows="3" style="font-size: 0.82rem; line-height: 1.45;" placeholder="Dodatkowe informacje, specyfika grupy, zbiórka...">Dzień dobry Panie Oskarze, zapraszamy do poprowadzenia wycieczki objazdowej po Włoszech. Znając Pana referencje z poprzednich tras, liczymy na ponowną udaną współpracę!</textarea>
</div>
<!-- Dyskretny box o powiadomieniu PUSH -->
<div class="d-flex align-items-center gap-3 p-3 rounded-2" style="background: var(--primary-light); border: 1px solid var(--primary-border);">
<i class='bx bx-mobile-alt fs-3' style="color: var(--primary);"></i>
<div style="font-size: 0.78rem; line-height: 1.4; color: var(--dark-navy);">
<strong>Powiadomienie PUSH:</strong> Pilot otrzyma natychmiast zapytanie na telefonie w aplikacji <code>TravelLeader Mobile</code> i ma 24h na potwierdzenie dostępności.
</div>
</div>
</div>
<div class="modal-footer bg-light px-4 py-3 border-top d-flex justify-content-between align-items-center">
<span class="text-muted small" style="font-size: 0.74rem;">
<i class='bx bx-shield-check text-success me-1'></i> Bezpieczna rezerwacja w ekosystemie Travel Manager
</span>
<div class="d-flex align-items-center gap-2">
<button type="button" class="btn btn-outline-secondary btn-sm" data-bs-dismiss="modal" style="font-size: 0.8rem;">
Anuluj
</button>
<button type="submit" class="btn btn-primary btn-sm px-4 fw-semibold" style="font-size: 0.8rem; border-radius: var(--radius-sm);">
<i class='bx bx-paper-plane me-1'></i> Wyślij zapytanie do pilota
</button>
</div>
</div>
</form>
</div>
</div>
</div>