diff --git a/modules/shared/auth/ui/home.php b/modules/shared/auth/ui/home.php index 0211a37..2b35fce 100644 --- a/modules/shared/auth/ui/home.php +++ b/modules/shared/auth/ui/home.php @@ -784,30 +784,13 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best echo " lagerBindingsInstalled = true;"; echo " let lagerMobileDetailHost = null;"; echo " let lagerMobileDetailOpen = false;"; - echo " const escapeLagerHtml = (value) => String(value ?? '').replace(/[&<>\"']/g, (character) => ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' }[character] || character));"; - echo " const renderLagerMobileDetail = (trigger) => {"; - echo " const type = trigger.dataset.lagerDrawerType || 'Lager';"; - echo " const name = trigger.dataset.lagerDrawerName || '';"; - echo " const value = trigger.dataset.lagerDrawerValue || '';"; - echo " const isProduct = type === 'Produkt';"; - echo " const forecast = trigger.dataset.lagerDrawerForecast || 'Keine Prognose';"; - echo " const warning = trigger.dataset.lagerDrawerForecastWarning === 'true' || trigger.dataset.lagerDrawerForecastMhdWarning === 'true';"; - echo " const warningText = warning ? forecast : 'Keine akute Warnung.';"; - echo " const lotNumber = trigger.dataset.lagerDrawerLotNumber || 'Nicht hinterlegt';"; - echo " const manufacturerName = trigger.dataset.lagerDrawerManufacturerName || 'Nicht hinterlegt';"; - echo " const manufacturerLotNumber = trigger.dataset.lagerDrawerManufacturerLotNumber || 'Nicht hinterlegt';"; - echo " const mfgDate = trigger.dataset.lagerDrawerMfgDate || 'Nicht hinterlegt';"; - echo " const expiryDate = trigger.dataset.lagerDrawerExpiryDate || 'Nicht hinterlegt';"; - echo " const purchaseDate = trigger.dataset.lagerDrawerPurchaseDate || 'Nicht hinterlegt';"; - echo " const virtualLot = trigger.dataset.lagerDrawerVirtualLotNumber || '';"; - echo " return ['
', '
', '
', '
', '
', '
', '', '
', '
', '
' + escapeLagerHtml(type) + ': ' + escapeLagerHtml(name) + '
', '

Name: ' + escapeLagerHtml(name) + '

' + (isProduct ? 'Anzahl im Lager:' : 'Artikelnummer:') + ' ' + escapeLagerHtml(value) + '

' + (isProduct ? '

Warnungen: ' + escapeLagerHtml(warningText) + '

Naurua-Chargennummer: ' + escapeLagerHtml(lotNumber) + '
Hersteller: ' + escapeLagerHtml(manufacturerName) + '
Hersteller-Chargennummer: ' + escapeLagerHtml(manufacturerLotNumber) + '
Herstellungsdatum: ' + escapeLagerHtml(mfgDate) + '
MHD: ' + escapeLagerHtml(expiryDate) + '
Einkaufsdatum: ' + escapeLagerHtml(purchaseDate) + '

Virtuelle Charge: ' + escapeLagerHtml(virtualLot || 'Keine virtuelle Fehlbestandscharge vorhanden.') + '

' : '') + '
'].join('');"; - echo " };"; + echo " const renderLagerMobileDetail = (sourceDrawer, trigger) => { const type = trigger.dataset.lagerDrawerType || 'Lager'; const name = trigger.dataset.lagerDrawerName || ''; const value = trigger.dataset.lagerDrawerValue || ''; sourceDrawer.querySelector('[data-lager-drawer-title]').textContent = type + ': ' + name; sourceDrawer.querySelector('[data-lager-drawer-name-value]').textContent = name; sourceDrawer.querySelector('[data-lager-drawer-value-label]').textContent = type === 'Produkt' ? 'Anzahl im Lager:' : 'Artikelnummer:'; sourceDrawer.querySelector('[data-lager-drawer-value-value]').textContent = value; sourceDrawer.querySelectorAll('[data-lager-drawer-topic]').forEach((card) => { card.hidden = type !== 'Produkt'; }); if (type === 'Produkt') { const warning = trigger.dataset.lagerDrawerForecastWarning === 'true' || trigger.dataset.lagerDrawerForecastMhdWarning === 'true'; const warningValue = sourceDrawer.querySelector('[data-lager-drawer-warning-value]'); if (warningValue) { warningValue.textContent = warning ? (trigger.dataset.lagerDrawerForecast || 'Keine Prognose') : 'Keine akute Warnung.'; } const warningTitle = sourceDrawer.querySelector('[data-lager-drawer-warning-title]'); if (warningTitle) { warningTitle.textContent = getLagerWarningTitle(trigger); } sourceDrawer.querySelector('[data-lager-drawer-lot-number]').textContent = trigger.dataset.lagerDrawerLotNumber || 'Nicht hinterlegt'; sourceDrawer.querySelector('[data-lager-drawer-current-qty]').textContent = trigger.dataset.lagerDrawerCurrentQty || '0'; sourceDrawer.querySelector('[data-lager-drawer-qty-in]').textContent = trigger.dataset.lagerDrawerQtyIn || '0'; sourceDrawer.querySelector('[data-lager-drawer-manufacturer-name]').textContent = trigger.dataset.lagerDrawerManufacturerName || 'Nicht hinterlegt'; sourceDrawer.querySelector('[data-lager-drawer-manufacturer-lot-number]').textContent = trigger.dataset.lagerDrawerManufacturerLotNumber || 'Nicht hinterlegt'; sourceDrawer.querySelector('[data-lager-drawer-mfg-date]').textContent = trigger.dataset.lagerDrawerMfgDate || 'Nicht hinterlegt'; sourceDrawer.querySelector('[data-lager-drawer-expiry-date]').textContent = trigger.dataset.lagerDrawerExpiryDate || 'Nicht hinterlegt'; sourceDrawer.querySelector('[data-lager-drawer-purchase-date]').textContent = trigger.dataset.lagerDrawerPurchaseDate || 'Nicht hinterlegt'; const productId = trigger.closest('[data-lager-row]')?.dataset.lagerId || ''; sourceDrawer.querySelectorAll('[data-lager-historical-product]').forEach((product) => { product.hidden = product.dataset.lagerHistoricalProduct !== productId; }); } const host = document.createElement('div'); host.className = 'sg-lager-mobile-detail-host'; host.dataset.lagerMobileDetailHost = 'true'; host.innerHTML = '
'; const mobileDrawer = sourceDrawer.cloneNode(true); mobileDrawer.dataset.lagerMobileDrawer = 'true'; mobileDrawer.dataset.open = 'true'; mobileDrawer.setAttribute('aria-hidden', 'false'); host.appendChild(mobileDrawer); return host; };"; echo " const restoreLagerMobileDetail = () => {"; echo " if (lagerMobileDetailHost && lagerMobileDetailHost.parentNode) { lagerMobileDetailHost.parentNode.removeChild(lagerMobileDetailHost); }"; echo " lagerMobileDetailHost = null; lagerMobileDetailOpen = false; document.body.classList.remove('sg-lager-mobile-detail-open');"; echo " };"; echo " const openLagerMobileDetail = (trigger) => {"; - echo " restoreLagerMobileDetail(); const host = document.createElement('div'); host.innerHTML = renderLagerMobileDetail(trigger); lagerMobileDetailHost = host.firstElementChild;"; + echo " restoreLagerMobileDetail(); const sourceDrawer = contentRoot.querySelector('[data-lager-drawer]'); lagerMobileDetailHost = sourceDrawer ? renderLagerMobileDetail(sourceDrawer, trigger) : null;"; echo " if (lagerMobileDetailHost) { document.body.appendChild(lagerMobileDetailHost); document.body.classList.add('sg-lager-mobile-detail-open'); }"; echo " lagerMobileDetailOpen = true; window.history.pushState({ ...(window.history.state || {}), lagerView: 'detail' }, '', window.location.href);"; echo " };"; @@ -816,7 +799,7 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best echo " if (window.history.state && window.history.state.lagerView === 'detail') { window.history.back(); return; }"; echo " restoreLagerMobileDetail();"; echo " };"; - echo " const getDrawer = () => contentRoot.querySelector('[data-lager-drawer]');"; + echo " const getDrawer = () => document.querySelector('[data-lager-mobile-drawer]') || contentRoot.querySelector('[data-lager-drawer]');"; echo " const setDrawerState = (open) => {"; echo " const drawer = getDrawer(); const backdrop = contentRoot.querySelector('[data-lager-drawer-backdrop]');"; echo " if (!drawer || !backdrop) { return; }"; diff --git a/public/assets/styles.portal.css b/public/assets/styles.portal.css index df7d2c9..6d03b3f 100644 --- a/public/assets/styles.portal.css +++ b/public/assets/styles.portal.css @@ -96,6 +96,16 @@ body.sg-lager-mobile-detail-open > :not([data-lager-mobile-detail-host]) { width: 100%; } +.sg-lager-mobile-detail-host .sg-card-list-page-drawer { + position: static; + display: flex; + width: 100%; + max-width: none; + transform: none; + box-shadow: none; + overflow: visible; +} + .sg-mobile-detail-back-card, .sg-mobile-detail-back-card * { cursor: pointer;