silverstripe / silverstripe-admin

Silverstripe Admin Component
BSD 3-Clause "New" or "Revised" License
25 stars 92 forks source link

ModelAdmin Search form MultiSelect field types submit javascript [object Object] #1840

Closed christohill closed 4 days ago

christohill commented 4 days ago

Module version(s) affected

5.2.22

Description

When adding a multi-select field type to a ModelAdmin search form through modifying the SearchContext in GridFieldFilterHeader, the multi-select field submits an string of comma separated javascript type objects ([object Object]).

I've tested this with ListboxField and TagField (silverstripe/tagfield) with similar results. Interestingly, CheckboxSetField which is also marked as php $schemaDataType = FormField::SCHEMA_DATA_TYPE_MULTISELECT submits a string of comma separated keys when an array is set as the source.

How to reproduce

Basic example

public function getGridField(): GridField {
    $grid = parent::getGridField();
    $filter = $grid->getConfig()->getComponentByType(GridFieldFilterHeader::class);
    $context = $filter->getSearchContext($grid);
    $fields = $context->getFields();
    $fields->add(ListboxField::create('Test', 'Test', ['one' => 'One', 'two' => 'Two']));

    return $grid;
}

Form Data Payload: filter[members][Test]: [object Object],[object Object]

Custom SearchContext Example

// ModelAdmin
public function getGridFieldConfig(): GridFieldConfig {
    $config = parent::getGridFieldConfig();
    $filter = $config->getComponentByType(GridFieldFilterHeader::class);
    $filter->setSearchContext(MemberSearchContext::create(Member::class));

    return $config
}
// MemberSearchContext
class MemberSearchContext extends SearchContext {

    public function getSearchFields() {
        $fields = parent::getSearchFields();
        $fields->add(ListboxField::create('Test', 'Test',  ['one' => 'One', 'two' => 'Two']));
        return $fields;
    }

    public function getQuery($data, $sort = false, $limit = false, $existingQuery = null) {
        $query = parent::getQuery($data, $sort, $limit, $existingQuery);
        // Dump form data
        echo "<pre>";
        var_dump($data);
        echo "</pre>";
        die();
        return $query;
    }
}

Possible Solution

No response

Additional Context

image

Validations

GuySartorelli commented 4 days ago

Closing as a duplicate of https://github.com/silverstripe/silverstripe-admin/issues/1746 If this issue provides additional context, please add that context to the original issue.