Zmiana aplikacji na wersje lang

This commit is contained in:
2026-09-25 16:59:37 +02:00
parent 9d25de0d89
commit 3056eb6c3d
24 changed files with 1308 additions and 1105 deletions
+89 -118
View File
@@ -6,10 +6,19 @@ header('Expires: 0');
require_once __DIR__ . '/includes/asset_version.php';
require_once __DIR__ . '/../api/request_ip.php';
$menuConfig = require __DIR__ . '/../config/menu.php';
$publicDir = __DIR__;
$vCss = publicAssetVersion($publicDir, 'assets/css/app.css');
$vJs = publicJsBundleVersion($publicDir, 'assets/js/app.js');
$vMenu = publicAssetVersion($publicDir, 'menu.json');
$languagesForClient = [];
foreach (($menuConfig['languages'] ?? []) as $code => $meta) {
$languagesForClient[] = [
'code' => (string) $code,
'label' => (string) ($meta['label'] ?? strtoupper((string) $code)),
'flag' => (string) ($meta['flag'] ?? '🏳️'),
];
}
?><!doctype html>
<html lang="pl">
@@ -26,7 +35,7 @@ $vMenu = publicAssetVersion($publicDir, 'menu.json');
href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;600;700&family=Playfair+Display:wght@700&display=swap"
rel="stylesheet">
<link rel="stylesheet" href="assets/css/app.css?v=<?= assetVersionAttr($vCss) ?>">
</head>
</head>
<body>
@@ -34,42 +43,45 @@ $vMenu = publicAssetVersion($publicDir, 'menu.json');
<div class="loader-icon"></div>
<div class="loader-text">
<h2>Karczma Biesiada</h2>
<div class="loader-msg" id="loaderMsg">Łączenie z kuchnią...</div>
<div class="loader-msg" id="loaderMsg" data-i18n="loader.connecting">Łączenie z kuchnią...</div>
</div>
</div>
<div id="geoScreen" class="hidden">
<div class="geo-shell">
<div class="geo-lang-row">
<div id="geoLangPickerMount"></div>
</div>
<div class="geo-icon">📍</div>
<h2 class="geo-title">Witamy w Karcznie</h2>
<p class="geo-lead" id="geoLead">
<h2 class="geo-title" data-i18n="geo.title">Witamy w Karcznie</h2>
<p class="geo-lead" id="geoLead" data-i18n="geo.lead">
Przeglądaj menu od razu — albo potwierdź, że jesteś u nas, aby wezwać kelnera, śledzić zamówienie i poprosić o rachunek.
</p>
<p class="geo-status" id="geoMsg"></p>
<div class="geo-actions" id="geoActions">
<button type="button" id="geoMenuOnlyBtn" class="geo-btn geo-btn-menu">
<span class="geo-btn-main">Przejdź do menu</span>
<span class="geo-btn-sub">bez lokalizacji</span>
<span class="geo-btn-main" data-i18n="geo.btn.menu_main">Przejdź do menu</span>
<span class="geo-btn-sub" data-i18n="geo.btn.menu_sub">bez lokalizacji</span>
</button>
<button type="button" id="geoActionBtn" class="geo-btn geo-btn-locate btn btn-primary">
<span class="geo-btn-main">Zgoda, sprawdź lokalizację</span>
<span class="geo-btn-main" data-i18n="geo.btn.locate">Zgoda, sprawdź lokalizację</span>
</button>
</div>
<div class="geo-instructions hidden" id="geoInstructions" aria-live="polite"></div>
<div class="geo-wifi-callout">
<p class="geo-wifi-callout-title">📶 Wejdź bez zgody na lokalizację</p>
<p>Połącz telefon z siecią Wi‑Fi restauracji:</p>
<p class="geo-wifi-callout-title" data-i18n="geo.wifi.title">📶 Wejdź bez zgody na lokalizację</p>
<p data-i18n="geo.wifi.connect">Połącz telefon z siecią Wi‑Fi restauracji:</p>
<p class="geo-wifi-network"><strong>HotSpot Karczmy</strong></p>
<p class="geo-wifi-password">Hasło: <strong>karczmabiesiada</strong></p>
<p>Po połączeniu <strong>odśwież stronę</strong> (lub zamknij i otwórz ponownie kod QR). Aplikacja wpuści Cię <strong>bez pytania o lokalizację</strong> — z pełnym dostępem do:</p>
<p data-i18n="geo.wifi.after" data-i18n-html>Po połączeniu <strong>odśwież stronę</strong> (lub zamknij i otwórz ponownie kod QR). Aplikacja wpuści Cię <strong>bez pytania o lokalizację</strong> — z pełnym dostępem do:</p>
<ul class="geo-wifi-list">
<li>wezwania kelnera</li>
<li>prośby o rachunek</li>
<li>statusu zamówienia</li>
<li>całej aplikacji przy stoliku</li>
<li data-i18n="geo.wifi.li1">wezwania kelnera</li>
<li data-i18n="geo.wifi.li2">prośby o rachunek</li>
<li data-i18n="geo.wifi.li3">statusu zamówienia</li>
<li data-i18n="geo.wifi.li4">całej aplikacji przy stoliku</li>
</ul>
</div>
</div>
@@ -77,12 +89,12 @@ $vMenu = publicAssetVersion($publicDir, 'menu.json');
<div class="container">
<header id="mainHeader">
<h1 class="logo-text">Karczma Biesiada</h1>
<div id="tableLabel" class="table-badge">Wybierz stolik</div>
<div class="header-top">
<h1 class="logo-text">Karczma Biesiada</h1>
<div id="headerLangPickerMount"></div>
</div>
<div id="tableLabel" class="table-badge" data-i18n="table.choose">Wybierz stolik</div>
</header>
<!-- <div id="greetingBanner"
style="display:none; text-align:center; padding: 10px; font-weight:600; color:var(--primary); font-family:'Playfair Display', serif; font-size:18px;">
</div> -->
<main id="mainContent">
<div id="statusView" class="view-section active">
@@ -90,8 +102,8 @@ $vMenu = publicAssetVersion($publicDir, 'menu.json');
<section class="status-card">
<div class="status-header">
<div>
<span class="status-title">Aktualny status</span>
<div id="prepStatus" class="status-value">Oczekiwanie...</div>
<span class="status-title" data-i18n="status.title">Aktualny status</span>
<div id="prepStatus" class="status-value" data-i18n="status.waiting">Oczekiwanie...</div>
</div>
<div id="statusIcon" style="font-size: 28px;">⏳</div>
</div>
@@ -100,61 +112,51 @@ $vMenu = publicAssetVersion($publicDir, 'menu.json');
<div id="progressBar" class="progress-bar"></div>
</div>
<div id="statusMeta" style="font-size: 12px; color: var(--text-muted);">
<div id="statusMeta" style="font-size: 12px; color: var(--text-muted);" data-i18n="status.checking">
Sprawdzamy co pysznego się przygotowuje...
</div>
</section>
<section class="items-container" id="ordersContainer">
<h3 id="ordersTitle">Twoje zamówione dania</h3>
<h3 id="ordersTitle" data-i18n="orders.title">Twoje zamówione dania</h3>
<div id="emptyState" class="empty-state hidden">
<div class="empty-icon">📖</div>
<p style="color: var(--text-muted)">Jeśli właśnie złożyłeś zamówienie, daj nam chwilkę na jego
<p style="color: var(--text-muted)" data-i18n="orders.empty">Jeśli właśnie złożyłeś zamówienie, daj nam chwilkę na jego
przetworzenie.</p>
<button class="btn btn-primary" style="margin-top: 15px; padding: 12px 20px; font-size: 15px;"
onclick="switchTab('menu')">Przeglądaj menu</button>
onclick="switchTab('menu')" data-i18n="orders.browse_menu">Przeglądaj menu</button>
</div>
<div id="itemsList"></div>
</section>
<section id="historySection" class="items-container history-section hidden">
<h3>Twoje poprzednie zamówienia</h3>
<p class="history-note">To są pozycje z innych wizyt, które były widoczne na tym telefonie po zeskanowaniu
<h3 data-i18n="history.title">Twoje poprzednie zamówienia</h3>
<p class="history-note" data-i18n="history.note">To są pozycje z innych wizyt, które były widoczne na tym telefonie po zeskanowaniu
kodów QR. Jeśli kiedyś byłeś w restauracji bez skanowania kodu, tych pozycji tu nie będzie 🙂</p>
<div id="historyList"></div>
<div style="text-align: center; margin-top: 15px;">
<a href="#" onclick="clearGlobalHistory(event)"
style="font-size: 12px; color: var(--text-muted); text-decoration: underline;">Usuń historię</a>
style="font-size: 12px; color: var(--text-muted); text-decoration: underline;" data-i18n="history.clear">Usuń historię</a>
</div>
</section>
<div id="metaFooter" class="meta-footer"></div>
</div> <!-- Koniec statusView -->
</div>
<div id="menuView" class="view-section hidden">
<div id="menuOnlyBanner" class="menu-only-banner is-hidden">
<span>Potwierdź lokalizację, aby wezwać kelnera lub poprosić o rachunek.</span>
<button type="button" class="menu-only-banner-btn" onclick="promptGeoForFullAccess()">Sprawdź teraz</button>
<span data-i18n="menu.banner">Potwierdź lokalizację, aby wezwać kelnera lub poprosić o rachunek.</span>
<button type="button" class="menu-only-banner-btn" onclick="promptGeoForFullAccess()" data-i18n="menu.banner_btn">Sprawdź teraz</button>
</div>
<div class="menu-search-container">
<input type="text" id="menuSearchInput" placeholder="Szukaj dania..." oninput="filterMenu()" />
<input type="text" id="menuSearchInput" data-i18n-placeholder="menu.search" placeholder="Szukaj dania..." oninput="filterMenu()" />
<div id="menuLangPickerMount"></div>
</div>
<div class="restaurant-menu-container">
<nav class="menu-categories-nav">
<ul>
<li><a href="#" class="active" data-category-badge="0" onclick="showCategory(0)">Wszystko</a></li>
<li><a href="#" onclick="showCategory(1)" data-category-badge="1">Przystawki</a></li>
<li><a href="#" onclick="showCategory(2)" data-category-badge="2">Zupy</a></li>
<li><a href="#" onclick="showCategory(3)" data-category-badge="3">Dania główne</a></li>
<li><a href="#" onclick="showCategory(4)" data-category-badge="4">Dania swojskie</a></li>
<li><a href="#" onclick="showCategory(5)" data-category-badge="5">Ryby</a></li>
<li><a href="#" onclick="showCategory(7)" data-category-badge="7">Sałatki</a></li>
<li><a href="#" onclick="showCategory(6)" data-category-badge="6">Makarony</a></li>
<li><a href="#" onclick="showCategory(9)" data-category-badge="9">Dla dzieci</a></li>
<li><a href="#" onclick="showCategory(8)" data-category-badge="8">Dodatki</a></li>
<li><a href="#" onclick="showCategory(10)" data-category-badge="10">Desery</a></li>
<li><a href="#" onclick="showCategory(11)" data-category-badge="11">Napoje</a></li>
<!-- Dynamic categories -->
</ul>
</nav>
@@ -162,7 +164,7 @@ $vMenu = publicAssetVersion($publicDir, 'menu.json');
<!-- Dynamiczne menu załaduje się tutaj -->
</div>
</div>
</div> <!-- Koniec menuView -->
</div>
</main>
@@ -174,69 +176,45 @@ $vMenu = publicAssetVersion($publicDir, 'menu.json');
</footer>
</div>
<!-- Bottom Navigation Bar -->
<nav class="bottom-nav" id="bottomNav" style="display: none;">
<div class="nav-item active" onclick="switchTab('status')" id="navStatus">
<span class="nav-icon">🍽️</span>
<span class="nav-label">Zamówienie</span>
<span class="nav-label" data-i18n="nav.order">Zamówienie</span>
</div>
<div class="nav-item" onclick="switchTab('menu')" id="navMenu">
<span class="nav-icon">📖</span>
<span class="nav-label">Menu</span>
<span class="nav-label" data-i18n="nav.menu">Menu</span>
</div>
<div class="nav-item action-call" onclick="openWaiterDialog()" id="navWaiter">
<span class="nav-icon">🛎️</span>
<span class="nav-label">Kelner</span>
<span class="nav-label" data-i18n="nav.waiter">Kelner</span>
</div>
<div class="nav-item action-bill" onclick="openBillDialog()" id="navBill">
<span class="nav-icon">💳</span>
<span class="nav-label">Rachunek</span>
<span class="nav-label" data-i18n="nav.bill">Rachunek</span>
</div>
</nav>
<!-- WAITER DIALOG -->
<div class="modal-overlay" id="waiterModal">
<div class="modal-content" style="text-align: center;">
<div style="font-size: 48px; margin-bottom: 15px;">🛎️</div>
<h3 style="margin-top: 0; color: var(--text-main); font-family: 'Playfair Display', serif; font-size: 24px;">
<h3 style="margin-top: 0; color: var(--text-main); font-family: 'Playfair Display', serif; font-size: 24px;" data-i18n="waiter.title">
Przywołać obsługę?</h3>
<p style="color: var(--text-muted); font-size: 15px; margin-bottom: 25px; line-height: 1.5;">
<p style="color: var(--text-muted); font-size: 15px; margin-bottom: 25px; line-height: 1.5;" data-i18n="waiter.body">
Kelner otrzyma natychmiastowe powiadomienie na swoim panelu i podejdzie do Twojego stolika najszybciej jak to
możliwe.
</p>
<div style="display: flex; gap: 12px; flex-direction: column;">
<button class="btn btn-primary" onclick="confirmCallWaiter()" style="padding: 14px; font-size: 16px;">Tak,
<button class="btn btn-primary" onclick="confirmCallWaiter()" style="padding: 14px; font-size: 16px;" data-i18n="waiter.confirm">Tak,
poproś kelnera</button>
<button class="btn btn-secondary" onclick="closeWaiterDialog()" style="padding: 14px;">Anuluj</button>
<button class="btn btn-secondary" onclick="closeWaiterDialog()" style="padding: 14px;" data-i18n="waiter.cancel">Anuluj</button>
</div>
</div>
</div>
<!-- NAME DIALOG (Tymczasowo wyłączone)
<div class="modal-overlay" id="nameModal">
<div class="modal-content" style="text-align: center;">
<div style="font-size: 48px; margin-bottom: 15px;">👋</div>
<h3 style="margin-top: 0; color: var(--text-main); font-family: 'Playfair Display', serif; font-size: 24px;">Podaj
swoje imię</h3>
<p style="color: var(--text-muted); font-size: 15px; margin-bottom: 20px; line-height: 1.5;">
Dzięki temu będziemy mogli powitać Cię osobiście podczas Twojej wizyty!
</p>
<div class="input-group" style="margin-bottom: 25px; text-align: left;">
<input type="text" id="userNameInput" class="input-field" placeholder="Twoje imię..." autocomplete="off" />
</div>
<div style="display: flex; gap: 12px; flex-direction: column;">
<button class="btn btn-primary" onclick="saveUserName()" style="padding: 14px; font-size: 16px;">Idę
dalej</button>
<button class="btn btn-secondary" onclick="declineUserName()" style="padding: 14px;">Nie chcę podawać</button>
</div>
</div>
</div>
-->
<!-- ITEM MODAL -->
<div class="modal-overlay" id="itemModal">
<div class="modal-content item-modal-content" id="itemModalContent">
<button type="button" class="close-btn item-modal-close" onclick="closeItemModal()" aria-label="Zamknij">&times;</button>
<button type="button" class="close-btn item-modal-close" onclick="closeItemModal()" data-i18n-aria="menu.close" aria-label="Zamknij">&times;</button>
<div class="item-modal-pane" id="itemModalPane">
<div class="item-modal-image-wrap">
<img id="itemModalImage" class="item-modal-image" src="" alt="">
@@ -245,7 +223,7 @@ $vMenu = publicAssetVersion($publicDir, 'menu.json');
<path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"/>
<circle cx="12" cy="13" r="4"/>
</svg>
<span>Brak zdjęcia</span>
<span data-i18n="menu.no_image">Brak zdjęcia</span>
</div>
</div>
<div class="item-modal-body">
@@ -255,120 +233,113 @@ $vMenu = publicAssetVersion($publicDir, 'menu.json');
<h3 id="itemModalTitle" class="item-modal-title"></h3>
<div id="itemModalPrice" class="item-modal-price"></div>
<p id="itemModalDesc" class="item-modal-desc"></p>
<button type="button" class="btn btn-secondary item-modal-close-btn" onclick="closeItemModal()">Zamknij</button>
<button type="button" class="btn btn-secondary item-modal-close-btn" onclick="closeItemModal()" data-i18n="menu.close">Zamknij</button>
</div>
</div>
</div>
</div>
<!-- BILL DIALOG -->
<div class="modal-overlay" id="billModal">
<div class="modal-content">
<div class="modal-header">
<h3 id="modalTitle">Rozliczenie</h3>
<h3 id="modalTitle" data-i18n="bill.title">Rozliczenie</h3>
<button class="close-btn" onclick="closeBillDialog()">&times;</button>
</div>
<!-- Step 0: Loading or List of Bills -->
<div class="step active" id="stepBillList">
<div id="billLoading" style="text-align:center; padding: 20px;">
<div id="billLoading" style="text-align:center; padding: 20px;" data-i18n="bill.loading">
⏳ Pobieranie rachunków...
</div>
<div id="billListContainer" class="hidden">
<p style="margin-top:0; color:var(--text-muted); font-size:14px; margin-bottom: 20px;">Mamy kilka otwartych
<p style="margin-top:0; color:var(--text-muted); font-size:14px; margin-bottom: 20px;" data-i18n="bill.multi">Mamy kilka otwartych
rachunków na tym stoliku. Który chcesz opłacić?</p>
<div id="billListItems" style="display:flex; flex-direction:column; gap:10px;"></div>
</div>
</div>
<!-- Step 0.5: Bill Review -->
<div class="step" id="stepBillReview">
<p style="margin-top:0; color:var(--text-muted); font-size:14px; margin-bottom: 20px;">Podsumowanie rachunku:
<p style="margin-top:0; color:var(--text-muted); font-size:14px; margin-bottom: 20px;" data-i18n="bill.review">Podsumowanie rachunku:
</p>
<div id="billReviewContent"
style="background: var(--surface-light); padding: 15px; border-radius: 12px; max-height: 40vh; overflow-y: auto; margin-bottom: 15px;">
</div>
<div style="display:flex; justify-content:space-between; font-weight:700; font-size:18px; margin-bottom: 20px;">
<span>Do zapłaty:</span>
<span data-i18n="bill.total">Do zapłaty:</span>
<span id="billTotalAmount" style="color:var(--primary);">0.00 PLN</span>
</div>
<div style="display:flex; gap:12px;">
<button class="btn btn-secondary" style="flex:1;" onclick="goBackToBillList()"
id="btnBackToBills">Wróć</button>
<button class="btn btn-primary" style="flex:2;" onclick="proceedToBillPayment()">Poproś rachunek</button>
id="btnBackToBills" data-i18n="bill.back">Wróć</button>
<button class="btn btn-primary" style="flex:2;" onclick="proceedToBillPayment()" data-i18n="bill.request">Poproś rachunek</button>
</div>
</div>
<!-- Step 1: Payment Method -->
<div class="step" id="stepPayment">
<p style="margin-top:0; color:var(--text-muted); font-size:14px; margin-bottom: 20px;">Wybierz preferowaną formę
<p style="margin-top:0; color:var(--text-muted); font-size:14px; margin-bottom: 20px;" data-i18n="bill.payment">Wybierz preferowaną formę
płatności:</p>
<div class="option-grid">
<div class="option-card" onclick="selectPayment('karta')">
<span class="option-icon">💳</span>
<span class="option-label">Karta</span>
<span class="option-label" data-i18n="bill.card">Karta</span>
</div>
<div class="option-card" onclick="selectPayment('gotówka')">
<span class="option-icon">💵</span>
<span class="option-label">Gotówka</span>
<span class="option-label" data-i18n="bill.cash">Gotówka</span>
</div>
</div>
<button class="btn btn-secondary" onclick="goToStep('stepBillReview')" style="margin-top: 15px;">Wróć do
<button class="btn btn-secondary" onclick="goToStep('stepBillReview')" style="margin-top: 15px;" data-i18n="bill.back_summary">Wróć do
podsumowania</button>
</div>
<!-- Step 2: Document Type -->
<div class="step" id="stepDocument">
<p style="margin-top:0; color:var(--text-muted); font-size:14px; margin-bottom: 20px;">Jakiego dokumentu
<p style="margin-top:0; color:var(--text-muted); font-size:14px; margin-bottom: 20px;" data-i18n="bill.doc">Jakiego dokumentu
potrzebujesz?</p>
<div class="option-grid">
<div class="option-card" onclick="selectDocument('paragon')">
<span class="option-icon">🧾</span>
<span class="option-label">Paragon</span>
<span class="option-label" data-i18n="bill.receipt">Paragon</span>
</div>
<div class="option-card" onclick="selectDocument('faktura')">
<span class="option-icon">📄</span>
<span class="option-label">Faktura</span>
<span class="option-label" data-i18n="bill.invoice">Faktura</span>
</div>
</div>
<button class="btn btn-secondary" onclick="goToStep('stepPayment')" style="margin-top: 8px;">Wróć</button>
<button class="btn btn-secondary" onclick="goToStep('stepPayment')" style="margin-top: 8px;" data-i18n="bill.back">Wróć</button>
</div>
<!-- Step 3: NIP Input -->
<div class="step" id="stepNIP">
<p style="margin-top:0; color:var(--text-muted); font-size:14px; margin-bottom: 20px;">Wprowadź NIP firmy,
<p style="margin-top:0; color:var(--text-muted); font-size:14px; margin-bottom: 20px;" data-i18n="bill.nip_intro">Wprowadź NIP firmy,
abyśmy mogli automatycznie pobrać dane.</p>
<div class="input-group">
<label class="input-label">Numer NIP</label>
<label class="input-label" data-i18n="bill.nip_label">Numer NIP</label>
<input type="number" id="nipInput" class="input-field" placeholder="np. 1234567890" autocomplete="off" />
</div>
<div style="display:flex; gap:12px; margin-top: 24px;">
<button class="btn btn-secondary" style="flex:1;" onclick="goToStep('stepDocument')">Wróć</button>
<button class="btn btn-primary" style="flex:2;" onclick="fetchGUS()" id="btnGUS">Pobierz z GUS</button>
<button class="btn btn-secondary" style="flex:1;" onclick="goToStep('stepDocument')" data-i18n="bill.back">Wróć</button>
<button class="btn btn-primary" style="flex:2;" onclick="fetchGUS()" id="btnGUS" data-i18n="bill.gus">Pobierz z GUS</button>
</div>
</div>
<!-- Step 4: Verify Data -->
<div class="step" id="stepVerify">
<p style="margin-top:0; color:var(--text-muted); font-size:14px; margin-bottom: 20px;">Czy poniższe dane do
<p style="margin-top:0; color:var(--text-muted); font-size:14px; margin-bottom: 20px;" data-i18n="bill.verify">Czy poniższe dane do
faktury są prawidłowe?</p>
<div class="company-details">
<input type="text" id="cmpName" class="company-input" style="font-weight:700; margin-bottom:4px;" readonly />
<input type="text" id="cmpStreet" class="company-input" placeholder="Ulica i numer" style="margin-bottom:4px;"
<input type="text" id="cmpStreet" class="company-input" data-i18n-placeholder="bill.street" placeholder="Ulica i numer" style="margin-bottom:4px;"
readonly />
<div style="display: flex; gap: 8px; margin-bottom: 4px;">
<input type="text" id="cmpZip" class="company-input" placeholder="Kod" style="flex: 1;" readonly />
<input type="text" id="cmpCity" class="company-input" placeholder="Miasto" style="flex: 2;" readonly />
<input type="text" id="cmpZip" class="company-input" data-i18n-placeholder="bill.zip" placeholder="Kod" style="flex: 1;" readonly />
<input type="text" id="cmpCity" class="company-input" data-i18n-placeholder="bill.city" placeholder="Miasto" style="flex: 2;" readonly />
</div>
<input type="text" id="cmpNip" class="company-input muted" readonly />
</div>
<div style="display:flex; gap:12px; flex-direction:column;">
<button class="btn btn-primary" onclick="confirmInvoice()">Tak, poproszę fakturę!</button>
<button class="btn btn-primary" onclick="confirmInvoice()" data-i18n="bill.confirm_invoice">Tak, poproszę fakturę!</button>
<div style="display:flex; gap:12px;">
<button class="btn btn-secondary" onclick="goToStep('stepNIP')">Zmień NIP</button>
<button class="btn btn-secondary" onclick="editCompanyData()" id="btnEditCompany">Popraw ręcznie</button>
<button class="btn btn-secondary" onclick="goToStep('stepNIP')" data-i18n="bill.change_nip">Zmień NIP</button>
<button class="btn btn-secondary" onclick="editCompanyData()" id="btnEditCompany" data-i18n="bill.edit_company">Popraw ręcznie</button>
</div>
</div>
</div>
@@ -376,16 +347,15 @@ $vMenu = publicAssetVersion($publicDir, 'menu.json');
</div>
</div>
<!-- Toast -->
<div class="toast" id="toastMsg">
<span style="font-size:20px;">✓</span> <span id="toastText">Wysłano!</span>
<span style="font-size:20px;">✓</span> <span id="toastText" data-i18n="toast.sent">Wysłano!</span>
</div>
<script>
window.MENU_ASSET_VERSION = <?= json_encode($vMenu, JSON_UNESCAPED_UNICODE) ?>;
window.APP_JS_VERSION = <?= json_encode($vJs, JSON_UNESCAPED_UNICODE) ?>;
window.APP_CONFIG = <?= json_encode([
'geoBypassHosts' => getGeoBypassTrustedHosts(),
'languages' => $languagesForClient,
'endpoints' => [
'analytics' => '../api/analytics.php',
'guestActionQueue' => '../api/guest_action_queue.php',
@@ -393,6 +363,7 @@ $vMenu = publicAssetVersion($publicDir, 'menu.json');
'gusLookup' => '../api/gus_lookup.php',
'kds' => '../api/kds.php',
'bills' => '../api/bills.php',
'menu' => '../api/menu.php',
],
'loaderMinMs' => 10000,
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ?>;
@@ -400,4 +371,4 @@ $vMenu = publicAssetVersion($publicDir, 'menu.json');
<script type="module" src="assets/js/app.js?v=<?= assetVersionAttr($vJs) ?>"></script>
</body>
</html>
</html>