Skip to content

Commit

Permalink
FIX: Readonly transformation of lazy-loaded searchable dropdown
Browse files Browse the repository at this point in the history
  • Loading branch information
johannes.hammersen authored and johannes.hammersen committed Jul 2, 2024
1 parent 3c97f8a commit f23bea6
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 0 deletions.
51 changes: 51 additions & 0 deletions src/Forms/LazyLoadedLookupField.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?php

namespace SilverStripe\Forms;

use SilverStripe\Core\Convert;
use SilverStripe\ORM\ArrayLib;
use SilverStripe\ORM\DataObjectInterface;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DataList;

/**
* Read-only complement of {@link SearchableDropdownField} and {@link SearchableMultiDropdownField}.
*
* Shows the "human value" of the SearchableDropdownField for the currently selected
* values.
*/
class LazyLoadedLookupField extends LookupField
{
private ?DataList $sourceList = null;

/**
* To retain compatibility with ancestor getSource() this returns an array of only the selected values
*/
public function getSource(): array
{
$values = $this->getValueArray();
if (empty($values) || $this->sourceList === null) {
$selectedValuesList = ArrayList::create();
} else {
$selectedValuesList = $this->sourceList->filterAny(['ID' => $values]);
}
return $this->getListMap($selectedValuesList);
}

/*
* @param mixed $source
*/
public function setSource($source): static
{
// Setting to $this->sourceList instead of $this->source because SelectField.source
// docblock type is array|ArrayAccess i.e. does not allow DataList

if ($source instanceof DataList) {
$this->sourceList = $source;
} else {
$this->sourceList = null;
}
return $this;
}
}
9 changes: 9 additions & 0 deletions src/Forms/SearchableDropdownTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -586,4 +586,13 @@ private function updateOptionsForSchema(
}
return $options;
}

public function performReadonlyTransformation()
{
$field = FormField::castedCopy(LazyLoadedLookupField::class);
$field->setSource($this->sourceList);
$field->setReadonly(true);

return $field;
}
}

0 comments on commit f23bea6

Please sign in to comment.