From 0ed4eb03829935d7652b61b26daa0b43091d0573 Mon Sep 17 00:00:00 2001 From: Karl Fritsche Date: Wed, 9 Aug 2017 15:23:39 +0200 Subject: [PATCH 1/2] Adding support for auto complete fields and added options for not showing id in title --- js/select2.js | 45 +++++++---- .../Select2AutocompleteTagsWidget.php | 23 +----- .../FieldWidget/Select2AutocompleteTrait.php | 75 +++++++++++++++++++ .../FieldWidget/Select2AutocompleteWidget.php | 28 +++++++ 4 files changed, 136 insertions(+), 35 deletions(-) create mode 100644 src/Plugin/Field/FieldWidget/Select2AutocompleteTrait.php create mode 100644 src/Plugin/Field/FieldWidget/Select2AutocompleteWidget.php diff --git a/js/select2.js b/js/select2.js index 04498eb..97ea0e7 100644 --- a/js/select2.js +++ b/js/select2.js @@ -6,14 +6,24 @@ (function ($) { Drupal.behaviors.select2 = { - attach: function (context, settings) { + attach: function (context, drupalSettings) { // Taxonomy tagging widget. - $('[data-select2-taxonomy-widget]').once().each(function () { - var url = $(this).data('autocomplete-path'); - $(this).select2({ - tokenSeparators: [","], - tags: [], - multiple: true, + $('[data-select2-field-name]').once().each(function () { + var fieldName = $(this).data('select2-field-name'), + settings = drupalSettings.select2[fieldName], + url = $(this).data('autocomplete-path'); + + var opts = { + tokenSeparators: settings.token_separator, + multiple: settings.multiple + }; + // Do not add tags to settings, as soon as it is added, select2 enables it + // ignoring the value + if (settings.tags) { + opts.tags = settings.tags; + } + + $(this).select2($.extend(opts, { width: 'element', createSearchChoice: function (term, data) { if ($(data).filter(function () { @@ -27,13 +37,13 @@ data: function (term, page) { return { q: term - } + }; }, results: function (data, page) { // map keys from taxonomy to select2 var res = []; $.each(data, function (key, val) { - res.push({'id': val.value, 'text': val.value}); + res.push({'id': val.value, 'text': settings.display_id ? val.value : val.label}); }); var more = (page * 10) < data.length; // whether or not there are more results available // notice we return the value of more so Select2 knows if more results can be loaded @@ -44,12 +54,21 @@ var data = []; // @todo Needs testing, this does not seem to work anymore. $(element.val().split(",")).each(function () { - var value = this.trim(); - data.push({id: value, text: value}); + var value = this.trim(), + match = value.match(/^(.*) \((\d+)\)$/); + if (!settings.display_id && match) { + data.push({id: value, text: match[1]}); + } + else { + data.push({id: value, text: value}); + } }); + if (!settings.multiple) { + data = data.shift(); + } callback(data); } - }); + })); }); // @todo merge both widget configurations; the only difference should be @@ -84,7 +103,7 @@ return { q: term, page: page - } + }; }, results: function (data, page) { // map keys from taxonomy to select2 diff --git a/src/Plugin/Field/FieldWidget/Select2AutocompleteTagsWidget.php b/src/Plugin/Field/FieldWidget/Select2AutocompleteTagsWidget.php index 9401ee2..0afc6fc 100644 --- a/src/Plugin/Field/FieldWidget/Select2AutocompleteTagsWidget.php +++ b/src/Plugin/Field/FieldWidget/Select2AutocompleteTagsWidget.php @@ -6,11 +6,7 @@ namespace Drupal\select2\Plugin\Field\FieldWidget; -use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Field\Plugin\Field\FieldWidget\EntityReferenceAutocompleteTagsWidget; -use Drupal\Core\Form\FormStateInterface; -use Drupal\entity_reference\Plugin\Field\FieldWidget\AutocompleteTagsWidget; -use Drupal\user\EntityOwnerInterface; /** * Plugin implementation of the 'entity_reference autocomplete-tags' widget. @@ -27,23 +23,6 @@ */ class Select2AutocompleteTagsWidget extends EntityReferenceAutocompleteTagsWidget { - /** - * {@inheritdoc} - */ - public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) { - $element = parent::formElement($items, $delta, $element, $form, $form_state); - $element['target_id'] += [ - '#attributes' => [ - 'data-select2-taxonomy-widget' => 'true', - // Disable core autocomplete - 'data-jquery-once-autocomplete' => 'true', - 'class' => [ - 'select2-widget', - ], - ], - ]; - $element['target_id']['#attached']['library'][] = 'select2/select2.widget'; - return $element; - } + use Select2AutocompleteTrait; } diff --git a/src/Plugin/Field/FieldWidget/Select2AutocompleteTrait.php b/src/Plugin/Field/FieldWidget/Select2AutocompleteTrait.php new file mode 100644 index 0000000..89c816b --- /dev/null +++ b/src/Plugin/Field/FieldWidget/Select2AutocompleteTrait.php @@ -0,0 +1,75 @@ +fieldDefinition; + $allow_multiple_values = $this->getPluginDefinition()['multiple_values']; + $element = parent::formElement($items, $delta, $element, $form, $form_state); + $element['target_id'] += [ + '#attributes' => [ + 'data-select2-field-name' => $fieldDefinition->getName(), + // Disable core autocomplete + 'data-jquery-once-autocomplete' => 'true', + 'class' => [ + 'select2-widget', + ], + ], + ]; + $element['target_id']['#attached']['library'][] = 'select2/select2.widget'; + $element['target_id']['#attached']['drupalSettings']['select2'] = array( + $fieldDefinition->getName() => array( + 'multiple' => $allow_multiple_values, + 'display_id' => $this->getSetting('display_id'), + 'token_separator' => $allow_multiple_values ? array(',') : null, + 'tags' => $allow_multiple_values, + ), + ); + return $element; + } + + /** + * {@inheritdoc} + */ + public function settingsForm(array $form, FormStateInterface $form_state) { + $form = parent::settingsForm($form, $form_state); + + $form['display_id'] = [ + '#type' => 'checkbox', + '#title' => t('Display Entity ID in parentheses behind the name'), + '#default_value' => $this->getSetting('display_id'), + ]; + + return $form; + } + + /** + * {@inheritdoc} + */ + public static function defaultSettings() { + return [ + 'display_id' => TRUE, + ] + parent::defaultSettings(); + } + + /** + * {@inheritdoc} + */ + public function settingsSummary() { + $summary = parent::settingsSummary(); + if ($this->getSetting('display_id') == FALSE) { + $summary[] = t("Don't show entity IDs in parentheses"); + } + return $summary; + } + + +} \ No newline at end of file diff --git a/src/Plugin/Field/FieldWidget/Select2AutocompleteWidget.php b/src/Plugin/Field/FieldWidget/Select2AutocompleteWidget.php new file mode 100644 index 0000000..5087305 --- /dev/null +++ b/src/Plugin/Field/FieldWidget/Select2AutocompleteWidget.php @@ -0,0 +1,28 @@ + Date: Fri, 5 Oct 2018 17:14:05 +0200 Subject: [PATCH 2/2] Stop enforcing german translations An automated approach for retrieving the correct translation is still required. --- select2.libraries.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/select2.libraries.yml b/select2.libraries.yml index 6d15093..9122118 100644 --- a/select2.libraries.yml +++ b/select2.libraries.yml @@ -5,7 +5,6 @@ select2: js/vendor/select2/select2.css: {} js: js/vendor/select2/select2.min.js: {} - js/vendor/select2/select2_locale_de.js: {} dependencies: - core/jquery