Skip to content

Commit 88433d7

Browse files
committed
Allow passing translatable to "separator" option in CollectionColumnType #207
1 parent e6af659 commit 88433d7

File tree

5 files changed

+88
-5
lines changed

5 files changed

+88
-5
lines changed

docs/src/reference/types/column/collection.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ $builder
4848

4949
### `separator`
5050

51-
- **type**: `null` or `string`
51+
- **type**: `null`, `string` or `Symfony\Component\Translation\TranslatableInterface`
5252
- **default**: `', '`
5353

5454
Sets the value displayed between every item in the collection.

src/Column/Type/CollectionColumnType.php

+22-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
use Kreyu\Bundle\DataTableBundle\Column\ColumnInterface;
1010
use Kreyu\Bundle\DataTableBundle\Column\ColumnValueView;
1111
use Symfony\Component\OptionsResolver\OptionsResolver;
12+
use Symfony\Contracts\Translation\TranslatableInterface;
13+
use Symfony\Contracts\Translation\TranslatorInterface;
1214

1315
/**
1416
* Represents a column with value displayed as a list.
@@ -17,6 +19,11 @@
1719
*/
1820
final class CollectionColumnType extends AbstractColumnType
1921
{
22+
public function __construct(
23+
private ?TranslatorInterface $translator = null,
24+
) {
25+
}
26+
2027
public function buildColumn(ColumnBuilderInterface $builder, array $options): void
2128
{
2229
$builder->setAttribute('prototype_factory', $builder->getColumnFactory());
@@ -27,6 +34,7 @@ public function buildValueView(ColumnValueView $view, ColumnInterface $column, a
2734
$view->vars = array_replace($view->vars, [
2835
'separator' => $options['separator'],
2936
'separator_html' => $options['separator_html'],
37+
'separator_translatable' => $options['separator'] instanceof TranslatableInterface,
3038
'children' => $this->createChildrenColumnValueViews($view, $column, $options),
3139
]);
3240
}
@@ -44,7 +52,19 @@ public function buildExportValueView(ColumnValueView $view, ColumnInterface $col
4452
'separator_html' => $options['separator_html'],
4553
];
4654

47-
$view->value = $view->vars['value'] = implode($options['export']['separator'], array_map(
55+
$separator = $options['export']['separator'] ?? '';
56+
57+
if ($this->translator && $separator instanceof TranslatableInterface) {
58+
$locale = null;
59+
60+
if (method_exists(TranslatableInterface::class, 'getLocale')) {
61+
$locale = $this->translator->getLocale();
62+
}
63+
64+
$separator = $separator->trans($this->translator, $locale);
65+
}
66+
67+
$view->value = $view->vars['value'] = implode($separator, array_map(
4868
static fn (ColumnValueView $view) => $view->vars['value'],
4969
$this->createChildrenColumnValueViews($view, $column, $options['export']),
5070
));
@@ -70,7 +90,7 @@ public function configureOptions(OptionsResolver $resolver): void
7090
$resolver->define('separator')
7191
->default(', ')
7292
->info('Separator to render between each item in the collection.')
73-
->allowedTypes('null', 'string')
93+
->allowedTypes('null', 'string', TranslatableInterface::class)
7494
;
7595

7696
/* @see https://data-table-bundle.swroblewski.pl/reference/types/column/collection#separator-html */

src/Resources/config/columns.php

+1
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282

8383
$services
8484
->set('kreyu_data_table.column.type.collection', CollectionColumnType::class)
85+
->args([service('translator')->nullOnInvalid()])
8586
->tag('kreyu_data_table.column.type')
8687
;
8788

src/Resources/views/themes/base.html.twig

+13-1
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,19 @@
556556
{% block column_collection_value -%}
557557
{% for child in children -%}
558558
{{- data_table_column_value(child) -}}
559-
<span>{{ not loop.last ? (separator_html ? separator|raw : separator) }}</span>
559+
<span>
560+
{%- if not loop.last -%}
561+
{%- if separator_translatable -%}
562+
{%- set separator = separator|trans -%}
563+
{%- endif -%}
564+
565+
{%- if separator_html -%}
566+
{%- set separator = separator|raw -%}
567+
{%- endif -%}
568+
569+
{{ separator }}
570+
{%- endif -%}
571+
</span>
560572
{%- endfor %}
561573
{%- endblock %}
562574

tests/Unit/Column/Type/CollectionColumnTypeTest.php

+51-1
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,17 @@
1717
use Kreyu\Bundle\DataTableBundle\Tests\Fixtures\Enum\TranslatableEnum;
1818
use Kreyu\Bundle\DataTableBundle\Tests\Fixtures\Enum\UnitEnum;
1919
use PHPUnit\Framework\Attributes\DataProvider;
20+
use Symfony\Contracts\Translation\TranslatorInterface;
21+
22+
use function Symfony\Component\Translation\t;
2023

2124
class CollectionColumnTypeTest extends ColumnTypeTestCase
2225
{
26+
private ?TranslatorInterface $translator = null;
27+
2328
protected function getTestedColumnType(): ColumnTypeInterface
2429
{
25-
return new CollectionColumnType();
30+
return new CollectionColumnType($this->translator);
2631
}
2732

2833
protected function getAdditionalColumnTypes(): array
@@ -41,22 +46,67 @@ public function testPassingSeparatorOptionAsString(): void
4146
{
4247
$column = $this->createColumn([
4348
'separator' => '|',
49+
'export' => true,
4450
]);
4551

4652
$valueView = $this->createColumnValueView($column);
4753

4854
$this->assertEquals('|', $valueView->vars['separator']);
55+
56+
$rowData = new class {
57+
public array $collection = [1, 2, 3];
58+
};
59+
60+
$exportValueView = $this->createExportColumnValueView($column, rowData: $rowData);
61+
62+
$this->assertEquals('1|2|3', $exportValueView->vars['value']);
63+
}
64+
65+
public function testPassingSeparatorOptionAsTranslatable(): void
66+
{
67+
$this->translator = $this->createMock(TranslatorInterface::class);
68+
$this->translator->expects($this->once())
69+
->method('trans')
70+
->with('separator', [], 'data-table')
71+
->willReturn('translated');
72+
73+
$column = $this->createColumn([
74+
'separator' => $separator = t('separator', domain: 'data-table'),
75+
'export' => true,
76+
]);
77+
78+
$valueView = $this->createColumnValueView($column);
79+
80+
$this->assertEquals($separator, $valueView->vars['separator']);
81+
$this->assertTrue($valueView->vars['separator_translatable']);
82+
83+
$rowData = new class {
84+
public array $collection = [1, 2, 3];
85+
};
86+
87+
$exportValueView = $this->createExportColumnValueView($column, rowData: $rowData);
88+
89+
$this->assertEquals('1translated2translated3', $exportValueView->vars['value']);
4990
}
5091

5192
public function testPassingSeparatorOptionAsNull(): void
5293
{
5394
$column = $this->createColumn([
5495
'separator' => null,
96+
'export' => true,
5597
]);
5698

5799
$valueView = $this->createColumnValueView($column);
58100

59101
$this->assertNull($valueView->vars['separator']);
102+
103+
$rowData = new class {
104+
public array $collection = [1, 2, 3];
105+
};
106+
107+
$exportValueView = $this->createExportColumnValueView($column, rowData: $rowData);
108+
109+
$this->assertEquals('123', $exportValueView->vars['value']);
60110
}
61111

62112
public function testDefaultSeparatorHtmlOption(): void

0 commit comments

Comments
 (0)