Fix #138: Lieferanten-Typeahead in der Belegliste ergänzt
This commit is contained in:
parent
48c045d7ff
commit
3e92662d92
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)
|
## 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.
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,7 @@ class BelegController extends BaseController
|
||||||
'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">'
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
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