Fix #138: Lieferanten-Typeahead in der Belegliste ergänzt

This commit is contained in:
fds2610-bot 2026-07-27 07:12:37 +02:00
parent 48c045d7ff
commit 3e92662d92
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) ## 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. - 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 ## 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', [ $view->render('layout/base.php', [
'pageTitle' => 'Belege', 'pageTitle' => 'Belege',
'content' => $this->renderView('belege/list', [ 'content' => $this->renderView('belege/list', [
'rows' => $result['rows'], 'rows' => $result['rows'],
'total' => $result['total'], 'total' => $result['total'],
'totalAll' => $totalAll, 'totalAll' => $totalAll,
'pages' => $result['pages'], 'pages' => $result['pages'],
'page' => $page, 'page' => $page,
'filter' => $filter, 'filter' => $filter,
'suppliers' => Supplier::all(),
]), ]),
'topbarActions' => '<a href="/belege/export?' . View::buildQuery($filter) . '" class="btn btn-secondary">CSV Export</a> ' '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">' . '<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 --> <!-- Drag & Drop Upload -->
<div id="bl-dnd-zone" style=" <div id="bl-dnd-zone" style="
@ -192,6 +192,12 @@
</div> </div>
</div> </div>
<datalist id="bl-supplier-datalist">
<?php foreach ($suppliers as $sup): ?>
<option value="<?= $h($sup['name']) ?>">
<?php endforeach; ?>
</datalist>
<?php if ($pages > 1): ?> <?php if ($pages > 1): ?>
<div class="pagination"> <div class="pagination">
<?php if ($page > 1): ?><a href="?<?= http_build_query(array_merge($filter, ['page' => $page-1])) ?>">‹</a><?php endif; ?> <?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'); const input = document.createElement('input');
input.type = 'text'; input.type = 'text';
input.value = current; 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'; 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) { 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'
);
}
}