This commit is contained in:
2026-04-13 22:31:06 +02:00
parent 38259bc706
commit e15b4ccf45
24 changed files with 1580 additions and 3858 deletions

View File

@@ -216,10 +216,73 @@ foreach ($addressesList as $address) {
</dl>
</article>
<article class="card">
<h3 class="section-title"><?= $e($t('orders.details.payment_shipping')) ?></h3>
<dl class="order-kv mt-12">
<article class="card order-payment-shipping">
<div class="section-title-row">
<h3 class="section-title"><?= $e($t('orders.details.payment_shipping')) ?></h3>
<button type="button" class="btn-edit-inline js-toggle-details-edit" title="Edytuj formę dostawy i płatności" aria-label="Edytuj">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/></svg>
</button>
</div>
<?php
$deliveryMethodValue = trim((string) ($orderRow['delivery_method'] ?? ''));
$paymentMethodValue = trim((string) ($orderRow['payment_method'] ?? ''));
$paymentTypeCurrent = strtoupper(trim((string) ($orderRow['external_payment_type_id'] ?? '')));
$isCodCurrent = \App\Core\Support\StringHelper::isCodPayment($paymentTypeCurrent);
?>
<form method="POST" action="/orders/<?= (int) $orderId ?>/details/update" class="order-details-edit-form js-details-edit-form" style="display:none">
<input type="hidden" name="_token" value="<?= $e($csrfToken ?? '') ?>">
<div class="form-row">
<label>Forma dostawy
<input type="text" name="delivery_method" value="<?= $e($deliveryMethodValue) ?>" maxlength="128" list="js-delivery-methods-list">
</label>
</div>
<div class="form-row">
<label>Forma płatności
<input type="text" name="payment_method" value="<?= $e($paymentMethodValue) ?>" maxlength="128" list="js-payment-methods-list">
</label>
</div>
<div class="form-row">
<label class="checkbox-inline">
<input type="checkbox" name="is_cod" value="1" <?= $isCodCurrent ? 'checked' : '' ?>>
<span>Pobranie (COD) — ustawi typ płatności na <code>CASH_ON_DELIVERY</code></span>
</label>
</div>
<datalist id="js-delivery-methods-list">
<?php foreach (($deliveryMethodSuggestions ?? []) as $sug): ?>
<option value="<?= $e((string) $sug) ?>"></option>
<?php endforeach; ?>
</datalist>
<datalist id="js-payment-methods-list">
<?php foreach (($paymentMethodSuggestions ?? []) as $sug): ?>
<option value="<?= $e((string) $sug) ?>"></option>
<?php endforeach; ?>
</datalist>
<div class="form-actions">
<button type="submit" class="btn btn-primary btn-sm">Zapisz</button>
<button type="button" class="btn btn-sm js-cancel-details-edit">Anuluj</button>
</div>
</form>
<script>
document.addEventListener('DOMContentLoaded', function(){
var toggleBtn = document.querySelector('.js-toggle-details-edit');
var cancelBtn = document.querySelector('.js-cancel-details-edit');
var form = document.querySelector('.js-details-edit-form');
var view = document.querySelector('.js-details-view');
if (!toggleBtn || !form || !view) return;
toggleBtn.addEventListener('click', function(){
form.style.display = 'block';
view.style.display = 'none';
});
if (cancelBtn) cancelBtn.addEventListener('click', function(){
form.style.display = 'none';
view.style.display = '';
});
});
</script>
<dl class="order-kv mt-12 js-details-view">
<dt><?= $e($t('orders.details.fields.payment_status')) ?></dt><dd><?= $e((string) ($orderRow['payment_status'] ?? '-')) ?></dd>
<dt>Forma dostawy</dt><dd><?= $e($deliveryMethodValue !== '' ? $deliveryMethodValue : '-') ?></dd>
<dt>Forma płatności</dt><dd><?= $e($paymentMethodValue !== '' ? $paymentMethodValue : '-') ?></dd>
<dt>Typ platnosci</dt>
<dd>
<?php
@@ -514,12 +577,15 @@ foreach ($addressesList as $address) {
<input type="hidden" name="_token" value="<?= $e($csrfToken ?? '') ?>">
<button type="submit" class="btn btn--sm btn--secondary">Pobierz</button>
</form>
<?php elseif ($pkgStatus !== 'error'): ?>
-
<?php endif; ?>
<?php if (in_array($pkgStatus, ['label_ready', 'created'], true)): ?>
<?php if (in_array((int) ($pkg['id'] ?? 0), $pendingPrintIds, true)): ?>
<button type="button" class="btn btn--sm btn--danger" disabled style="white-space:nowrap">W kolejce</button>
<button type="button"
class="btn btn--sm btn--danger js-print-queue-pending"
data-package-id="<?= $e((string) ($pkg['id'] ?? 0)) ?>"
data-order-id="<?= $e((string) ($orderId ?? 0)) ?>"
disabled
style="white-space:nowrap">W kolejce</button>
<?php else: ?>
<button type="button"
class="btn btn--sm btn--secondary btn-print-label"
@@ -831,6 +897,58 @@ foreach ($addressesList as $address) {
});
}
// --- Print queue polling: rewert przycisku "W kolejce" -> "Drukuj" po wydrukowaniu ---
var printQueuePending = {}; // packageId -> btn element
var printQueueTimer = null;
var printQueueTicks = 0;
var PRINT_QUEUE_MAX_TICKS = 120; // 120 * 3s = 6 min
function revertPrintButton(btn) {
if (!btn) return;
btn.innerHTML = 'Drukuj';
btn.disabled = false;
btn.classList.remove('btn--danger');
btn.classList.remove('js-print-queue-pending');
btn.classList.add('btn--secondary');
btn.classList.add('btn-print-label');
btn.setAttribute('title', 'Wyslij do drukarki');
}
function stopPrintQueuePoll() {
if (printQueueTimer) { clearInterval(printQueueTimer); printQueueTimer = null; }
printQueueTicks = 0;
}
function pollPrintQueueTick() {
printQueueTicks += 1;
if (printQueueTicks > PRINT_QUEUE_MAX_TICKS) { stopPrintQueuePoll(); return; }
var ids = Object.keys(printQueuePending);
if (ids.length === 0) { stopPrintQueuePoll(); return; }
fetch('/api/print/jobs/status?package_ids=' + encodeURIComponent(ids.join(',')), { credentials: 'same-origin' })
.then(function (r) { return r.ok ? r.json() : { pending: ids.map(Number) }; })
.then(function (data) {
var pending = (data && Array.isArray(data.pending)) ? data.pending.map(String) : [];
Object.keys(printQueuePending).forEach(function (pid) {
if (pending.indexOf(String(pid)) === -1) {
revertPrintButton(printQueuePending[pid]);
delete printQueuePending[pid];
}
});
if (Object.keys(printQueuePending).length === 0) stopPrintQueuePoll();
})
.catch(function () { /* ignore transient */ });
}
function watchPrintQueueButton(btn) {
var pid = btn.getAttribute('data-package-id');
if (!pid) return;
printQueuePending[pid] = btn;
if (!printQueueTimer) {
printQueueTicks = 0;
printQueueTimer = setInterval(pollPrintQueueTick, 3000);
}
}
// Print label button handler (delegated for dynamically added buttons)
document.addEventListener('click', function (e) {
var btn = e.target.closest('.btn-print-label');
@@ -854,7 +972,10 @@ foreach ($addressesList as $address) {
btn.innerHTML = 'W kolejce';
btn.disabled = true;
btn.classList.remove('btn--secondary');
btn.classList.remove('btn-print-label');
btn.classList.add('btn--danger');
btn.classList.add('js-print-queue-pending');
watchPrintQueueButton(btn);
} else {
var msg = (res.data && res.data.error) ? res.data.error : 'Nieznany blad';
if (window.OrderProAlerts) { window.OrderProAlerts.show({ message: msg, type: 'error' }); }
@@ -869,6 +990,41 @@ foreach ($addressesList as $address) {
});
});
// Przy zaladowaniu strony: uruchom polling dla przyciskow juz w kolejce
document.querySelectorAll('.js-print-queue-pending').forEach(function (btn) {
watchPrintQueueButton(btn);
});
// Auto-click ostatniej etykiety po utworzeniu przesylki (?printLast=1)
(function autoClickLastLabel() {
if (!/[?&]printLast=1\b/.test(location.search)) return;
var attempts = 0;
var MAX_ATTEMPTS = 30; // 30 * 1s = 30s
var timer = setInterval(function () {
attempts += 1;
if (attempts > MAX_ATTEMPTS) {
clearInterval(timer);
cleanupPrintLastParam();
return;
}
var buttons = document.querySelectorAll('.btn-print-label');
if (buttons.length > 0) {
var last = buttons[buttons.length - 1];
clearInterval(timer);
cleanupPrintLastParam();
last.click();
}
}, 1000);
})();
function cleanupPrintLastParam() {
try {
var url = new URL(location.href);
url.searchParams.delete('printLast');
history.replaceState({}, '', url.toString());
} catch (e) {}
}
})();
</script>