fix: PresetComposer liest nur den von der Ability bereinigten Namen
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
3d760113ec
commit
d5fd1642b8
@@ -222,7 +222,7 @@ final class DiviPresetsSetAbility implements Ability
|
||||
/**
|
||||
* Scope, preset to change and source node of one item; null after noting the problem in $errors.
|
||||
*
|
||||
* @param array<array-key, mixed> $item Names are replaced by their cleaned form.
|
||||
* @param array<array-key, mixed> $item name/rename become the cleaned "name" PresetComposer reads (M-5).
|
||||
* @param array<string, string> $errors
|
||||
* @return array{PresetScope, array<string, mixed>|null, Block|null}|null
|
||||
*/
|
||||
@@ -274,7 +274,8 @@ final class DiviPresetsSetAbility implements Ability
|
||||
|
||||
return null;
|
||||
}
|
||||
$item[$key] = $name;
|
||||
unset($item['rename']);
|
||||
$item['name'] = $name;
|
||||
$taken = array_diff($book->idsNamed($scope, $name), [(string) ($existing['id'] ?? '')]);
|
||||
if ($taken !== []) {
|
||||
$errors[$field . '.' . $key] = sprintf(
|
||||
|
||||
@@ -43,7 +43,8 @@ final class PresetComposer
|
||||
|
||||
/**
|
||||
* @param array<string, mixed>|null $existing The preset to change, null for a new one.
|
||||
* @param array<string, mixed> $input One item of lit/divi-presets-set.
|
||||
* @param array<string, mixed> $input One item of lit/divi-presets-set; "name" is the resolved, cleaned
|
||||
* name (new or renamed), "rename" is not read.
|
||||
* @return array{item: array<string, mixed>, errors: array<string, string>, invalid_paths: list<string>}
|
||||
*/
|
||||
public function compose(
|
||||
@@ -238,16 +239,16 @@ final class PresetComposer
|
||||
}
|
||||
|
||||
/**
|
||||
* The name the ability resolved and cleaned ("name", also for a rename), else the existing preset's name.
|
||||
*
|
||||
* @param array<string, mixed>|null $existing
|
||||
* @param array<string, mixed> $input
|
||||
* @param array<string, string> $errors
|
||||
*/
|
||||
private function nameOf(?array $existing, array $input, string $field, array &$errors): string
|
||||
{
|
||||
foreach (['rename', 'name'] as $key) {
|
||||
if (is_string($input[$key] ?? null) && trim($input[$key]) !== '') {
|
||||
return trim($input[$key]);
|
||||
}
|
||||
if (is_string($input['name'] ?? null) && $input['name'] !== '') {
|
||||
return $input['name'];
|
||||
}
|
||||
if (is_string($existing['name'] ?? null)) {
|
||||
return $existing['name'];
|
||||
|
||||
@@ -240,6 +240,21 @@ final class DiviPresetsSetAbilityTest extends TestCase
|
||||
self::assertStringContainsString('1–100 Zeichen', $empty['fields']['items[0].rename']);
|
||||
}
|
||||
|
||||
/** Final review M-5: rename is cleaned by the ability and reaches the composer as the resolved name. */
|
||||
public function testRenameIsCleanedAndApplied(): void
|
||||
{
|
||||
$ability = $this->ability();
|
||||
$input = ['items' => [['module' => 'button', 'preset' => 'CTA primär', 'rename' => '<b>CTA</b> neu']]];
|
||||
$dry = self::assertToolError($ability->execute($input), 'confirm_required');
|
||||
self::assertSame(['changed'], array_column($dry['diff'], 'action'));
|
||||
|
||||
$this->snapshots->expects('save')->andReturn('presets-1');
|
||||
$this->snapshots->expects('attachLog');
|
||||
self::assertTrue($ability->execute($input + ['confirm' => true, 'design_rev' => $dry['design_rev']])['ok']);
|
||||
$items = PresetBook::fromDivi($this->stored)->items(new PresetScope('module', 'divi/button'));
|
||||
self::assertSame('CTA neu', $items['aaaaaaaaaa']['name']);
|
||||
}
|
||||
|
||||
public function testNameAndRenameAreExclusive(): void
|
||||
{
|
||||
$ability = $this->ability();
|
||||
|
||||
@@ -95,7 +95,7 @@ final class PresetComposerTest extends TestCase
|
||||
$existing['attrs'] = ['button' => ['decoration' => ['border' => ['desktop' => ['value' => ['radius' => '4px']]]]]];
|
||||
|
||||
$result = self::composer()->compose(self::book(), new PresetScope('module', 'divi/button'), $existing, [
|
||||
'rename' => 'CTA Primär',
|
||||
'name' => 'CTA Primär',
|
||||
'attrs' => ['button.decoration.background' => ['desktop' => ['color' => '#000000']]],
|
||||
], 'items[0]', null);
|
||||
|
||||
@@ -105,6 +105,22 @@ final class PresetComposerTest extends TestCase
|
||||
self::assertSame('4px', $result['item']['attrs']['button']['decoration']['border']['desktop']['value']['radius']);
|
||||
}
|
||||
|
||||
/** Final review M-5: the ability resolves name/rename; the composer only takes "name" as given. */
|
||||
public function testOnlyTheResolvedNameCounts(): void
|
||||
{
|
||||
$existing = self::book()->items(new PresetScope('module', 'divi/button'))['aaaaaaaaaa'];
|
||||
|
||||
$kept = self::composer()->compose(self::book(), new PresetScope('module', 'divi/button'), $existing, [
|
||||
'rename' => 'Ignoriert',
|
||||
], 'items[0]', null);
|
||||
$missing = self::composer()->compose(self::book(), new PresetScope('module', 'divi/button'), null, [
|
||||
'rename' => 'Ignoriert',
|
||||
], 'items[0]', null);
|
||||
|
||||
self::assertSame('CTA primär', $kept['item']['name']);
|
||||
self::assertSame('Name des neuen Presets fehlt', $missing['errors']['items[0].name']);
|
||||
}
|
||||
|
||||
public function testFromNodeTakesTheDesignButNotTheContent(): void
|
||||
{
|
||||
$node = Block::create('divi/button', [
|
||||
|
||||
Reference in New Issue
Block a user