datafield-1.x-dev/js/hierarchical_select.js

js/hierarchical_select.js
/**
 * @file
 * Custom JS for the taxonomy hierarchical select widget.
 */

(function (drupalSettings, $, once) {
  'use strict';

  /**
   * Attach behavior for JSON Fields.
   *
   * @type {Drupal~behavior}
   */
  Drupal.behaviors.hierarchical_select = {
    attach: function (context) {
      $(once('hierarchical-select', '.hierarchical_select', context)).each(function () {
        let parents = $(this).data('parents');
        let parent = $(this).parent();
        let vocabulary = $(this).data('vocabulary');
        let category = drupalSettings.datafieldHierarchicalSelect[vocabulary];
        let url = drupalSettings.datafieldHierarchicalAjax[vocabulary];
        let $categorySelect = $(this).parent();
        createSelects(parents);
        if (parents != undefined) {
          $.ajax({
            url: url,
            type: "POST",
            data: {parent: parents},
            success: function (response) {
              let data = response.data;
              if (data != undefined) {
                category = [...category, ...data];
                createSelects(parents);
              }
            }
          });
        }
        function createSelects(parents) {
          parent.find('select').remove();
          let valDefault = (typeof parents == 'string') ? parents.split('-') : [parents];
          let index = 0;
          $.each(category, function(i, obj) {
            let select = $('<select class="form-select form-element form-element--type-select">');
            select.change(handleSelectChange);
            select.append(createOption('', Drupal.t('- Select -')));
            $.each(obj, function(value, text) {
              select.append(createOption(value, text))
            });
            if(valDefault[index] != undefined){
              select.val(valDefault[index]);
            }
            parent.append(select);
            index++;
          });
        }
        function createOption(value, text) {
          return $('<option>').val(value).text(text);
        }
        function handleSelectChange() {
          let selectedCategory = $(this).val();
          parent.find('input').val(selectedCategory);
          $(this).nextAll('select').remove();
          if (selectedCategory) {
            $.ajax({
              url: url,
              type: "POST",
              data: {parent: selectedCategory},
              success: function (response) {
                let data = response.data;
                if (data != undefined) {
                  let keys = Object.keys(data);
                  let firstKey = keys[0];
                  let childCategories = data[firstKey];
                  if(childCategories != undefined){
                    let $childSelect = $('<select class="form-select form-element form-element--type-select child"></select>');
                    $childSelect.change(handleSelectChange);
                    $childSelect.append(createOption('', Drupal.t('- Select -')));
                    $.each(childCategories, function (index, category) {
                      $childSelect.append(createOption(index, category));
                    });
                    $categorySelect.append($childSelect);
                  }
                }
              },
              error: function (xhr, status, error) {
                console.error(error);
              }
            });
          }
        }

      });
    }
  };
}(drupalSettings, jQuery, once));

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc