From 969c1c37610f7698b06dfea9b53548a59701f897 Mon Sep 17 00:00:00 2001 From: colemanw Date: Sat, 15 Jul 2023 13:26:38 -0400 Subject: [PATCH] dev/core#3049 - Update autocomplete custom fields to use APIv4 --- CRM/Core/BAO/CustomField.php | 17 +++--- .../OptionValueAutocompleteProvider.php | 55 +++++++++++++++++++ Civi/Api4/Service/Spec/SpecFormatter.php | 6 ++ 3 files changed, 68 insertions(+), 10 deletions(-) create mode 100644 Civi/Api4/Service/Autocomplete/OptionValueAutocompleteProvider.php diff --git a/CRM/Core/BAO/CustomField.php b/CRM/Core/BAO/CustomField.php index 8c7f3d0aa9..709161e266 100644 --- a/CRM/Core/BAO/CustomField.php +++ b/CRM/Core/BAO/CustomField.php @@ -1060,17 +1060,14 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField { $fieldAttributes['api']['fieldName'] = $field->getEntity() . '.' . $groupName . '.' . $field->name; $element = $qf->addAutocomplete($elementName, $label, $fieldAttributes, $useRequired && !$search); } + // Autocomplete for field with option values else { - // FIXME: This won't work with customFieldOptions hook - $fieldAttributes += [ - 'entity' => 'OptionValue', - 'placeholder' => $placeholder, - 'multiple' => $search ? TRUE : !empty($field->serialize), - 'api' => [ - 'params' => ['option_group_id' => $field->option_group_id, 'is_active' => 1], - ], - ]; - $element = $qf->addEntityRef($elementName, $label, $fieldAttributes, $useRequired && !$search); + $fieldAttributes['entity'] = 'OptionValue'; + $fieldAttributes['placeholder'] = $placeholder; + $fieldAttributes['api']['fieldName'] = $field->getEntity() . '.' . $groupName . '.' . $field->name; + $fieldAttributes['select']['multiple'] = $search ? TRUE : !empty($field->serialize); + $fieldAttributes['select']['minimumInputLength'] = 0; + $element = $qf->addAutocomplete($elementName, $label, $fieldAttributes, $useRequired && !$search); } $qf->assign('customUrls', $customUrls); diff --git a/Civi/Api4/Service/Autocomplete/OptionValueAutocompleteProvider.php b/Civi/Api4/Service/Autocomplete/OptionValueAutocompleteProvider.php new file mode 100644 index 0000000000..08e327c3bf --- /dev/null +++ b/Civi/Api4/Service/Autocomplete/OptionValueAutocompleteProvider.php @@ -0,0 +1,55 @@ +display['settings'] || $e->display['type'] !== 'autocomplete' || $e->savedSearch['api_entity'] !== 'OptionValue') { + return; + } + $e->display['settings'] = [ + 'sort' => [ + ['weight', 'ASC'], + ['label', 'ASC'], + ], + 'extra' => ['color' => 'color'], + 'columns' => [ + [ + 'type' => 'field', + 'key' => 'label', + 'icons' => [ + ['field' => 'icon'], + ], + ], + [ + 'type' => 'field', + 'key' => 'description', + ], + ], + ]; + } + +} diff --git a/Civi/Api4/Service/Spec/SpecFormatter.php b/Civi/Api4/Service/Spec/SpecFormatter.php index df137568e3..d44fd43f50 100644 --- a/Civi/Api4/Service/Spec/SpecFormatter.php +++ b/Civi/Api4/Service/Spec/SpecFormatter.php @@ -282,6 +282,7 @@ class SpecFormatter { $map = [ 'Select Date' => 'Date', 'Link' => 'Url', + 'Autocomplete-Select' => 'EntityRef', ]; $inputType = $map[$inputType] ?? $inputType; if ($dataTypeName === 'ContactReference' || $dataTypeName === 'EntityReference') { @@ -341,6 +342,11 @@ class SpecFormatter { $inputAttrs['filter'] = $filters; } } + // Custom autocompletes + if (!empty($data['option_group_id']) && $inputType === 'EntityRef') { + $fieldSpec->setFkEntity('OptionValue'); + $inputAttrs['filter']['option_group_id'] = $data['option_group_id']; + } $fieldSpec ->setInputType($inputType) ->setInputAttrs($inputAttrs); -- 2.25.1