Webbserver - Love Blomberg

Show sourcecode

The following files exists in this folder. Click to view.

public_html/crumbs/order/

api.php
neworder.php
vieworders.php

vieworders.php

129 lines UTF-8 Windows (CRLF)
<?php
$basePath 
'../';
$pageTitle 'Dina Beställningar';
$activePage 'vieworders';
include(
'../includes/header.php');
?>

<div class="page-header">
  <div class="page-header-text">
    <h1>Dina Beställningar</h1>
    <p>Se status och historik för dina beställningar. <span id="update-indicator" class="muted">Uppdateras automatiskt...</span></p>
  </div>
</div>

<div id="orders-container">
  <p class="muted">Laddar beställningar...</p>
</div>

<script>
  const statusLabels = {
    'pending': 'Väntar',
    'preparing': 'Tillagas',
    'done': 'Klar att hämtas',
    'delivered': 'Levererad'
  };

  const statusClasses = {
    'pending': 'status-pending',
    'preparing': 'status-preparing',
    'done': 'status-done',
    'delivered': 'status-delivered'
  };

  function escapeHtml(text) {
    const div = document.createElement('div');
    div.textContent = text;
    return div.innerHTML;
  }

  function buildOrderCard(order) {
    const chips = order.items.map(item =>
      `<span class="order-item-chip"><span class="item-qty">${item.amount}x</span> ${escapeHtml(item.name)}</span>`
    ).join('');

    const instructions = order.custom_instructions ?
      `<span class="order-instructions"><span class="material-symbols-rounded" style="font-size:16px;vertical-align:middle">edit_note</span> ${escapeHtml(order.custom_instructions)}</span>` :
      '<span></span>';

    const padded = String(order.order_id).padStart(4, '0');

    return `
  <div class="card order-card ${statusClasses[order.status]}" data-order-id="${order.order_id}">
    <div class="order-header">
      <div>
        <h3>Beställning #${order.order_id}</h3>
        <span class="order-meta">${escapeHtml(order.order_time)}</span>
      </div>
      <span class="status-badge ${statusClasses[order.status]}">${statusLabels[order.status]}</span>
    </div>
    <div style="background:var(--bg);border:2px solid var(--border);border-radius:8px;padding:12px 16px;margin:12px 0;display:flex;align-items:center;gap:12px;">
      <span class="material-symbols-rounded" style="font-size:22px;color:var(--primary)">confirmation_number</span>
      <div>
        <div style="font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;margin-bottom:2px">Orderkod – visa i kassan</div>
        <div style="font-size:22px;font-weight:700;letter-spacing:.18em;color:var(--text)">${padded}</div>
      </div>
    </div>
    <div class="order-items-compact">${chips}</div>
    <div class="order-footer">
      ${instructions}
      <span class="order-total">${escapeHtml(String(order.total_price))} kr</span>
    </div>
  </div>`;
  }

  function renderOrders(orders) {
    const container = document.getElementById('orders-container');
    const archiveOpen = container.querySelector('details')?.open ?? false;

    if (orders.length === 0) {
      container.innerHTML = '<div class="alert alert-warning"><span class="material-symbols-rounded" style="font-size:18px">info</span> Du har inga beställningar ännu. <a href="neworder.php" style="color:var(--primary);text-decoration:underline;">Lägg en ny beställning</a></div>';
      return;
    }

    const active = orders.filter(o => o.status !== 'delivered');
    const delivered = orders.filter(o => o.status === 'delivered');

    let html = '';

    if (active.length === 0) {
      html += '<div class="alert alert-warning" style="margin-bottom:16px"><span class="material-symbols-rounded" style="font-size:18px">info</span> Inga aktiva beställningar.</div>';
    } else {
      active.forEach(o => {
        html += buildOrderCard(o);
      });
    }

    if (delivered.length > 0) {
      html += `
    <details${archiveOpen ? ' open' : ''} style="margin-top:24px">
      <summary style="cursor:pointer;font-weight:600;color:var(--muted);padding:8px 0;list-style:none;display:flex;align-items:center;gap:8px;user-select:none;">
        <span class="material-symbols-rounded" style="font-size:18px">inventory_2</span>
        Arkiverade beställningar (${delivered.length})
      </summary>
      <div style="margin-top:12px">
        ${delivered.map(o => buildOrderCard(o)).join('')}
      </div>
    </details>`;
    }

    container.innerHTML = html;
  }

  function fetchOrders() {
    fetch('api.php')
      .then(res => res.json())
      .then(orders => {
        renderOrders(orders);
        document.getElementById('update-indicator').textContent = 'Senast uppdaterad: ' + new Date().toLocaleTimeString('sv-SE');
      })
      .catch(err => {
        console.error('Kunde inte hämta beställningar:', err);
      });
  }

  fetchOrders();
  setInterval(fetchOrders, 5000);
</script>

<?php include('../includes/footer.php'); ?>