Quelltext des aktuellen Standes
<?php
declare(strict_types=1);
/**
* Sichert den Freitext-Modus des zentralen Dropdowns ab.
*
* Der Modus ist bewusst ein Opt-in einzelner Felder: Er gehört nur dorthin, wo
* die Spalte Text speichert und ein bekannter Eintrag lediglich bevorzugt wird.
* Felder mit Standort-Fremdschlüssel bleiben reine Auswahl.
*/
return static function (): void {
$root = dirname(__DIR__);
test('Die Komponente kennt den Freitext-Modus', function () use ($root) {
$js = file_get_contents($root . '/public/assets/js/app.js');
$css = file_get_contents($root . '/public/assets/css/app.css');
assertTrue(str_contains($js, "hasAttribute('data-allow-custom')"));
assertTrue(str_contains($js, 'ss-item-custom'));
// Wiederverwendung der einmal angelegten Option verhindert Duplikate
assertTrue(str_contains($js, "getAttribute('data-custom') === '1'"));
assertTrue(str_contains($css, '.ss-item.ss-item-custom'));
});
test('Freitext ist ausschließlich im IPAM-Subnetzformular freigegeben', function () use ($root) {
$mit = [];
$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($root . '/templates'));
foreach ($it as $f) {
if ($f->getExtension() !== 'php') {
continue;
}
if (str_contains(file_get_contents($f->getPathname()), 'data-allow-custom')) {
$mit[] = basename(dirname($f->getPathname())) . '/' . $f->getBasename();
}
}
sort($mit);
assertSame(['ipam/subnet_form.php'], $mit);
});
test('Das Standortfeld des Subnetzes bleibt ein Textfeld mit Vorschlagsliste', function () use ($root) {
$tpl = file_get_contents($root . '/templates/ipam/subnet_form.php');
// Auswahl schreibt den Standortnamen – die Spalte speichert weiterhin Text.
assertTrue(str_contains($tpl, 'name="location" data-searchable data-allow-custom'));
assertTrue(str_contains($tpl, 'value="<?= $this->e($sfLoc[\'name\']) ?>"'));
// Hierarchie wie in den übrigen Modulen
assertTrue(str_contains($tpl, "data-depth=\"<?= (int)(\$sfLoc['_depth'] ?? 0) ?>\""));
// Ein bereits frei eingetragener Wert bleibt wählbar und ausgewählt
assertTrue(str_contains($tpl, 'data-custom="1" selected'));
});
};