Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/Fields/Field.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
*/
class Field implements Arrayable
{
const LISTED_BY_DEFAULT = ['title', 'slug', 'date', 'author'];

protected $handle;
protected $prefix;
protected $config;
Expand Down Expand Up @@ -237,7 +239,7 @@ public function isListable()
public function isVisibleOnListing()
{
if (is_null($this->get('listable'))) {
return in_array($this->handle, ['title', 'slug', 'date', 'author']);
return in_array($this->handle, self::LISTED_BY_DEFAULT);
}

return ! in_array($this->get('listable'), [false, 'hidden'], true);
Expand Down
17 changes: 16 additions & 1 deletion src/Fields/FieldTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,15 @@ private static function inlineTabField(array $submitted)
->merge($fieldtype->configFields()->all());

$field = collect($submitted['config'])
->reject(function ($value, $key) use ($fields) {
->reject(function ($value, $key) use ($fields, $submitted) {
if ($key === 'isNew') {
return true;
}

if ($key === 'listable' && in_array($submitted['handle'], Field::LISTED_BY_DEFAULT)) {
return false;
}

if ($key === 'width' && $value === 100) {
return true;
}
Expand Down Expand Up @@ -151,6 +155,7 @@ private static function referenceFieldToVue($field): array

$mergedConfig['width'] = $mergedConfig['width'] ?? 100;
$mergedConfig['localizable'] = $mergedConfig['localizable'] ?? false;
$mergedConfig = static::normalizeListable($mergedConfig, $field['handle']);

return [
'handle' => $field['handle'],
Expand All @@ -170,6 +175,7 @@ private static function inlineFieldToVue($field): array
$config['localizable'] = $config['localizable'] ?? false;
$config = static::normalizeRequiredValidation($config);
$config = static::normalizeVisibility($config);
$config = static::normalizeListable($config, $field['handle']);

return [
'handle' => $field['handle'],
Expand Down Expand Up @@ -219,6 +225,15 @@ public static function fieldsetFields()
return $fields;
}

protected static function normalizeListable($config, $handle)
{
if (in_array($handle, Field::LISTED_BY_DEFAULT)) {
$config['listable'] ??= true;
}

return $config;
}

protected static function normalizeRequiredValidation($config)
{
if (Arr::get($config, 'required') !== true) {
Expand Down
81 changes: 81 additions & 0 deletions tests/Fields/FieldTransformerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Tests\Fields;

use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Test;
use Statamic\Facades\AssetContainer;
use Statamic\Fields\Fieldset;
Expand Down Expand Up @@ -418,4 +419,84 @@ public function it_supports_addon_linked_fields()
'localizable' => false,
], $this->configToVue('addon::some_fieldset.field1'));
}

#[Test]
#[DataProvider('listedByDefaultHandles')]
public function it_keeps_listable_hidden_for_fields_listed_by_default($handle)
{
$fromVue = FieldTransformer::fromVue([
'fieldtype' => 'text',
'handle' => $handle,
'type' => 'inline',
'config' => ['listable' => 'hidden'],
]);

$this->assertEquals(['listable' => 'hidden'], $fromVue['field']);
}

#[Test]
public function it_removes_listable_hidden_for_other_fields()
{
$fromVue = FieldTransformer::fromVue([
'fieldtype' => 'text',
'handle' => 'test',
'type' => 'inline',
'config' => ['foo' => 'bar', 'listable' => 'hidden'],
]);

$this->assertEquals(['foo' => 'bar'], $fromVue['field']);
}

#[Test]
#[DataProvider('listedByDefaultHandles')]
public function it_shows_fields_listed_by_default_as_listable($handle)
{
$config = FieldTransformer::toVue(['handle' => $handle, 'field' => []])['config'];

$this->assertTrue($config['listable']);
}

#[Test]
public function it_keeps_explicit_listable_for_fields_listed_by_default()
{
$config = FieldTransformer::toVue(['handle' => 'slug', 'field' => ['listable' => 'hidden']])['config'];

$this->assertEquals('hidden', $config['listable']);
}

#[Test]
public function it_doesnt_set_listable_for_other_fields()
{
$this->assertArrayNotHasKey('listable', $this->configToVue([]));
}

#[Test]
public function it_shows_referenced_fields_listed_by_default_as_listable()
{
$fieldset = tap(new Fieldset)
->setHandle('common')
->setContents(['fields' => [
[
'handle' => 'slug',
'field' => ['type' => 'slug'],
],
]]);

\Statamic\Facades\Fieldset::shouldReceive('all')->andReturn(collect(['common' => $fieldset]));

$vue = FieldTransformer::toVue(['handle' => 'slug', 'field' => 'common.slug']);

$this->assertTrue($vue['config']['listable']);
$this->assertEquals([], $vue['config_overrides']);
}

public static function listedByDefaultHandles()
{
return [
'title' => ['title'],
'slug' => ['slug'],
'date' => ['date'],
'author' => ['author'],
];
}
}
Loading