drowl_paragraphs_bs-1.x-dev/modules/drowl_paragraphs_bs_styles_ui/js/drowl_paragraphs_bs_styles_ui.admin.js

modules/drowl_paragraphs_bs_styles_ui/js/drowl_paragraphs_bs_styles_ui.admin.js
/**
 * @file
 * Drowl paragraphs styles ui admin JS.
 *
 */
(function ($, Drupal, drupalSettings) {
  Drupal.behaviors.drowl_paragraphs_bs_styles_ui_admin = {
    attach(context, settings) {
      const styleDefinitions =
        drupalSettings.drowl_paragraphs_bs_styles_ui.definitions;
      function updateStylesUi($stylesWrapper, activeClassStrings) {
        // Receive array of active classesStringtrings
        // Search for them in the styles arra
        // set/remove the active classes on the UI items
        const $styles = $stylesWrapper.querySelectorAll(
          ".drowl-paragraphs-styles__item"
        );
        for (let i = 0; i < $styles.length; i++) {
          let $style = $styles[i];
          let styleString = $style.getAttribute("data-style-selector");
          if (activeClassStrings.includes(styleString)) {
            $style.classList.add("drowl-paragraphs-styles__item--active");
          } else {
            // Empty classes
            $style.classList.remove("drowl-paragraphs-styles__item--active");
          }
        }
      }
      function getInputClassString(classFieldId) {
        const classString = document.getElementById(classFieldId).value;
        if (classString.length) {
          return classString;
        }
        return "";
      }
      function setInputClassString(classFieldId, classesString) {
        let newValue = "";
        if (classesString.length) {
          newValue = classesString;
        }
        document.getElementById(classFieldId).setAttribute("value", newValue);
      }
      function addClassesString(classesString, classStringToAdd) {
        return (classesString + " " + classStringToAdd)
          .replace(/  +/g, " ")
          .trim();
      }
      function removeClassesString(classesString, classStringToRemove) {
        return classesString
          .replace(classStringToRemove, "")
          .replace(/  +/g, " ")
          .trim();
      }

      // TODO: Better empty check? If no styleDefinitions present its an empty array,
      // if styleDefinitions present, its an object.
      if (styleDefinitions) {
        const $classField = context.querySelector(
          '.drowl-paragraphs-form-layout input[id*="classes-additional"]'
        );

        if (!$classField) {
          return;
        }

        const classFieldId = $classField.getAttribute("id");
        const $formLayoutLeftCol = context.querySelector(
          '.drowl-paragraphs-form-layout__col-first'
        );
        let activeclassesString = getInputClassString(classFieldId);
        // Add Styles UI Markup
        if (
          $formLayoutLeftCol &&
          !$formLayoutLeftCol.querySelectorAll(".drowl-paragraphs-styles").length
        ) {
          $formLayoutLeftCol.insertAdjacentHTML(
            'beforeend',
            `<div class='drowl-paragraphs-styles'><div class='drowl-paragraphs-styles__title'>${Drupal.t(
              "Paragraphs Styles"
            )}</div><div class='drowl-paragraphs-styles__styles'></div><button class='drowl-paragraphs-styles__reset button'>Remove all</button></div>`
          );
          const $stylesWrapper = $formLayoutLeftCol.querySelector(
            ".drowl-paragraphs-styles__styles"
          );
          const $stylesResetButton = $formLayoutLeftCol.querySelector(
            ".drowl-paragraphs-styles__reset"
          );

          // eslint-disable-next-line no-restricted-syntax
          for (const key of Object.keys(styleDefinitions)) {
            const style = styleDefinitions[key];
            let styleActiveClass = "";
            if (
              activeclassesString.length &&
              activeclassesString.includes(style.classString)
            ) {
              styleActiveClass = " drowl-paragraphs-styles__item--active";
            }
            $stylesWrapper.innerHTML += `<div data-style-selector="${style.classesString}" class='drowl-paragraphs-styles__item drowl-paragraphs-styles__item--${key}${styleActiveClass}'>
            <div class='drowl-paragraphs-styles__item-image'><img src="${style.iconPath}"></div>
            <div class='drowl-paragraphs-styles__item-name'>${style.label}</div>
            <div class='drowl-paragraphs-styles__item-desc'>${style.description}</div>
          </div>`;
          }
          const $styles = $stylesWrapper.querySelectorAll(
            ".drowl-paragraphs-styles__item"
          );
          // Initialy check for existing classstrings
          updateStylesUi($stylesWrapper, getInputClassString(classFieldId));
          // Register Styles reset button
          $stylesResetButton.addEventListener("click", function (e) {
            e.preventDefault();
            setInputClassString(classFieldId, "");
            updateStylesUi($stylesWrapper, "");
          });
          // Register UI click events
          for (let i = 0; i < $styles.length; i++) {
            $styles[i].addEventListener("click", function () {
              const $style = $styles[i];
              const styleClassString = $style.getAttribute(
                "data-style-selector"
              );
              activeclassesString = getInputClassString(classFieldId);
              if (
                activeclassesString.length &&
                activeclassesString.includes(styleClassString)
              ) {
                activeclassesString = removeClassesString(
                  activeclassesString,
                  styleClassString
                );
              } else {
                activeclassesString = addClassesString(
                  activeclassesString,
                  styleClassString
                );
              }
              setInputClassString(classFieldId, activeclassesString);
              updateStylesUi($stylesWrapper, activeclassesString);
            });
          }
        }
      }
    },
  };
})(jQuery, Drupal, drupalSettings);

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

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