mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
NEW ListboxField react field schema
This commit is contained in:
parent
60ca35c02d
commit
e1d10a0b4c
@ -43,6 +43,9 @@ class ListboxField extends MultiSelectField
|
|||||||
*/
|
*/
|
||||||
protected $disabledItems = [];
|
protected $disabledItems = [];
|
||||||
|
|
||||||
|
|
||||||
|
protected $schemaComponent = 'ListboxField';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new dropdown field.
|
* Creates a new dropdown field.
|
||||||
*
|
*
|
||||||
@ -58,6 +61,8 @@ class ListboxField extends MultiSelectField
|
|||||||
$this->setSize($size);
|
$this->setSize($size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->addExtraClass('ss-listbox-field');
|
||||||
|
|
||||||
parent::__construct($name, $title, $source, $value);
|
parent::__construct($name, $title, $source, $value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,6 +106,7 @@ class ListboxField extends MultiSelectField
|
|||||||
|
|
||||||
$options = new ArrayList($options);
|
$options = new ArrayList($options);
|
||||||
$this->extend('updateGetOptions', $options);
|
$this->extend('updateGetOptions', $options);
|
||||||
|
|
||||||
return $options;
|
return $options;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -158,4 +164,109 @@ class ListboxField extends MultiSelectField
|
|||||||
{
|
{
|
||||||
return $this->disabledItems;
|
return $this->disabledItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provide ListboxField data to the JSON schema for the frontend component
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getSchemaDataDefaults()
|
||||||
|
{
|
||||||
|
$options = $this->getOptions();
|
||||||
|
$selected = $options->filter('Selected', true);
|
||||||
|
$name = $this->getName();
|
||||||
|
$schema = array_merge(
|
||||||
|
parent::getSchemaDataDefaults(),
|
||||||
|
[
|
||||||
|
'name' => $name,
|
||||||
|
'lazyLoad' => false,
|
||||||
|
'creatable' => false,
|
||||||
|
'multi' => true,
|
||||||
|
'value' => $selected->count() ? $selected->toNestedArray() : null,
|
||||||
|
'disabled' => $this->isDisabled() || $this->isReadonly(),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
$schema['options'] = array_values($options->toNestedArray() ?? []);
|
||||||
|
|
||||||
|
return $schema;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getSchemaStateDefaults()
|
||||||
|
{
|
||||||
|
$data = parent::getSchemaStateDefaults();
|
||||||
|
|
||||||
|
// Add options to 'data'
|
||||||
|
$data['lazyLoad'] = false;
|
||||||
|
$data['multi'] = true;
|
||||||
|
$data['creatable'] = false;
|
||||||
|
$options = $this->getOptions()->filter('Selected', true);
|
||||||
|
$data['value'] = $options->count() ? $options->toNestedArray() : null;
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns array of arrays representing tags.
|
||||||
|
*
|
||||||
|
* @param string $term
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function getOptionsArray($term)
|
||||||
|
{
|
||||||
|
$source = $this->getSourceList();
|
||||||
|
if (!$source) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$titleField = $this->getTitleField();
|
||||||
|
|
||||||
|
$query = $source
|
||||||
|
->filter($titleField . ':PartialMatch:nocase', $term)
|
||||||
|
->sort($titleField);
|
||||||
|
|
||||||
|
// Map into a distinct list
|
||||||
|
$items = [];
|
||||||
|
$titleField = $this->getTitleField();
|
||||||
|
|
||||||
|
foreach ($query->map('ID', $titleField)->values() as $title) {
|
||||||
|
$items[$title] = [
|
||||||
|
'Title' => $title,
|
||||||
|
'Value' => $title,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
return array_values($items ?? []);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getValueArray()
|
||||||
|
{
|
||||||
|
$value = $this->Value();
|
||||||
|
$validValues = $this->getValidValues();
|
||||||
|
if (empty($validValues)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$canary = reset($validValues);
|
||||||
|
if (is_array($value) && count($value) > 0) {
|
||||||
|
$first = reset($value);
|
||||||
|
// sanity check the values - make sure strings get strings, ints get ints etc
|
||||||
|
if (gettype($canary) !== gettype($first)) {
|
||||||
|
$replaced = [];
|
||||||
|
foreach ($value as $item) {
|
||||||
|
if (!is_array($item)) {
|
||||||
|
$item = json_decode($item, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($item['Value'])) {
|
||||||
|
$replaced[] = $item['Value'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$value = $replaced;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->getListValues($value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user