Merge pull request 'Feature: Lieferanten-Typeahead in der Belegliste (Issue #138)' (#144) from fds2610-bot/Steuerkram:main into main

Reviewed-on: https://codeberg.org/fds2610/Steuerkram/pulls/144
This commit is contained in:
fds2610 2026-07-27 07:15:17 +02:00
commit 0b99f7f6a6
5 changed files with 68 additions and 8 deletions

View file

@ -2,6 +2,13 @@
---
## 2026-07-27 – Feature: Lieferanten-Typeahead in der Belegliste (Issue #138)
- Beim Klick in die Spalte „Lieferant" der Belegliste (Inline-Bearbeitung) gab es bisher nur ein freies Textfeld – Lieferanten konnten dadurch versehentlich mit unterschiedlicher Schreibweise mehrfach angelegt werden.
- **`src/Controllers/BelegController.php`:** `index()` übergibt jetzt zusätzlich `Supplier::all()` an die View `belege/list`.
- **`src/Views/belege/list.php`:** Neue `<datalist id="bl-supplier-datalist">` mit allen vorhandenen Lieferanten; das Inline-Eingabefeld (`blInlineSupplier()`) verweist per `list`-Attribut darauf – analog zur bereits bestehenden Typeahead-Auswahl in der Buchungsmaske (`belege/detail.php`).
- **`tests/60_BelegListeLieferantTypeaheadTest.php`:** Neuer Test prüft, dass Datalist, Befüllung und Verknüpfung mit dem Inline-Eingabefeld vorhanden sind.
## 2026-07-27 – Fix: Auto-Reload-Button der Ereignisanzeige durch iOS-artigen Toggle-Switch ersetzt (Issue #139)
- Rückmeldung zu #139: Der Text-Button „Auto-Reload: An/Aus" war nicht intuitiv genug.

View file

@ -35,7 +35,7 @@ EÜR-Buchungsmodell (Einnahme/Ausgabe) mit Kategorie- und Zahlungskonto.
## Lieferantenverwaltung
CRUD für Lieferantenstammdaten. Lieferanten können Belegen zugeordnet werden; beim Buchen eines Belegs wird ein unbekannter Lieferant automatisch angelegt (findOrCreate). Der Lieferantenname ist direkt im Beleg inline editierbar.
CRUD für Lieferantenstammdaten. Lieferanten können Belegen zugeordnet werden; beim Buchen eines Belegs wird ein unbekannter Lieferant automatisch angelegt (findOrCreate). Der Lieferantenname ist direkt im Beleg inline editierbar. Sowohl in der Belegmetadaten-Bearbeitung (Buchungsmaske) als auch in der Belegliste bietet die Lieferanteneingabe eine Typeahead-Auswahl (HTML5-Datalist) der bereits vorhandenen Lieferanten, um Dubletten durch abweichende Schreibweisen zu vermeiden.
---

View file

@ -40,12 +40,13 @@ class BelegController extends BaseController
$view->render('layout/base.php', [
'pageTitle' => 'Belege',
'content' => $this->renderView('belege/list', [
'rows' => $result['rows'],
'total' => $result['total'],
'totalAll' => $totalAll,
'pages' => $result['pages'],
'page' => $page,
'filter' => $filter,
'rows' => $result['rows'],
'total' => $result['total'],
'totalAll' => $totalAll,
'pages' => $result['pages'],
'page' => $page,
'filter' => $filter,
'suppliers' => Supplier::all(),
]),
'topbarActions' => '<a href="/belege/export?' . View::buildQuery($filter) . '" class="btn btn-secondary">CSV Export</a> '
. '<a href="/belege/upload" class="btn btn-primary" title="Beleg hochladen" style="display:inline-flex;align-items:center;justify-content:center;padding:.36rem;border-radius:50%;width:1.8rem;height:1.8rem">'

View file

@ -1,4 +1,4 @@
<?php use Steuerkram\View; $h = fn($v) => View::h($v); ?>
<?php use Steuerkram\View; $h = fn($v) => View::h($v); $suppliers = $suppliers ?? []; ?>
<!-- Drag & Drop Upload -->
<div id="bl-dnd-zone" style="
@ -192,6 +192,12 @@
</div>
</div>
<datalist id="bl-supplier-datalist">
<?php foreach ($suppliers as $sup): ?>
<option value="<?= $h($sup['name']) ?>">
<?php endforeach; ?>
</datalist>
<?php if ($pages > 1): ?>
<div class="pagination">
<?php if ($page > 1): ?><a href="?<?= http_build_query(array_merge($filter, ['page' => $page-1])) ?>">‹</a><?php endif; ?>
@ -263,6 +269,8 @@ function blInlineSupplier(td) {
const input = document.createElement('input');
input.type = 'text';
input.value = current;
input.setAttribute('list', 'bl-supplier-datalist');
input.setAttribute('autocomplete', 'off');
input.style.cssText = 'width:100%;border:1px solid var(--color-primary,#3b82f6);border-radius:3px;padding:.1rem .3rem;font-size:inherit;background:#fff;box-sizing:border-box;color:inherit';
function commit(val) {

View file

@ -0,0 +1,44 @@
<?php
declare(strict_types=1);
/**
* Test 60: Lieferanten-Typeahead in der Belegliste
*
* Prüft, dass die Inline-Bearbeitung der Spalte "Lieferant" in der
* Belegliste eine Typeahead-Auswahl (HTML5-Datalist) der vorhandenen
* Lieferanten anbietet, analog zur Buchungsmaske.
*/
class BelegListeLieferantTypeaheadTest extends TestCase
{
protected string $testName = 'Test 60: Belegliste – Lieferant-Inline-Eingabe mit Typeahead';
public function run(): void
{
$viewFile = __DIR__ . '/../src/Views/belege/list.php';
$view = file_get_contents($viewFile);
$this->assert($view !== false, 'View-Datei belege/list.php ist lesbar');
$this->assert(
str_contains($view, 'id="bl-supplier-datalist"'),
'Datalist mit vorhandenen Lieferanten ist vorhanden'
);
$this->assert(
str_contains($view, "foreach (\$suppliers as \$sup)") && str_contains($view, "\$h(\$sup['name'])"),
'Datalist wird aus den vorhandenen Lieferantenstammdaten befüllt'
);
$this->assert(
str_contains($view, "input.setAttribute('list', 'bl-supplier-datalist')"),
'Inline-Eingabefeld verweist auf die Lieferanten-Datalist (Typeahead)'
);
$controllerFile = __DIR__ . '/../src/Controllers/BelegController.php';
$controller = file_get_contents($controllerFile);
$this->assert(
str_contains($controller, "'suppliers' => Supplier::all()"),
'BelegController::index() übergibt die Lieferantenliste an die View'
);
}
}