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:
commit
0b99f7f6a6
5 changed files with 68 additions and 8 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -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">'
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
44
tests/60_BelegListeLieferantTypeaheadTest.php
Normal file
44
tests/60_BelegListeLieferantTypeaheadTest.php
Normal 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'
|
||||
);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue