From 05ca584e45a048642ac4d96a8a81cca50adce6c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Gla=CC=88ser?= Date: Mon, 15 Jun 2026 17:00:47 +0200 Subject: [PATCH] Bestellungen-Suche auf Backend-GET umstellen --- modules/shared/auth/ui/home.php | 100 +++++++------------------------- 1 file changed, 21 insertions(+), 79 deletions(-) diff --git a/modules/shared/auth/ui/home.php b/modules/shared/auth/ui/home.php index 0579f7b..62fa5a2 100644 --- a/modules/shared/auth/ui/home.php +++ b/modules/shared/auth/ui/home.php @@ -508,7 +508,6 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best echo " let table = getTable();"; echo " if (!table) { return; }"; echo " let searchTimer = null;"; - echo " let requestToken = 0;"; echo " const getSearchInput = () => {"; echo " const currentTable = getTable();"; echo " return currentTable ? currentTable.querySelector('[data-large-table-search]') : null;"; @@ -517,10 +516,6 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best echo " const input = getSearchInput();"; echo " return input ? input.closest('[data-component=\\'single-line-input\\']') : null;"; echo " };"; - echo " const getClearButton = () => {"; - echo " const currentTable = getTable();"; - echo " return currentTable ? currentTable.querySelector('.sg-input-clear-button') : null;"; - echo " };"; echo " const getSearchValue = () => {"; echo " const input = getSearchInput();"; echo " return input ? input.value.trim() : '';"; @@ -594,6 +589,7 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best echo " const buildUrl = (params) => {"; echo " const url = new URL(window.location.href);"; echo " url.searchParams.delete('bestellungen_fragment');"; + echo " url.hash = '';"; echo " Object.entries(params).forEach(([key, value]) => {"; echo " if (value === null || value === undefined || value === '') {"; echo " url.searchParams.delete(key);"; @@ -603,82 +599,13 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best echo " });"; echo " return url;"; echo " };"; - echo " const replaceFragment = (html) => {"; - echo " const doc = new DOMParser().parseFromString(html, 'text/html');"; - echo " const fragment = doc.querySelector('[data-bestellungen-content]');"; - echo " if (!fragment) {"; - echo " return false;"; - echo " }"; - echo " contentRoot.innerHTML = fragment.innerHTML;"; - echo " table = getTable();"; - echo " return !!table;"; - echo " };"; - echo " const loadFragment = async (params, updateHistory = true) => {"; + echo " const navigateTo = (params) => {"; echo " if (searchTimer) { window.clearTimeout(searchTimer); searchTimer = null; }"; - echo " const url = buildUrl(params);"; - echo " const activeRequest = ++requestToken;"; - echo " const currentTable = getTable();"; - echo " if (currentTable) { currentTable.setAttribute('aria-busy', 'true'); }"; - echo " try {"; - echo " const response = await fetch(url.toString(), { credentials: 'same-origin', headers: { 'X-Requested-With': 'XMLHttpRequest' } });"; - echo " const html = await response.text();"; - echo " if (activeRequest !== requestToken) {"; - echo " return;"; - echo " }"; - echo " const replaced = replaceFragment(html);"; - echo " if (replaced && updateHistory) {"; - echo " const historyUrl = new URL(url.toString());"; - echo " historyUrl.searchParams.delete('bestellungen_fragment');"; - echo " window.history.replaceState({}, '', historyUrl);"; - echo " }"; - echo " bindTable();"; - echo " } finally {"; - echo " if (activeRequest === requestToken) {"; - echo " table = getTable();"; - echo " if (table) {"; - echo " table.removeAttribute('aria-busy');"; - echo " }"; - echo " }"; - echo " }"; + echo " window.location.assign(buildUrl(params).toString());"; echo " };"; echo " const bindTable = () => {"; echo " table = getTable();"; echo " if (!table) { return; }"; - echo " const searchInput = getSearchInput();"; - echo " const clearButton = getClearButton();"; - echo " if (searchInput && searchInput.dataset.bestellungenBound !== 'true') {"; - echo " searchInput.dataset.bestellungenBound = 'true';"; - echo " searchInput.addEventListener('input', () => {"; - echo " syncSearchState();"; - echo " if (searchTimer) { window.clearTimeout(searchTimer); }"; - echo " searchTimer = window.setTimeout(() => {"; - echo " void loadFragment({"; - echo " bestellungen_search: getSearchValue(),"; - echo " bestellungen_sort: getSortColumn(),"; - echo " bestellungen_dir: getSortDirection(),"; - echo " bestellungen_limit: getPageSize(),"; - echo " });"; - echo " }, 250);"; - echo " });"; - echo " }"; - echo " if (clearButton && clearButton.dataset.bestellungenBound !== 'true') {"; - echo " clearButton.dataset.bestellungenBound = 'true';"; - echo " clearButton.addEventListener('click', () => {"; - echo " if (searchTimer) { window.clearTimeout(searchTimer); searchTimer = null; }"; - echo " const input = getSearchInput();"; - echo " if (input) { input.value = ''; }"; - echo " syncSearchState();"; - echo " loadFragment({"; - echo " bestellungen_search: '',"; - echo " bestellungen_sort: getSortColumn(),"; - echo " bestellungen_dir: getSortDirection(),"; - echo " bestellungen_limit: getPageSize(),"; - echo " }).then(() => {"; - echo " const nextInput = getSearchInput();"; - echo " if (nextInput) { nextInput.focus(); }"; - echo " });"; - echo " });"; - echo " }"; echo " syncSearchState();"; echo " };"; echo " if (!bestellungenTableHandlersInstalled) {"; @@ -696,10 +623,25 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best echo " closeDrawer();"; echo " return;"; echo " }"; + echo " const clearTrigger = event.target.closest('[data-bestellungen-search-clear]');"; + echo " if (clearTrigger) {"; + echo " event.preventDefault();"; + echo " if (searchTimer) { window.clearTimeout(searchTimer); searchTimer = null; }"; + echo " const input = getSearchInput();"; + echo " if (input) { input.value = ''; }"; + echo " syncSearchState();"; + echo " navigateTo({"; + echo " bestellungen_search: '',"; + echo " bestellungen_sort: getSortColumn(),"; + echo " bestellungen_dir: getSortDirection(),"; + echo " bestellungen_limit: getPageSize(),"; + echo " });"; + echo " return;"; + echo " }"; echo " const sortButton = event.target.closest('[data-bestellungen-sort-button]');"; echo " if (sortButton) {"; echo " event.preventDefault();"; - echo " void loadFragment({"; + echo " navigateTo({"; echo " bestellungen_search: getSearchValue(),"; echo " bestellungen_sort: sortButton.dataset.bestellungenSortColumn || getSortColumn(),"; echo " bestellungen_dir: sortButton.dataset.bestellungenSortDirection || getSortDirection(),"; @@ -710,7 +652,7 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best echo " const loadMoreTrigger = event.target.closest('[data-large-table-load-more-trigger]');"; echo " if (loadMoreTrigger) {"; echo " event.preventDefault();"; - echo " void loadFragment({"; + echo " navigateTo({"; echo " bestellungen_search: getSearchValue(),"; echo " bestellungen_sort: getSortColumn(),"; echo " bestellungen_dir: getSortDirection(),"; @@ -726,7 +668,7 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best echo " syncSearchState();"; echo " if (searchTimer) { window.clearTimeout(searchTimer); }"; echo " searchTimer = window.setTimeout(() => {"; - echo " void loadFragment({"; + echo " navigateTo({"; echo " bestellungen_search: getSearchValue(),"; echo " bestellungen_sort: getSortColumn(),"; echo " bestellungen_dir: getSortDirection(),";