Skip to content
Snippets Groups Projects
Commit feff0194 authored by christian.wiedemann's avatar christian.wiedemann Committed by Florent Torregrosa
Browse files

Issue #3341073 by Christian.wiedemann, Grimreaper, pdureau: The "use"...

Issue #3341073 by Christian.wiedemann, Grimreaper, pdureau: The "use" attribute should also work for variants
parent 976c6c37
Branches
Tags 8.x-1.6
No related merge requests found
......@@ -304,7 +304,7 @@ class PatternDefinition extends PluginDefinition implements DerivablePluginDefin
* @param string $name
* Field name.
*
* @return PatternDefinitionField|null
* @return \Drupal\ui_patterns\Definition\PatternDefinitionVariant|null
* Definition field.
*/
public function getVariant($name) {
......@@ -442,7 +442,18 @@ class PatternDefinition extends PluginDefinition implements DerivablePluginDefin
* Whereas definition uses the "use:" property.
*/
public function hasUse() {
return !empty($this->definition['use']);
$pattern_has_use = !empty($this->definition['use']);
if (!$pattern_has_use) {
$pattern_variants = $this->getVariants();
foreach ($pattern_variants as $pattern_variant) {
if ($pattern_variant->hasUse()) {
$pattern_has_use = TRUE;
break;
}
}
}
return $pattern_has_use;
}
/**
......
......@@ -20,6 +20,7 @@ class PatternDefinitionVariant implements \ArrayAccess {
'name' => NULL,
'label' => NULL,
'description' => NULL,
'use' => NULL,
];
/**
......@@ -31,8 +32,7 @@ class PatternDefinitionVariant implements \ArrayAccess {
$this->definition['label'] = $value;
}
else {
$this->definition['name'] = !isset($value['name']) ? $name : $value['name'];
$this->definition['label'] = $value['label'];
$this->definition['name'] = $value['name'] ?? $name;
$this->definition = $value + $this->definition;
}
}
......@@ -90,4 +90,36 @@ class PatternDefinitionVariant implements \ArrayAccess {
return $this;
}
/**
* Getter.
*
* @return bool
* Whereas definition uses the "use:" property.
*/
public function hasUse() {
return !empty($this->definition['use']);
}
/**
* Getter.
*
* @return string
* Property value.
*/
public function getUse() {
return $this->definition['use'];
}
/**
* Setter.
*
* @param string $use
* Property value.
*
* @return $this
*/
public function setUse($use) {
$this->definition['use'] = $use;
return $this;
}
}
......@@ -135,6 +135,13 @@ class Pattern extends RenderElement {
$element['#use'] = $definition->getUse();
}
if (isset($element['#variant'])) {
$variant_definition = $definition->getVariant($element['#variant']);
if ($variant_definition && $variant_definition->hasUse()) {
$element['#use'] = $variant_definition->getUse();
}
}
return $element;
}
......
......@@ -35,7 +35,7 @@ class PatternDefinitionTest extends AbstractUiPatternsTest {
*/
public function testGettersSetters($getter, $name, $value) {
$pattern_definition = new PatternDefinition([$name => $value]);
$this->assertEquals(call_user_func([$pattern_definition, $getter]), $value);
$this->assertEquals($value, call_user_func([$pattern_definition, $getter]));
}
/**
......@@ -157,4 +157,88 @@ class PatternDefinitionTest extends AbstractUiPatternsTest {
return Yaml::decode(file_get_contents($this->getFixturePath() . '/definition/variants_processing.yml'));
}
/**
* Test hasUse method.
*
* @dataProvider hasUseProvider
*
* @covers ::hasUse
*/
public function testHasUse(array $pattern, bool $expected): void {
$patternDefinition = new PatternDefinition($pattern);
$this->assertEquals($expected, $patternDefinition->hasUse());
}
/**
* Provider.
*
* @return array
* Data.
*/
public function hasUseProvider(): array {
return [
'pattern_without_use' => [
[
'id' => 'test',
],
FALSE,
],
'pattern_with_use' => [
[
'id' => 'test',
'use' => 'my use',
],
TRUE,
],
'pattern_with_use_with_variant' => [
[
'id' => 'test',
'use' => 'my use',
'variants' => [
'default' => [
'label' => 'Default',
],
],
],
TRUE,
],
'pattern_with_variant' => [
[
'id' => 'test',
'variants' => [
'default' => [
'label' => 'Default',
],
],
],
FALSE,
],
'pattern_with_variant_with_use' => [
[
'id' => 'test',
'variants' => [
'default' => [
'label' => 'Default',
'use' => 'my use',
],
],
],
TRUE,
],
'pattern_with_use_with_variant_with_use' => [
[
'id' => 'test',
'use' => 'my use',
'variants' => [
'default' => [
'label' => 'Default',
'use' => 'my use',
],
],
],
TRUE,
],
];
}
}
<?php
declare(strict_types = 1);
namespace Drupal\Tests\ui_patterns\Unit\Definition;
use Drupal\Tests\ui_patterns\Unit\AbstractUiPatternsTest;
use Drupal\ui_patterns\Definition\PatternDefinitionVariant;
/**
* @coversDefaultClass \Drupal\ui_patterns\Definition\PatternDefinitionVariant
*
* @group ui_patterns
*/
class PatternDefinitionVariantTest extends AbstractUiPatternsTest {
/**
* Test constructor with either scalar or array.
*
* @covers ::__construct
* @covers ::hasUse
* @covers ::setDescription
* @covers ::setUse
*/
public function testConstructor(): void {
// Scalar value.
$patternDefinitionVariant = new PatternDefinitionVariant('test', 'my label');
$this->assertEquals('test', $patternDefinitionVariant->getName());
$this->assertEquals('my label', $patternDefinitionVariant->getLabel());
$this->assertEquals(NULL, $patternDefinitionVariant->getDescription());
$this->assertEquals(NULL, $patternDefinitionVariant->getUse());
$this->assertFalse($patternDefinitionVariant->hasUse());
// Array without name.
$patternDefinitionVariant = new PatternDefinitionVariant('test', [
'label' => 'my label',
]);
$this->assertEquals('test', $patternDefinitionVariant->getName());
$this->assertEquals('my label', $patternDefinitionVariant->getLabel());
$this->assertEquals(NULL, $patternDefinitionVariant->getDescription());
$this->assertEquals(NULL, $patternDefinitionVariant->getUse());
$this->assertFalse($patternDefinitionVariant->hasUse());
// Array with name.
$patternDefinitionVariant = new PatternDefinitionVariant('test', [
'name' => 'my name',
'label' => 'my label',
]);
$this->assertEquals('my name', $patternDefinitionVariant->getName());
$this->assertEquals('my label', $patternDefinitionVariant->getLabel());
$this->assertEquals(NULL, $patternDefinitionVariant->getDescription());
$this->assertEquals(NULL, $patternDefinitionVariant->getUse());
$this->assertFalse($patternDefinitionVariant->hasUse());
// Other attributes.
$patternDefinitionVariant = new PatternDefinitionVariant('test', [
'name' => 'my name',
'label' => 'my label',
'description' => 'my description',
'use' => 'template.twig',
]);
$this->assertEquals('my name', $patternDefinitionVariant->getName());
$this->assertEquals('my label', $patternDefinitionVariant->getLabel());
$this->assertEquals('my description', $patternDefinitionVariant->getDescription());
$this->assertEquals('template.twig', $patternDefinitionVariant->getUse());
$this->assertTrue($patternDefinitionVariant->hasUse());
// Setters.
$patternDefinitionVariant->setDescription('new description');
$this->assertEquals('new description', $patternDefinitionVariant->getDescription());
$patternDefinitionVariant->setUse('new use');
$this->assertEquals('new use', $patternDefinitionVariant->getUse());
}
/**
* Test getters.
*
* @dataProvider definitionGettersProvider
*
* @covers ::getName
* @covers ::getLabel
* @covers ::getDescription
* @covers ::getUse
*/
public function testGetters($getter, $name, $value): void {
$patternDefinitionVariant = new PatternDefinitionVariant('test', [$name => $value]);
$this->assertEquals($value, call_user_func([$patternDefinitionVariant, $getter]));
}
/**
* Provider.
*
* @return array
* Data.
*/
public function definitionGettersProvider(): array {
return [
['getName', 'name', 'Variant name'],
['getLabel', 'label', 'Variant label'],
['getDescription', 'description', 'Variant description.'],
['getUse', 'use', 'template.twig'],
];
}
}
......@@ -6,10 +6,12 @@
name: variant1
label: variant1
description: ~
use:
variant2:
name: variant2
label: variant2
description: ~
use:
- actual:
variant1: Variant 1
variant2: Variant 2
......@@ -18,10 +20,12 @@
name: variant1
label: Variant 1
description: ~
use:
variant2:
name: variant2
label: Variant 2
description: ~
use:
- actual:
variant1:
label: variant1
......@@ -30,11 +34,14 @@
name: variant1
label: variant1
description: ~
use:
- actual:
- name: variant1
label: Variant 1
use: "@atoms/button/button.twig"
expected:
variant1:
name: variant1
label: Variant 1
description: ~
use: "@atoms/button/button.twig"
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment