diff --git a/modules/shared/auth/ui/home.php b/modules/shared/auth/ui/home.php
index 1c505ce..f8684ba 100644
--- a/modules/shared/auth/ui/home.php
+++ b/modules/shared/auth/ui/home.php
@@ -551,6 +551,10 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best
echo " const currentTable = getTable();";
echo " return parseInt((currentTable ? currentTable.dataset.bestellungenPageSize : null) || '20', 10);";
echo " };";
+ echo " const isMobileDetailMode = () => window.matchMedia('(max-width: 767px)').matches;";
+ echo " const escapeHtml = (value) => String(value ?? '').replace(/[&<>\"']/g, (character) => ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' }[character] || character));";
+ echo " let bestellungenListSnapshot = '';";
+ echo " let bestellungenDetailOpen = false;";
echo " const syncSearchState = () => {";
echo " const input = getSearchInput();";
echo " const wrap = getSearchWrap();";
@@ -559,6 +563,48 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best
echo " wrap.setAttribute('data-has-value', String(hasValue));";
echo " wrap.dataset.componentState = hasValue ? 'active' : 'inactive-selectable';";
echo " };";
+ echo " const renderMobileDetail = (trigger) => {";
+ echo " const orderNumber = trigger.dataset.orderNumber || '';";
+ echo " const orderDate = trigger.dataset.orderDate || '';";
+ echo " const total = trigger.dataset.orderTotal || '';";
+ echo " const street = trigger.dataset.orderStreet || '';";
+ echo " const houseNumber = trigger.dataset.orderHouseNumber || '';";
+ echo " const zip = trigger.dataset.orderZip || '';";
+ echo " const city = trigger.dataset.orderCity || '';";
+ echo " const country = trigger.dataset.orderCountry || '';";
+ echo " const streetLine = [street, houseNumber].filter((part) => part && part.length > 0).join(' ').trim();";
+ echo " const cityLine = [zip, city].filter((part) => part && part.length > 0).join(' ').trim();";
+ echo " return [";
+ echo " '
',";
+ echo " '
',";
+ echo " '
',";
+ echo " '
',";
+ echo " '',";
+ echo " '
',";
+ echo " '',";
+ echo " '
',";
+ echo " '
',";
+ echo " '',";
+ echo " '
',";
+ echo " '
',";
+ echo " '
',";
+ echo " '',";
+ echo " 'Bestell-Details
',";
+ echo " '',";
+ echo " '',";
+ echo " '
Bestellnummer: ' + escapeHtml(orderNumber) + '
',";
+ echo " '
Bestelldatum: ' + escapeHtml(orderDate) + '
',";
+ echo " '
Lieferadresse:
',";
+ echo " '
' + escapeHtml(streetLine) + '
',";
+ echo " '
' + escapeHtml(cityLine) + '
',";
+ echo " '
' + escapeHtml(country) + '
',";
+ echo " '
Gesamtsumme: ' + escapeHtml(total) + '
',";
+ echo " '
Detailinhalt wird noch definiert.
',";
+ echo " '
',";
+ echo " '',";
+ echo " '
'";
+ echo " ].join('');";
+ echo " };";
echo " const getDrawer = () => contentRoot.querySelector('[data-bestellungen-drawer]');";
echo " const getDrawerBackdrop = () => contentRoot.querySelector('[data-bestellungen-drawer-backdrop]');";
echo " const setDrawerState = (open) => {";
@@ -579,6 +625,10 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best
echo " const openDrawer = (trigger) => {";
echo " const drawer = getDrawer();";
echo " if (!drawer) { return; }";
+ echo " if (isMobileDetailMode()) {";
+ echo " openMobileDetail(trigger);";
+ echo " return;";
+ echo " }";
echo " const drawerTitle = drawer.querySelector('[data-order-drawer-title]');";
echo " const drawerOrderNumber = drawer.querySelector('[data-order-drawer-order-number]');";
echo " const drawerOrderDate = drawer.querySelector('[data-order-drawer-order-date]');";
@@ -608,6 +658,27 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best
echo " button.setAttribute('aria-expanded', String(button === trigger));";
echo " });";
echo " };";
+ echo " const restoreBestellungenList = () => {";
+ echo " if (bestellungenListSnapshot === '') { return; }";
+ echo " contentRoot.innerHTML = bestellungenListSnapshot;";
+ echo " bestellungenListSnapshot = '';";
+ echo " bestellungenDetailOpen = false;";
+ echo " bindTable();";
+ echo " };";
+ echo " const openMobileDetail = (trigger) => {";
+ echo " bestellungenListSnapshot = contentRoot.innerHTML;";
+ echo " contentRoot.innerHTML = renderMobileDetail(trigger);";
+ echo " bestellungenDetailOpen = true;";
+ echo " window.history.pushState({ bestellungenView: 'detail', orderId: trigger.dataset.orderId || '' }, '', window.location.href);";
+ echo " };";
+ echo " const closeMobileDetail = () => {";
+ echo " if (!bestellungenDetailOpen) { return; }";
+ echo " if (window.history.state && window.history.state.bestellungenView === 'detail') {";
+ echo " window.history.back();";
+ echo " return;";
+ echo " }";
+ echo " restoreBestellungenList();";
+ echo " };";
echo " const buildUrl = (params) => {";
echo " const url = new URL(window.location.href);";
echo " url.hash = '';";
@@ -631,6 +702,8 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best
echo " return false;";
echo " }";
echo " contentRoot.innerHTML = fragment.innerHTML;";
+ echo " bestellungenListSnapshot = '';";
+ echo " bestellungenDetailOpen = false;";
echo " table = getTable();";
echo " return !!table;";
echo " };";
@@ -773,6 +846,12 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best
echo " openDrawer(openTrigger);";
echo " return;";
echo " }";
+ echo " const detailBackTrigger = event.target.closest('[data-bestellungen-detail-back]');";
+ echo " if (detailBackTrigger) {";
+ echo " event.preventDefault();";
+ echo " closeMobileDetail();";
+ echo " return;";
+ echo " }";
echo " const closeTrigger = event.target.closest('[data-order-drawer-close]');";
echo " if (closeTrigger) {";
echo " event.preventDefault();";
@@ -812,6 +891,14 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best
echo " closeDrawer();";
echo " }";
echo " });";
+ echo " window.addEventListener('popstate', (event) => {";
+ echo " if (bestellungenDetailOpen && (!event.state || event.state.bestellungenView !== 'detail')) {";
+ echo " restoreBestellungenList();";
+ echo " }";
+ echo " });";
+ echo " if (!window.history.state || window.history.state.bestellungenView !== 'list') {";
+ echo " window.history.replaceState({ bestellungenView: 'list' }, '', window.location.href);";
+ echo " }";
echo " }";
echo " bindTable();";
echo " connectBestellungenRealtime();";
diff --git a/public/assets/styles.portal.css b/public/assets/styles.portal.css
index 0a201b2..68d8d91 100644
--- a/public/assets/styles.portal.css
+++ b/public/assets/styles.portal.css
@@ -123,3 +123,7 @@ body.sg-otc-order-overlay-open {
.sg-large-table--bestellungen .sg-large-table__cell--header.sg-large-table__cell--amount .sg-large-table__sort-button {
justify-content: flex-end;
}
+
+[data-bestellungen-mobile-detail] .sg-navigation-card-layout {
+ margin-top: 0;
+}