Commit f7bc2323 authored by matsbla's avatar matsbla Committed by matsbla
Browse files

Issue #3278109 by matsbla: Tokenize pasted strings

parent b022e51d
Loading
Loading
Loading
Loading
+61 −0
Original line number Diff line number Diff line
@@ -5,6 +5,65 @@
(function ($, Drupal, drupalSettings) {
  'use strict';

  /**
   * Customize tokenizer.
   *
   * @param {object} $params
   *   Tokenizer parameters
   * @param {object} $e
   *   Tokenizer element
   * @param {function} $callback
   *   Tokenizer callback
   */
  const tokenizer = function(params, e, callback) {
    var separators = e.options.tokenSeparators || [];
    var term = params.term;
    var i = 0;

    var createTag = this.createTag || function (params) {
      return {
        id: params.term,
        text: params.term
      };
    };

    if (term.length && separators.length && $.inArray(term.slice(-1), separators) === -1) {
      term = term + separators[0];
    }

    while (i < term.length) {
      var termChar = term[i];

      if ($.inArray(termChar, separators) === -1) {
        i++;

        continue;
      }

      var part = term.substr(0, i);
      var partParams = $.extend({}, params, {
        term: part
      });

      var data = createTag(partParams);

      if (data == null) {
        i++;
        continue;
      }

      callback(data);

      // Reset the term to not include the tokenized portion
      term = term.substr(i + 1) || '';
      i = 0;
    }

    return {
      term: term
    };
  }

  Drupal.behaviors.select2widget = {
    attach: function (context) {
      // Additional code to make removing/creating elements correctly works.
@@ -61,6 +120,7 @@
          width: 'style',
          tags: autocreate,
          tokenSeparators: [','],
          tokenizer,
          containerCssClass: (drupalSettings.preloaded_entries && drupalSettings.preloaded_entries[field_name])
            ? 'preloaded'
            : '',
@@ -195,6 +255,7 @@
          multiple: multiple,
          tags: autocreate,
          tokenSeparators: [','],
          tokenizer,
          templateResult: flagsIcons,
          templateSelection: flagsIcons
        });