media_directories-2.x-dev/modules/media_directories_ui/js/media_directories_ui.media.js

modules/media_directories_ui/js/media_directories_ui.media.js
(function ($, Drupal, once) {
  /**
   * Media item functionality.
   *
   * @type {{init: Drupal.MediaBrowser.media.init, ctrlPressed: boolean}}
   */
  Drupal.MediaBrowser.media = {

    /**
     * Track key events.
     */
    keyEvents: false,

    /**
     * Holds Control key state.
     */
    ctrlPressed: false,

    /**
     * Bind events to media items.
     */
    init: function init() {
      var $browser_listing = $('.browser--listing');
      var cardinality = Drupal.MediaBrowser.cardinality;
      var remaining = Drupal.MediaBrowser.remainingItems;

      function handleCtrlDown(e) {
        if (e.ctrlKey || e.metaKey || e.which === 17) {
          Drupal.MediaBrowser.media.ctrlPressed = true;
        }
      }

      function handleCtrlUp(e) {
        if (e.ctrlKey || e.metaKey || e.which === 17) {
          Drupal.MediaBrowser.media.ctrlPressed = false;
        }
      }

      // If not already added, add listeners.
      if (!this.keyEvents) {
        // Attach listener to the top document and current document to
        // register keypress inside iframe without focusing iframe first.
        top.document.addEventListener('keydown', handleCtrlDown, {capture: true});
        top.document.addEventListener('keyup', handleCtrlUp, {capture: true});

        document.addEventListener('keydown', handleCtrlDown, {capture: true});
        document.addEventListener('keyup', handleCtrlUp, {capture: true});

        // Set state to true.
        this.keyEvents = true;
      }


      // Media item click actions.
      var $items = $browser_listing.find('.media-item');
      if ($items.length == 0 && Drupal.MediaBrowser.searchString && Drupal.MediaBrowser.searchString != '') {
        $(once('media-browser-append-clear', '.view-empty')).append('<a id="media-browser-clear-search-string">' + Drupal.t('Clear filter') + '</a>');
        $('#media-browser-clear-search-string').on('click', function () {
          Drupal.MediaBrowser.toolbar.filterMediaBrowserByName('');
        });
      }
      $(once('media-browser-click', $items)).each(function () {
        $(this).on('click', function () {
          var media_id = $(this).data('mid');
          var selected_items = Drupal.MediaBrowser.selectedMedia.length;
          var selection_limit = cardinality !== -1 && remaining > 1 && selected_items >= remaining;

          // Check if item which was clicked is in selection already.
          var selected_toggle = Drupal.MediaBrowser.selectedMedia.indexOf(media_id) !== -1;

          // Do not allow selecting more items if maximum has been selected.
          // We skip this if only one item can be selected
          // or control is not pressed and we are not toggling existing item.
          if (selection_limit && Drupal.MediaBrowser.media.ctrlPressed && !selected_toggle) {
            return;
          }

          // Clear current selection, if Control key is not pressed or
          // only one item is available to choose.
          if (!Drupal.MediaBrowser.media.ctrlPressed || remaining === 1) {
            $browser_listing.find('.media-item').each(function () {
              $(this).removeClass('selected is-focus checked');
              $('input[type="checkbox"]', this).prop('checked', false);
            });

            // Clear selection from global storage.
            Drupal.MediaBrowser.clearMediaSelection(false);
          }

          // If user can choose only one item and it is already selected,
          // we need to exit here to unselect single item.
          if (selected_toggle && remaining === 1) {
            return;
          }

          var $checkbox = $(this).find('input[type="checkbox"]');

          // Remove element from selection if we toggle it.
          if ($checkbox.prop('checked')) {
            Drupal.MediaBrowser.selectedMedia.splice(Drupal.MediaBrowser.selectedMedia.indexOf(media_id), 1);
          } else {
            // Push media id to selection array.
            Drupal.MediaBrowser.selectedMedia.push($(this).data('mid'));
          }

          // Toggle media element checkbox state.
          $checkbox.prop("checked", !$checkbox.prop("checked"));
          $(this).toggleClass('selected');
          $(this).toggleClass('is-focus');
          $(this).toggleClass('checked');

          // Notify toolbar items.
          Drupal.MediaBrowser.toolbar.selectionChanged();
        });

        // Drag and Drop functionality.
        $(this).draggable({
          revert: true,
          helper: 'clone',
          start: function start(e) {
            var nodes = [];
            $.each(Drupal.MediaBrowser.getSelectedMids(), function (key, value) {
              var $element = Drupal.MediaBrowser.getMediaElement(value);

              if ($element.length == 0) {
                $element = $('<div>' + Drupal.t('Placeholder') + '</div>');
              }

              nodes.push({
                id: value,
                element: $element
              });
            });

            // If nothing is selected, then just use active item.
            if (nodes.length === 0) {
              nodes.push({
                id: this.dataset.mid,
                element: $(this)
              });
            }

            var $html = $('<div id="jstree-dnd" class="jstree-default"></div>');
            $html.append('<i class="fas fa-arrows-alt"></i>');
            $html.append('<i class="jstree-icon jstree-ocl" role="presentation"></i>');
            $html.append('<span class="jstree-items-count">' + Drupal.formatPlural(nodes.length, '1 item', '@count items') + '</span>');
            $html.append(nodes[0].element[0].outerHTML);
            return $.vakata.dnd.start(e, {
              'handleDndStopMedia': true,
              'currentDirectory': Drupal.MediaBrowser.activeDirectory,
              'jstree': true,
              'nodes': nodes
            }, $html);
          }
        });
      });
    }
  };
})(jQuery, Drupal, once);

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

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