first commit
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
<ul class="nav nav-tabs mb-4">
|
||||
<li class="nav-item"><a class="nav-link {% if request.endpoint=='main.admin_companies' %}active{% endif %}" href="{{url_for('main.admin_companies')}}">Firmy i karty</a></li>
|
||||
{% if current_user.role=='admin' %}<li class="nav-item"><a class="nav-link {% if request.endpoint=='main.admin_application' %}active{% endif %}" href="{{url_for('main.admin_application')}}">Aplikacja</a></li>{% endif %}
|
||||
<li class="nav-item"><a class="nav-link {% if request.endpoint=='main.admin_users' %}active{% endif %}" href="{{url_for('main.admin_users')}}">Użytkownicy</a></li>
|
||||
</ul>
|
||||
@@ -0,0 +1,17 @@
|
||||
{% extends 'base.html' %}{% block content %}
|
||||
<div class="mb-4"><h1 class="h2 mb-1">Administracja</h1><p class="text-body-secondary mb-0">Ustawienia firmy i zarządzanie użytkownikami.</p></div>
|
||||
<div class="row g-4"><div class="col-xl-6"><div class="card"><div class="card-body"><h2 class="h5">Ustawienia firmy</h2>
|
||||
<form method="post" action="/api/settings" data-method="PUT" class="row g-3 ajax-form">
|
||||
<div class="col-12"><label class="form-label">Nazwa firmy</label><input class="form-control" name="name" value="{{settings.name}}" required></div><div class="col-6"><label class="form-label">Typ firmy</label><select class="form-select" name="entity_type"><option {% if settings.entity_type=='JDG' %}selected{% endif %}>JDG</option><option>Spółka</option></select></div><div class="col-6"><label class="form-label">VAT %</label><input class="form-control" type="number" step="0.01" name="vat_rate" value="{{settings.vat_rate}}"></div>
|
||||
<div class="col-6"><label class="form-label">Odliczenie VAT %</label><input class="form-control" type="number" min="0" max="100" step="1" name="vat_deduction_percent" value="{{settings.vat_deduction_percent}}"></div>
|
||||
<div class="col-6"><label class="form-label">Dzień podziału</label><input class="form-control" type="number" min="1" max="27" name="invoice_split_day" value="{{settings.invoice_split_day}}"></div>
|
||||
<div class="col-12"><div class="form-check"><input class="form-check-input" type="checkbox" name="invoice_split_enabled" id="invoice-split" {% if split_enabled %}checked{% endif %}><label class="form-check-label" for="invoice-split">Dziel faktury kartowe według dnia miesiąca</label></div></div>
|
||||
<div class="col-12"><label class="form-label">Województwo dla LPG</label><select class="form-select" name="region" required>{% for region in regions %}<option value="{{region}}" {% if settings.region==region %}selected{% endif %}>{{region}}</option>{% endfor %}</select></div><div class="col-12"><button class="btn btn-primary">Zapisz ustawienia</button></div></form></div></div></div>
|
||||
<div class="col-xl-6"><div class="card"><div class="card-body"><h2 class="h5">Dodaj użytkownika</h2><form method="post" action="/api/users" class="row g-3 ajax-form"><div class="col-md-6"><label class="form-label">Imię i nazwisko</label><input class="form-control" name="user_name" required></div><div class="col-md-6"><label class="form-label">E-mail</label><input class="form-control" type="email" name="email" required></div><div class="col-md-6"><label class="form-label">Hasło</label><input class="form-control" type="password" name="password" minlength="8" required></div><div class="col-md-6"><label class="form-label">Rola</label><select class="form-select" name="role"><option value="user">User</option><option value="boss">Szef</option><option value="admin">Admin</option></select></div><div class="col-12"><button class="btn btn-primary">Dodaj użytkownika</button></div></form></div></div></div></div>
|
||||
<div class="row g-4 mt-1">
|
||||
<div class="col-xl-5"><div class="card"><div class="card-body"><h2 class="h5">Ustawienia aplikacji</h2><form action="/api/app-settings" data-method="PUT" class="ajax-form row g-3"><div class="col-12"><label class="form-label">Motyw aplikacji</label><select class="form-select" name="theme">{% for key,item in themes.items() %}<option value="{{key}}" {% if app_theme_name==key %}selected{% endif %}>{{item.label}}</option>{% endfor %}</select></div><div class="col-12"><button class="btn btn-primary">Zapisz ustawienia aplikacji</button></div></form></div></div></div>
|
||||
<div class="col-xl-7"><div class="card"><div class="card-body"><h2 class="h5">Karty paliwowe firmy</h2><form action="/api/fuel-cards" class="ajax-form row g-2 mb-3"><div class="col-md-4"><input class="form-control" name="name" placeholder="Nazwa, np. UTA Polska" required></div><div class="col-md-3"><input class="form-control" name="provider" placeholder="Operator" required></div><div class="col-md-3"><input class="form-control" name="description" placeholder="Opis"></div><div class="col-md-2"><button class="btn btn-primary w-100">Dodaj</button></div></form><div class="list-group">{% for card in fuel_cards %}<div class="list-group-item d-flex justify-content-between align-items-center"><div><strong>{{card.name}}</strong><div class="small text-body-secondary">{{card.provider}}{% if card.description %} · {{card.description}}{% endif %}</div></div><span class="badge text-bg-{{'success' if card.active else 'secondary'}}">{{'aktywna' if card.active else 'nieaktywna'}}</span></div>{% else %}<div class="text-body-secondary">Brak kart paliwowych.</div>{% endfor %}</div></div></div></div>
|
||||
</div>
|
||||
{% if current_user.role=='admin' %}<div class="card mt-4"><div class="card-body"><div class="d-flex flex-column flex-md-row justify-content-between gap-3 mb-3"><div><h2 class="h5 mb-1">Użytkownicy</h2><small class="text-body-secondary">{{ users_page.total }} kont</small></div><form method="get" action="{{url_for('main.admin')}}" class="d-flex gap-2 ajax-nav-form"><input class="form-control" name="q" value="{{q}}" placeholder="Szukaj po nazwie lub e-mailu"><button class="btn btn-secondary">Szukaj</button></form></div><div class="table-responsive"><table class="table table-hover align-middle"><thead><tr><th>Nazwa</th><th>E-mail</th><th>Rola</th><th>Status</th><th class="text-end">Akcja</th></tr></thead><tbody>{% for u in users_page.items %}<tr><td>{{u.name}}</td><td>{{u.email}}</td><td><span class="badge text-bg-secondary">{{u.role}}</span></td><td>{% if u.active %}<span class="badge text-bg-success">Aktywny</span>{% else %}<span class="badge text-bg-danger">Nieaktywny</span>{% endif %}</td><td class="text-end"><button type="button" class="btn btn-sm btn-primary user-edit-btn" data-bs-toggle="modal" data-bs-target="#userEditModal" data-id="{{u.id}}" data-name="{{u.name|e}}" data-email="{{u.email|e}}" data-role="{{u.role}}" data-active="{{1 if u.active else 0}}" data-card="{{u.fuel_card_id or ''}}">Edytuj</button></td></tr>{% else %}<tr><td colspan="5" class="text-center text-body-secondary py-4">Brak użytkowników.</td></tr>{% endfor %}</tbody></table></div>{% if users_page.pages > 1 %}<nav><ul class="pagination mb-0">{% for p in users_page.iter_pages() %}{% if p %}<li class="page-item {% if p==users_page.page %}active{% endif %}"><a class="page-link ajax-nav-link" href="{{url_for('main.admin',page=p,q=q)}}">{{p}}</a></li>{% else %}<li class="page-item disabled"><span class="page-link">…</span></li>{% endif %}{% endfor %}</ul></nav>{% endif %}</div></div>
|
||||
<div class="modal fade" id="userEditModal" tabindex="-1"><div class="modal-dialog"><div class="modal-content"><form method="post" class="ajax-form" id="user-edit-form" data-method="PUT"><div class="modal-header"><h2 class="modal-title fs-5">Edytuj użytkownika</h2><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div><div class="modal-body"><div class="mb-3"><label class="form-label">Nazwa</label><input class="form-control" name="name" required></div><div class="mb-3"><label class="form-label">E-mail</label><input class="form-control" type="email" name="email" required></div><div class="mb-3"><label class="form-label">Rola</label><select class="form-select" name="role"><option value="user">User</option><option value="boss">Szef</option><option value="admin">Admin</option></select></div><div class="mb-3"><label class="form-label">Domyślna karta paliwowa</label><select class="form-select" name="fuel_card_id"><option value="">Brak</option>{% for card in fuel_cards if card.active %}<option value="{{card.id}}">{{card.name}}</option>{% endfor %}</select></div><div class="mb-3"><label class="form-label">Nowe hasło</label><input class="form-control" type="password" name="password" minlength="8" placeholder="Pozostaw puste bez zmiany"></div><div class="form-check"><input class="form-check-input" type="checkbox" name="active" id="modal-active"><label class="form-check-label" for="modal-active">Konto aktywne</label></div></div><div class="modal-footer"><button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Anuluj</button><button class="btn btn-primary">Zapisz</button></div></form></div></div></div>{% endif %}
|
||||
{% endblock %}{% block scripts %}<script>FuelTrack.bindUserModal();</script>{% endblock %}
|
||||
@@ -0,0 +1,4 @@
|
||||
{% extends 'base.html' %}{% block title %}Ustawienia aplikacji{% endblock %}{% block content %}
|
||||
<h1 class="h2 mb-3">Administracja</h1>{% include '_admin_nav.html' %}
|
||||
<div class="card"><div class="card-body"><h2 class="h5">Wygląd aplikacji</h2><form action="/api/app-settings" data-method="PUT" class="ajax-form row g-3"><div class="col-md-6"><label class="form-label">Motyw Bootstrap</label><select class="form-select" name="theme">{% for key,t in themes.items() %}<option value="{{key}}" {% if key==app_theme_name %}selected{% endif %}>{{t.label}}</option>{% endfor %}</select></div><div class="col-12"><button class="btn btn-primary">Zapisz ustawienia aplikacji</button></div></form></div></div>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,63 @@
|
||||
{% extends 'base.html' %}
|
||||
{% block title %}Firmy i karty{% endblock %}
|
||||
{% block content %}
|
||||
<div class="d-flex flex-column flex-lg-row justify-content-between align-items-lg-center gap-3 mb-3">
|
||||
<div><h1 class="h2 mb-1">Administracja</h1><p class="text-body-secondary mb-0">Firmy, karty paliwowe i firmowe ulubione stacje.</p></div>
|
||||
{% if current_user.role == 'admin' %}<button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#createCompanyModal">Dodaj firmę</button>{% endif %}
|
||||
</div>
|
||||
{% include '_admin_nav.html' %}
|
||||
|
||||
<div class="row g-4">
|
||||
<div class="col-xl-4 col-xxl-3">
|
||||
<div class="card h-100">
|
||||
<div class="card-header"><strong>Firmy</strong></div>
|
||||
<div class="card-body border-bottom">
|
||||
<form method="get" action="{{ url_for('main.admin_companies') }}" class="ajax-nav-form">
|
||||
<div class="input-group"><input class="form-control" name="q" value="{{ q }}" placeholder="Szukaj firmy"><button class="btn btn-secondary">Szukaj</button></div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="list-group list-group-flush">
|
||||
{% for c in companies_page.items %}
|
||||
<a href="{{ url_for('main.admin_companies', company_id=c.id, q=q, page=companies_page.page) }}" class="list-group-item list-group-item-action ajax-nav-link {% if selected_company and selected_company.id == c.id %}active{% endif %}">
|
||||
<div class="d-flex justify-content-between gap-2"><strong class="text-truncate">{{ c.name }}</strong><span class="badge {% if c.active %}text-bg-success{% else %}text-bg-secondary{% endif %}">{{ 'aktywna' if c.active else 'wyłączona' }}</span></div>
|
||||
<div class="small {% if selected_company and selected_company.id == c.id %}text-white-50{% else %}text-body-secondary{% endif %}">{{ c.entity_type }} · {{ c.region }} · {{ c.users|length }} użytk.</div>
|
||||
</a>
|
||||
{% else %}<div class="p-4 text-center text-body-secondary">Brak firm.</div>{% endfor %}
|
||||
</div>
|
||||
{% if companies_page.pages > 1 %}
|
||||
<div class="card-footer"><nav><ul class="pagination pagination-sm mb-0 justify-content-center">
|
||||
{% for p in companies_page.iter_pages() %}{% if p %}<li class="page-item {% if p == companies_page.page %}active{% endif %}"><a class="page-link ajax-nav-link" href="{{ url_for('main.admin_companies', page=p, q=q, company_id=selected_company.id if selected_company else none) }}">{{ p }}</a></li>{% else %}<li class="page-item disabled"><span class="page-link">…</span></li>{% endif %}{% endfor %}
|
||||
</ul></nav></div>{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-xl-8 col-xxl-9">
|
||||
{% if selected_company %}
|
||||
<div class="card mb-4"><div class="card-header d-flex justify-content-between align-items-center"><div><strong>{{ selected_company.name }}</strong><div class="small text-body-secondary">Ustawienia firmy</div></div><span class="badge text-bg-secondary">ID {{ selected_company.id }}</span></div>
|
||||
<div class="card-body">
|
||||
<form action="/api/companies/{{ selected_company.id }}" data-method="PUT" class="ajax-form row g-3">
|
||||
<div class="col-lg-5"><label class="form-label">Nazwa firmy</label><input class="form-control" name="name" value="{{ selected_company.name }}" required></div>
|
||||
<div class="col-md-4 col-lg-3"><label class="form-label">Forma prawna</label><select class="form-select" name="entity_type"><option {% if selected_company.entity_type=='JDG' %}selected{% endif %}>JDG</option><option {% if selected_company.entity_type=='Sp. z o.o.' %}selected{% endif %}>Sp. z o.o.</option><option {% if selected_company.entity_type=='Inna' %}selected{% endif %}>Inna</option></select></div>
|
||||
<div class="col-md-8 col-lg-4"><label class="form-label">Województwo</label><select class="form-select" name="region">{% for r in regions %}<option value="{{r}}" {% if selected_company.region==r %}selected{% endif %}>{{r}}</option>{% endfor %}</select></div>
|
||||
<div class="col-md-4"><label class="form-label">Stawka VAT (%)</label><input class="form-control" type="number" min="0" step="0.01" name="vat_rate" value="{{ selected_company.vat_rate }}"></div>
|
||||
<div class="col-md-4"><label class="form-label">Odliczenie VAT (%)</label><input class="form-control" type="number" min="0" max="100" step="0.01" name="vat_deduction_percent" value="{{ selected_company.vat_deduction_percent }}"></div>
|
||||
<div class="col-md-4"><label class="form-label">Podział faktury po dniu</label><input class="form-control" type="number" min="1" max="28" name="invoice_split_day" value="{{ selected_company.invoice_split_day }}"></div>
|
||||
<div class="col-12 d-flex justify-content-between align-items-center"><div class="form-check"><input class="form-check-input" name="active" type="checkbox" id="company-active" {% if selected_company.active %}checked{% endif %}><label class="form-check-label" for="company-active">Firma aktywna</label></div><button class="btn btn-primary">Zapisz ustawienia</button></div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-4"><div class="card-header"><strong>Karty paliwowe</strong></div><div class="card-body">
|
||||
<form action="/api/fuel-cards" method="post" class="ajax-form row g-3 mb-4"><input type="hidden" name="company_id" value="{{selected_company.id}}"><div class="col-md-4"><label class="form-label">Nazwa karty</label><input class="form-control" name="name" placeholder="Np. UTA – flota główna" required></div><div class="col-md-3"><label class="form-label">Operator karty</label><input class="form-control" name="provider" placeholder="UTA, DKV, Orlen" required></div><div class="col-md-3"><label class="form-label">Opis</label><input class="form-control" name="description" placeholder="Opcjonalnie"></div><div class="col-md-2 d-flex align-items-end"><button class="btn btn-primary w-100">Dodaj kartę</button></div></form>
|
||||
<div class="table-responsive"><table class="table table-hover align-middle mb-0"><thead><tr><th>Karta</th><th>Operator karty</th><th>Opis</th><th>Status</th></tr></thead><tbody>{% for card in fuel_cards %}<tr><td><strong>{{card.name}}</strong></td><td>{{card.provider}}</td><td>{{card.description or '—'}}</td><td><span class="badge {% if card.active %}text-bg-success{% else %}text-bg-secondary{% endif %}">{{'aktywna' if card.active else 'wyłączona'}}</span></td></tr>{% else %}<tr><td colspan="4" class="text-center text-body-secondary py-4">Brak kart paliwowych.</td></tr>{% endfor %}</tbody></table></div>
|
||||
</div></div>
|
||||
|
||||
<div class="card"><div class="card-body d-flex flex-column flex-md-row justify-content-between align-items-md-center gap-3"><div><h2 class="h5 mb-1">Ulubione stacje firmy</h2><p class="text-body-secondary mb-0">Do 25 stacji. Pusta lista oznacza 10 największych sieci w Polsce.</p></div><button class="btn btn-secondary" data-bs-toggle="modal" data-bs-target="#companyFavoritesModal">Edytuj ulubione</button></div></div>
|
||||
|
||||
<div class="modal fade" id="companyFavoritesModal" tabindex="-1"><div class="modal-dialog modal-lg modal-dialog-scrollable"><div class="modal-content"><form action="/api/companies/{{selected_company.id}}/favorite-stations" data-method="PUT" class="ajax-form favorite-station-form" data-max-favorites="25"><div class="modal-header"><h2 class="modal-title fs-5">Ulubione stacje: {{selected_company.name}}</h2><button class="btn-close" data-bs-dismiss="modal"></button></div><div class="modal-body"><input class="form-control mb-3 station-modal-search" placeholder="Szukaj po nazwie sieci, firmy lub punktu"><div class="table-responsive"><table class="table table-hover align-middle"><thead><tr><th></th><th>Nazwa</th><th class="text-end">Punkty</th></tr></thead><tbody>{% for s in stations %}<tr data-station-name="{{(s.display_name ~ ' ' ~ s.company_name ~ ' ' ~ (s.station_name_list|join(' ')))|lower}}"><td><input class="form-check-input" type="checkbox" name="station_ids" value="{{s.id}}" {% if s in selected_company.favorite_stations %}checked{% endif %}></td><td><strong>{{s.display_name}}</strong>{% if s.company_name != s.display_name %}<div class="small text-body-secondary">{{s.company_name}}</div>{% endif %}</td><td class="text-end">{{s.station_count}}</td></tr>{% endfor %}</tbody></table></div></div><div class="modal-footer"><button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Anuluj</button><button class="btn btn-primary">Zapisz</button></div></form></div></div></div>
|
||||
{% else %}<div class="card"><div class="card-body text-center text-body-secondary py-5">Dodaj lub wybierz firmę.</div></div>{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if current_user.role == 'admin' %}<div class="modal fade" id="createCompanyModal" tabindex="-1"><div class="modal-dialog"><div class="modal-content"><form action="/api/companies" method="post" class="ajax-form"><div class="modal-header"><h2 class="modal-title fs-5">Dodaj firmę</h2><button class="btn-close" data-bs-dismiss="modal"></button></div><div class="modal-body"><div class="mb-3"><label class="form-label">Nazwa firmy</label><input class="form-control" name="name" required></div><div class="row g-3"><div class="col-md-6"><label class="form-label">Forma prawna</label><select class="form-select" name="entity_type"><option>JDG</option><option>Sp. z o.o.</option><option>Inna</option></select></div><div class="col-md-6"><label class="form-label">Województwo</label><select class="form-select" name="region">{% for r in regions %}<option value="{{r}}">{{r}}</option>{% endfor %}</select></div><div class="col-md-6"><label class="form-label">Stawka VAT (%)</label><input class="form-control" type="number" name="vat_rate" value="23" step="0.01"></div><div class="col-md-6"><label class="form-label">Odliczenie VAT (%)</label><input class="form-control" type="number" name="vat_deduction_percent" value="50" step="0.01"></div></div></div><div class="modal-footer"><button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Anuluj</button><button class="btn btn-primary">Dodaj firmę</button></div></form></div></div></div>{% endif %}
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,6 @@
|
||||
{% extends 'base.html' %}{% block title %}Użytkownicy{% endblock %}{% block content %}
|
||||
<h1 class="h2 mb-3">Administracja</h1>{% include '_admin_nav.html' %}
|
||||
<div class="card mb-4"><div class="card-body"><h2 class="h5">Dodaj użytkownika</h2><form action="/api/users" method="post" class="ajax-form row g-3"><div class="col-md-3"><input class="form-control" name="user_name" placeholder="Imię i nazwisko" required></div><div class="col-md-3"><input class="form-control" type="email" name="email" placeholder="E-mail" required></div><div class="col-md-2"><input class="form-control" type="password" name="password" minlength="8" placeholder="Hasło" required></div><div class="col-md-2"><select class="form-select" name="company_id">{% for c in companies %}<option value="{{c.id}}">{{c.name}}</option>{% endfor %}</select></div><div class="col-md-2"><select class="form-select" name="role"><option value="user">User</option><option value="boss">Szef</option>{% if current_user.role=='admin' %}<option value="admin">Admin</option>{% endif %}</select></div><div class="col-12"><button class="btn btn-primary">Dodaj użytkownika</button></div></form></div></div>
|
||||
<div class="card"><div class="card-body"><div class="d-flex justify-content-between gap-3 mb-3"><h2 class="h5 mb-0">Użytkownicy</h2><form class="d-flex ajax-nav-form" method="get"><input class="form-control" name="q" value="{{q}}" placeholder="Szukaj"><button class="btn btn-secondary ms-2">Szukaj</button></form></div><div class="table-responsive"><table class="table table-hover"><thead><tr><th>Nazwa</th><th>Firma</th><th>Rola</th><th>Karta</th><th></th></tr></thead><tbody>{% for u in users_page.items %}<tr><td>{{u.name}}<div class="small text-body-secondary">{{u.email}}</div></td><td>{{u.company.name if u.company else '—'}}</td><td>{{u.role}}</td><td>{{u.fuel_card.name if u.fuel_card else '—'}}</td><td class="text-end"><button class="btn btn-primary btn-sm user-edit-btn" data-bs-toggle="modal" data-bs-target="#userEditModal" data-id="{{u.id}}" data-name="{{u.name|e}}" data-email="{{u.email|e}}" data-role="{{u.role}}" data-active="{{1 if u.active else 0}}" data-card="{{u.fuel_card_id or ''}}" data-company="{{u.company_id or ''}}">Edytuj</button></td></tr>{% endfor %}</tbody></table></div></div></div>
|
||||
<div class="modal fade" id="userEditModal"><div class="modal-dialog"><div class="modal-content"><form id="user-edit-form" class="ajax-form" data-method="PUT"><div class="modal-header"><h2 class="modal-title fs-5">Edytuj użytkownika</h2><button class="btn-close" data-bs-dismiss="modal"></button></div><div class="modal-body row g-3"><div class="col-12"><label class="form-label">Nazwa</label><input class="form-control" name="name" required></div><div class="col-12"><label class="form-label">E-mail</label><input class="form-control" name="email" type="email" required></div><div class="col-md-6"><label class="form-label">Firma</label><select class="form-select" name="company_id">{% for c in companies %}<option value="{{c.id}}">{{c.name}}</option>{% endfor %}</select></div><div class="col-md-6"><label class="form-label">Rola</label><select class="form-select" name="role"><option value="user">User</option><option value="boss">Szef</option>{% if current_user.role=='admin' %}<option value="admin">Admin</option>{% endif %}</select></div><div class="col-12"><label class="form-label">Karta paliwowa</label><select class="form-select" name="fuel_card_id"><option value="">Brak</option>{% for card in fuel_cards %}<option value="{{card.id}}">{{card.name}}</option>{% endfor %}</select></div><div class="col-12"><label class="form-label">Nowe hasło</label><input class="form-control" type="password" name="password" minlength="8"></div><div class="col-12 form-check ms-2"><input class="form-check-input" type="checkbox" name="active" id="modal-active"><label class="form-check-label" for="modal-active">Aktywny</label></div></div><div class="modal-footer"><button class="btn btn-danger me-auto" id="user-delete-btn" type="button">Usuń użytkownika</button><button class="btn btn-secondary" data-bs-dismiss="modal" type="button">Anuluj</button><button class="btn btn-primary">Zapisz</button></div></form></div></div></div>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,33 @@
|
||||
<!doctype html>
|
||||
<html lang="pl" data-bs-theme="{{ app_theme.mode }}">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>{% block title %}FuelTrack{% endblock %}</title>
|
||||
<link id="bootstrap-theme" rel="stylesheet" href="{{ app_theme.url }}">
|
||||
<link rel="stylesheet" href="{{ asset_urls.choices_css }}">
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/layout.css') }}">
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/components.css') }}">
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/charts.css') }}">
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/choices.css') }}">
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg bg-body-tertiary border-bottom sticky-top"><div class="container"><a class="navbar-brand fw-bold text-body-emphasis" href="{{ url_for('main.dashboard') }}">FuelTrack</a>{% if current_user.is_authenticated %}<div class="d-flex gap-2 align-items-center flex-wrap"><a class="btn btn-sm btn-secondary" href="{{ url_for('main.dashboard') }}">Podsumowanie</a><a class="btn btn-sm btn-secondary" href="{{ url_for('main.fuel') }}">Tankowanie</a><a class="btn btn-sm btn-secondary" href="{{ url_for('main.vehicles') }}">Pojazdy</a><a class="btn btn-sm btn-secondary" href="{{ url_for('main.orlen_data') }}">Ceny Orlen</a>{% if current_user.role in ['boss','admin'] %}<a class="btn btn-sm btn-secondary" href="{{ url_for('main.stations') }}">Stacje</a><a class="btn btn-sm btn-secondary" href="{{ url_for('main.admin_companies') }}">Administracja</a>{% endif %}<a class="btn btn-sm btn-danger" href="/api/auth/logout" data-api-logout>Wyloguj</a></div>{% endif %}</div></nav>
|
||||
<main class="container py-4">{% with msgs=get_flashed_messages(with_categories=true) %}{% for cat,msg in msgs %}<div class="alert alert-{{cat}}">{{msg}}</div>{% endfor %}{% endwith %}{% block content %}{% endblock %}</main>
|
||||
<footer class="border-top mt-auto py-3"><div class="container d-flex justify-content-between align-items-center small text-body-secondary"><span>FuelTrack</span><a href="/docs" target="_blank" rel="noopener">API Docs</a></div></footer>
|
||||
<script src="{{ asset_urls.bootstrap_js }}"></script>
|
||||
<script src="{{ asset_urls.choices_js }}"></script>
|
||||
<script src="{{ asset_urls.chart_js }}"></script>
|
||||
<script src="{{ asset_urls.socket_io_js }}"></script>
|
||||
<script src="{{ url_for('static', filename='js/core.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='js/charts.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='js/ajax.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='js/stations.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='js/orlen.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='js/fuel.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='js/auth.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='js/users.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='js/socket.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='js/init.js') }}"></script>
|
||||
{% block scripts %}{% endblock %}
|
||||
</body></html>
|
||||
@@ -0,0 +1,6 @@
|
||||
{% extends 'base.html' %}{% block content %}
|
||||
<div class="d-flex justify-content-between align-items-center mb-3"><div><h1 class="h2 mb-0">Podsumowanie kosztów</h1><small class="text-body-secondary">{{ settings.name }} · VAT do odliczenia {{ settings.vat_deduction_percent }}%</small></div><form action="{{url_for('main.dashboard')}}" class="ajax-nav-form"><input class="form-control" type="month" name="month" value="{{month}}"></form></div>
|
||||
<div class="row g-3 mb-4"><div class="col-6 col-lg-3"><div class="card metric"><div class="card-body"><small>Brutto</small><strong>{{ '%.2f'|format(totals.gross) }} zł</strong></div></div></div><div class="col-6 col-lg-3"><div class="card metric"><div class="card-body"><small>VAT odliczony</small><strong>{{ '%.2f'|format(totals.deductible_vat) }} zł</strong></div></div></div><div class="col-6 col-lg-3"><div class="card metric"><div class="card-body"><small>Koszt po VAT</small><strong>{{ '%.2f'|format(totals.final_cost) }} zł</strong></div></div></div><div class="col-6 col-lg-3"><div class="card metric"><div class="card-body"><small>Litry</small><strong>{{ '%.2f'|format(totals.liters) }} l</strong></div></div></div></div>
|
||||
<div class="row g-4"><div class="col-lg-7"><div class="card"><div class="card-body"><h2 class="h5">Koszt według pojazdu</h2><p class="small text-body-secondary">Cena na dystrybutorze a kwota do zapłaty według cennika karty.</p><div class="chart-box"><canvas id="cost-chart"></canvas><div id="cost-chart-empty" class="chart-empty d-none">Brak danych dla wybranego miesiąca.</div></div></div></div></div><div class="col-lg-5"><div class="card h-100"><div class="card-body"><h2 class="h5">Okresy faktur</h2><small class="text-body-secondary">{% if split_enabled %}Podział według dnia {{settings.invoice_split_day}}{% else %}Podział dzienny wyłączony{% endif %}</small><table class="table mt-2"><thead><tr><th>Okres</th><th>Pozycje</th><th>Detal</th><th>Do zapłaty</th></tr></thead><tbody>{% for key,row in invoices.items() %}<tr><td>{{key}}</td><td>{{row.count}}</td><td>{{'%.2f'|format(row.gross)}} zł</td><td>{{'%.2f'|format(row.payable)}} zł</td></tr>{% else %}<tr><td colspan="4">Brak danych</td></tr>{% endfor %}</tbody></table></div></div></div></div>
|
||||
<div class="card mt-4"><div class="card-body"><h2 class="h5">Tankowania</h2><div class="table-responsive"><table class="table table-hover align-middle"><thead><tr><th>Data</th><th>Auto</th><th>Stacja</th><th>Paliwo</th><th>Litry</th><th>Cena detal.</th><th>Orlen last</th><th>Do zapłaty</th><th>Razem</th></tr></thead><tbody>{% for e in entries %}{% set s=settlements[e.id] %}<tr><td>{{e.fueled_at.strftime('%d.%m.%Y')}}</td><td>{{e.vehicle.name}}</td><td>{{e.station or '—'}}</td><td>{{e.fuel_type}}</td><td>{{e.liters}}</td><td>{{'%.4f'|format(s.normal_price)}} zł/l</td><td>{% if e.wholesale_price %}{{'%.4f'|format(e.wholesale_price|float)}} zł/l{% else %}—{% endif %}</td><td>{% if s.uses_last_price %}<span class="badge text-bg-info">last price</span> {% endif %}{{'%.4f'|format(s.payable_price)}} zł/l</td><td><span class="text-body-secondary text-decoration-line-through">{{'%.2f'|format(s.normal_gross)}} zł</span><br><strong>{{'%.2f'|format(s.payable_gross)}} zł</strong></td></tr>{% else %}<tr><td colspan="9">Brak tankowań w tym miesiącu.</td></tr>{% endfor %}</tbody></table></div></div></div>
|
||||
{% endblock %}{% block scripts %}<script>FuelTrack.renderBarChart('cost-chart', {{by_vehicle|tojson}});</script>{% endblock %}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{% extends 'base.html' %}{% block title %}Logowanie – FuelTrack{% endblock %}{% block content %}<div class="row justify-content-center"><div class="col-md-5 col-lg-4"><div class="card shadow-sm"><div class="card-body p-4"><h1 class="h3 mb-3">Logowanie</h1><form method="post" action="/api/auth/login" class="api-login-form" autocomplete="on"><label class="form-label">E-mail</label><input class="form-control mb-3" type="email" name="email" autocomplete="username" required><label class="form-label">Hasło</label><input class="form-control mb-3" type="password" name="password" autocomplete="current-password" required><button class="btn btn-primary w-100">Zaloguj</button></form></div></div></div></div>{% endblock %}
|
||||
@@ -0,0 +1,8 @@
|
||||
{% extends 'base.html' %}{% block title %}Ceny Orlen{% endblock %}{% block content %}
|
||||
<div class="mb-4"><h1 class="h2 mb-1">Dane cenowe Orlen</h1><p class="text-body-secondary mb-0">Porównuj kilka paliw na jednym wykresie i zapisuj dane w bazie.</p></div>
|
||||
<div class="card mb-4"><div class="card-body"><form method="get" id="orlen-filter-form" class="row g-3 align-items-end ajax-nav-form"><div class="col-lg-6"><label class="form-label d-block">Paliwa na wykresie</label><div class="d-flex flex-wrap gap-3">{% for f in fuel_types %}<label class="form-check"><input class="form-check-input" type="checkbox" name="fuel" value="{{f}}" {% if f in selected_fuels %}checked{% endif %}><span class="form-check-label">{{f}}</span></label>{% endfor %}</div></div><div class="col-lg-6"><label class="form-label d-block">Województwa LPG</label><button type="button" class="btn btn-secondary" data-bs-toggle="modal" data-bs-target="#lpgRegionsModal">Wybierz województwa</button> <span id="lpg-region-count" class="small text-body-secondary">{% if selected_regions %}{{selected_regions|length}} wybrano{% else %}Domyślne województwo{% endif %}</span></div><div class="col-md-2"><label class="form-label">Rok</label><input class="form-control" type="number" min="2020" max="2100" name="year" value="{{selected_year}}"></div><div class="col-md-2"><div class="form-check mb-2"><input class="form-check-input" type="checkbox" name="gross" value="1" id="gross-price" {% if include_vat %}checked{% endif %}><label class="form-check-label" for="gross-price">Dolicz VAT</label></div></div><div class="col-md-2"><button class="btn btn-secondary w-100">Pokaż</button></div></form>{% if current_user.role in ['boss','admin'] %}<div class="d-flex align-items-center gap-3 mt-3"><button type="button" id="orlen-sync-btn" class="btn btn-primary">Pobierz z API</button><span id="orlen-sync-status" class="small text-body-secondary" aria-live="polite"></span></div>{% endif %}</div></div>
|
||||
|
||||
<div class="modal fade lpg-region-modal" id="lpgRegionsModal" tabindex="-1" aria-hidden="true"><div class="modal-dialog modal-lg modal-dialog-centered"><div class="modal-content"><div class="modal-header"><h2 class="modal-title fs-5">Województwa LPG</h2><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div><div class="modal-body"><label class="form-label" for="lpg-region-select">Wybierz jedno lub wiele województw</label><select class="form-select" name="region" id="lpg-region-select" form="orlen-filter-form" multiple>{% for r in regions %}<option value="{{r}}" {% if r in selected_regions %}selected{% endif %}>{{r}}</option>{% endfor %}</select></div><div class="modal-footer"><button type="button" class="btn btn-primary" data-bs-dismiss="modal">Gotowe</button></div></div></div></div>
|
||||
<div class="card mb-4"><div class="card-body"><h2 class="h5">Trend ceny {% if include_vat %}brutto{% else %}netto{% endif %} za litr</h2><div class="chart-wrap"><canvas id="orlen-chart"></canvas><div id="orlen-chart-empty" class="chart-empty d-none">Brak danych dla wybranych filtrów.</div></div></div></div>
|
||||
<div class="card"><div class="card-body"><div class="table-responsive"><table class="table table-hover align-middle"><thead><tr><th>Data</th><th>Paliwo</th><th>Cena netto zł/l</th><th>Region</th><th>Pobrano</th></tr></thead><tbody>{% for r in rows|reverse %}<tr><td>{{r.effective_date}}</td><td>{{r.product_name}}</td><td>{{'%.4f'|format(r.price_per_liter|float)}}</td><td>{{r.region or '—'}}</td><td>{{r.fetched_at.strftime('%Y-%m-%d %H:%M')}}</td></tr>{% else %}<tr><td colspan="5" class="text-center text-body-secondary py-4">Brak danych w bazie.</td></tr>{% endfor %}</tbody></table></div></div></div>
|
||||
{% endblock %}{% block scripts %}<script>FuelTrack.renderMultiLineChart('orlen-chart', {{chart|tojson}}, {{include_vat|tojson}});FuelTrack.bindOrlenSync();</script>{% endblock %}
|
||||
@@ -0,0 +1,24 @@
|
||||
{% extends 'base.html' %}
|
||||
{% block title %}Stacje paliw{% endblock %}
|
||||
{% block content %}
|
||||
<div class="d-flex flex-column flex-lg-row justify-content-between gap-3 align-items-lg-end mb-4">
|
||||
<div><h1 class="h2 mb-1">Predefiniowane stacje paliw</h1><p class="text-body-secondary mb-0">Firmy agregowane z rejestru URE. Warunki rozliczeń ustawiasz osobno dla każdej karty paliwowej.</p></div>
|
||||
<form method="post" action="/api/stations/sync" class="ajax-form"><button class="btn btn-primary">Pobierz i agreguj z URE</button></form>
|
||||
</div>
|
||||
{% if companies|length > 1 %}
|
||||
<div class="card mb-3"><div class="card-body"><form method="get" action="{{ url_for('main.stations') }}" class="row g-2 align-items-end ajax-nav-form"><div class="col-md-6"><label class="form-label">Konfigurowana firma</label><select class="form-select" name="company_id" onchange="this.form.requestSubmit()">{% for item in companies %}<option value="{{ item.id }}" {% if item.id == company.id %}selected{% endif %}>{{ item.name }}</option>{% endfor %}</select></div><input type="hidden" name="q" value="{{ q }}"><input type="hidden" name="sort" value="{{ sort }}"><input type="hidden" name="direction" value="{{ direction }}"></form></div></div>
|
||||
{% endif %}
|
||||
<div class="card mb-4"><div class="card-body"><form method="get" action="{{url_for('main.stations')}}" class="row g-2 ajax-nav-form" id="station-search-form"><input type="hidden" name="company_id" value="{{ company.id }}"><div class="col-lg-6"><input class="form-control" name="q" value="{{q}}" placeholder="Szukaj po nazwie stacji lub firmy" autocomplete="off" data-live-search></div><div class="col-md-3"><select class="form-select" name="sort" data-live-sort><option value="company_name" {% if sort=='company_name' %}selected{% endif %}>Nazwa</option><option value="station_count" {% if sort=='station_count' %}selected{% endif %}>Liczba stacji</option><option value="nip" {% if sort=='nip' %}selected{% endif %}>NIP</option><option value="regon" {% if sort=='regon' %}selected{% endif %}>REGON</option><option value="selected_region" {% if sort=='selected_region' %}selected{% endif %}>Województwo</option></select></div><div class="col-md-2"><select class="form-select" name="direction" data-live-sort><option value="asc" {% if direction=='asc' %}selected{% endif %}>Rosnąco</option><option value="desc" {% if direction=='desc' %}selected{% endif %}>Malejąco</option></select></div><div class="col-md-1"><button class="btn btn-secondary w-100">Szukaj</button></div></form></div></div>
|
||||
<div class="card"><div class="card-body"><div class="table-responsive"><table class="table table-hover align-middle"><thead><tr><th><a class="link-body-emphasis ajax-nav-link" href="{{url_for('main.stations',company_id=company.id,q=q,sort='company_name',direction='desc' if sort=='company_name' and direction=='asc' else 'asc')}}">Stacja / firma</a></th><th><a class="link-body-emphasis ajax-nav-link" href="{{url_for('main.stations',company_id=company.id,q=q,sort='station_count',direction='asc' if sort=='station_count' and direction=='desc' else 'desc')}}">Punkty</a></th><th>Paliwa</th><th>Ustawienia</th><th>Warunki kart</th></tr></thead><tbody>
|
||||
{% for s in station_page.items %}<tr>
|
||||
<td>{% if s.station_count > 1 %}<button type="button" class="btn btn-link link-body-emphasis fw-semibold p-0 text-start station-points-open" data-station-id="{{s.id}}" data-station-name="{{s.display_name}}">{{s.display_name}}</button>{% else %}<strong>{{s.display_name}}</strong>{% endif %}{% if s.company_name != s.display_name %}<div class="small text-body-secondary">{{s.company_name}}</div>{% endif %}<div class="small text-body-secondary">NIP: {{s.nip or '—'}} · REGON: {{s.regon or '—'}}</div></td>
|
||||
<td>{{s.station_count}}</td>
|
||||
<td><div class="d-flex gap-1 flex-wrap">{% if s.has_petrol %}<span class="badge text-bg-secondary">benzyna</span>{% endif %}{% if s.has_diesel %}<span class="badge text-bg-secondary">diesel</span>{% endif %}{% if s.has_lpg %}<span class="badge text-bg-secondary">LPG</span>{% endif %}</div></td>
|
||||
<td><form method="post" action="/api/stations/{{s.id}}" data-method="PUT" class="ajax-form row g-2">{% if current_user.role == 'admin' %}<div class="col-12"><label class="form-label small mb-1">Firma</label><select class="form-select form-select-sm station-inline-company-select" name="company_id" data-station-context="1">{% for item in companies %}<option value="{{item.id}}" {% if item.id == company.id %}selected{% endif %}>{{item.name}}</option>{% endfor %}</select></div>{% else %}<input type="hidden" name="company_id" value="{{ company.id }}">{% endif %}<div class="col-12"><label class="form-label small mb-1">Województwo LPG</label><select class="form-select form-select-sm" name="selected_region"><option value="">Domyślne województwo firmy</option>{% for region in s.region_list %}<option value="{{region}}" {% if s.selected_region==region %}selected{% endif %}>{{region}}</option>{% endfor %}</select></div><div class="col-12"><div class="form-check"><input class="form-check-input" type="checkbox" name="active" id="active-{{s.id}}" {% if s.active %}checked{% endif %}><label class="form-check-label" for="active-{{s.id}}">Pokazuj w propozycjach</label></div><div class="form-check"><input class="form-check-input" type="checkbox" name="allowed" id="allowed-{{s.id}}" {% if s.id in allowed_ids %}checked{% endif %}><label class="form-check-label" for="allowed-{{s.id}}">Dozwolona dla firmy</label></div></div><div class="col-12 d-flex gap-2"><button class="btn btn-primary btn-sm">Zapisz</button><button type="button" class="btn btn-secondary btn-sm station-favorite-toggle" data-url="/api/companies/{{company.id}}/favorite-stations/{{s.id}}/toggle">{% if s.id in favorite_ids %}Usuń z ulubionych{% else %}Dodaj do ulubionych{% endif %}</button></div></form></td>
|
||||
<td>{% for card in fuel_cards %}{% set rule=card_rules.get((card.id,s.id)) %}<form action="/api/fuel-cards/{{card.id}}/stations/{{s.id}}" data-method="PUT" class="ajax-form border rounded p-2 mb-2"><div class="fw-semibold small mb-2">{{card.name}}</div><div class="row g-2"><div class="col-12"><div class="form-check"><input class="form-check-input" type="checkbox" name="allowed" id="rule-allowed-{{card.id}}-{{s.id}}" {% if not rule or rule.allowed %}checked{% endif %}><label class="form-check-label" for="rule-allowed-{{card.id}}-{{s.id}}">Dozwolona dla karty</label></div><div class="form-check"><input class="form-check-input" type="checkbox" name="use_orlen_last_price" id="rule-last-{{card.id}}-{{s.id}}" {% if rule and rule.use_orlen_last_price %}checked{% endif %}><label class="form-check-label" for="rule-last-{{card.id}}-{{s.id}}">Orlen last price</label></div></div><div class="col-6"><label class="form-label small">Rabat netto %</label><input class="form-control form-control-sm" type="number" step="0.001" name="discount_net_percent" value="{{rule.discount_net_percent if rule else 0}}"></div><div class="col-6"><label class="form-label small">Dopłata netto/l</label><input class="form-control form-control-sm" type="number" step="0.0001" name="surcharge_net_per_liter" value="{{rule.surcharge_net_per_liter if rule else 0}}"></div><div class="col-12"><button class="btn btn-primary btn-sm">Zapisz warunki</button></div></div></form>{% else %}<span class="text-body-secondary small">Najpierw dodaj kartę w ustawieniach firmy.</span>{% endfor %}</td>
|
||||
</tr>{% else %}<tr><td colspan="5" class="text-center text-body-secondary py-5">Brak firm. Pobierz katalog z URE.</td></tr>{% endfor %}
|
||||
</tbody></table></div>
|
||||
{% if station_page.pages > 1 %}<nav><ul class="pagination mb-0">{% for p in station_page.iter_pages() %}{% if p %}<li class="page-item {% if p==station_page.page %}active{% endif %}"><a class="page-link ajax-nav-link" href="{{url_for('main.stations',company_id=company.id,page=p,q=q,sort=sort,direction=direction)}}">{{p}}</a></li>{% else %}<li class="page-item disabled"><span class="page-link">…</span></li>{% endif %}{% endfor %}</ul></nav>{% endif %}
|
||||
</div></div>
|
||||
<div class="modal fade" id="stationPointsModal" tabindex="-1" aria-hidden="true"><div class="modal-dialog modal-xl modal-dialog-scrollable"><div class="modal-content"><div class="modal-header"><div><h2 class="modal-title fs-5" id="stationPointsTitle">Punkty stacji</h2><div class="small text-body-secondary" id="stationPointsCount"></div></div><button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Zamknij"></button></div><div class="modal-body"><div class="input-group mb-3"><span class="input-group-text">Szukaj</span><input class="form-control" id="stationPointsSearch" placeholder="Nazwa, ulica, miejscowość lub kod pocztowy"></div><div id="stationPointsLoading" class="text-center py-5 d-none"><div class="spinner-border" role="status"></div></div><div class="table-responsive"><table class="table table-hover align-middle mb-0"><thead><tr><th>Nazwa punktu</th><th>Adres</th><th>Województwo</th><th>Paliwa</th></tr></thead><tbody id="stationPointsRows"></tbody></table></div><div id="stationPointsEmpty" class="text-center text-body-secondary py-5 d-none">Brak punktów do wyświetlenia. Wykonaj ponowny import z URE.</div></div></div></div></div>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,19 @@
|
||||
{% extends 'base.html' %}{% block content %}
|
||||
<h1 class="h2 mb-3">Pojazdy</h1>
|
||||
<div class="row g-4">
|
||||
<div class="col-lg-5"><div class="card"><div class="card-body"><h2 class="h5">Dodaj pojazd</h2>
|
||||
<form method="post" action="/api/vehicles" class="ajax-form row g-3">
|
||||
<div class="col-12"><input class="form-control" name="name" placeholder="Nazwa, np. Auto handlowca" required></div>
|
||||
<div class="col-6"><input class="form-control" name="make" placeholder="Marka" required></div><div class="col-6"><input class="form-control" name="model" placeholder="Model" required></div>
|
||||
<div class="col-6"><input class="form-control" name="registration" placeholder="Rejestracja" required></div><div class="col-6"><select class="form-select" name="fuel_type"><option>PB95</option><option>PB98</option><option>DIESEL</option><option>LPG</option></select></div>
|
||||
<div class="col-6"><input class="form-control" type="number" name="current_odometer" placeholder="Licznik"></div>{% if current_user.role in ['boss','admin'] %}<div class="col-12"><label class="form-label">Właściciel / użytkownik pojazdu</label><select class="form-select" name="owner_id">{% for u in assignable_users %}<option value="{{u.id}}" {% if u.id==current_user.id %}selected{% endif %}>{{u.name}} · {{u.company.name if u.company else 'bez firmy'}}</option>{% endfor %}</select></div>{% endif %}<div class="col-6"><select class="form-select" name="fuel_card_id"><option value="">Bez przypisanej karty</option>{% for card in fuel_cards %}<option value="{{card.id}}">{{card.name}} · {{card.provider}}</option>{% endfor %}</select></div>
|
||||
<div class="col-12"><button class="btn btn-primary">Dodaj</button></div></form></div></div></div>
|
||||
<div class="col-lg-7">
|
||||
{% for v in vehicles %}<div class="card mb-3"><div class="card-body">
|
||||
<div class="d-flex flex-wrap justify-content-between align-items-start gap-2"><div><h2 class="h5 mb-1">{{v.name}}</h2><div>{{v.make}} {{v.model}} · {{v.registration}}</div><small class="text-body-secondary">{{v.fuel_type}} · {{v.current_odometer}} km{% if v.fuel_card %} · karta {{v.fuel_card.name}}{% endif %}</small></div><span class="badge text-bg-secondary flex-shrink-0">Właściciel: {{v.owner.name}}</span></div>
|
||||
{% if current_user.role in ['boss','admin'] or v.owner_id==current_user.id %}
|
||||
<div class="mt-3"><h3 class="h6">Udostępnienia</h3><div class="d-flex flex-wrap gap-2 mb-2">{% for driver in v.drivers %}<form method="post" action="/api/vehicles/{{v.id}}/shares/{{driver.id}}" data-method="DELETE" class="ajax-form"><button class="btn btn-sm btn-secondary" title="Odbierz dostęp">{{driver.name}} ×</button></form>{% else %}<span class="text-body-secondary small">Nikomu nie udostępniono.</span>{% endfor %}</div>
|
||||
<form method="post" action="/api/vehicles/{{v.id}}/shares" class="input-group ajax-form"><input class="form-control" type="email" name="email" placeholder="E-mail użytkownika" required><button class="btn btn-secondary">Udostępnij</button></form></div><form action="/api/vehicles/{{v.id}}/fuel-card" data-method="PUT" class="ajax-form row g-2 mt-2"><div class="col-md-8"><label class="form-label">Karta paliwowa pojazdu</label><select class="form-select" name="fuel_card_id"><option value="">Brak</option>{% for card in fuel_cards %}<option value="{{card.id}}" {% if v.fuel_card_id==card.id %}selected{% endif %}>{{card.name}} · {{card.provider}}</option>{% endfor %}</select></div><div class="col-md-4 d-flex align-items-end"><button class="btn btn-primary w-100">Zapisz kartę</button></div></form>
|
||||
|
||||
{% endif %}</div></div>{% else %}<div class="alert alert-info">Brak pojazdów.</div>{% endfor %}</div></div>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user