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

modules/media_directories_ui/js/media_directories_ui.tree.js
(function ($, Drupal, drupalSettings, once) {
  if (typeof $.jstree === 'undefined') {
    $(once('media-directories-no-jstree', '.browser--listing')).append(Drupal.t('Could not load jsTree!') + ' <a href="' + Drupal.url('admin/reports/status') + '" target="_blank">' + Drupal.t('Check status page') + '</a>');
    return;
  }
  Drupal.MediaBrowser.tree = function () {
    $(Drupal.MediaBrowser.treeSelector).jstree({
      plugins: ['dnd', 'wholerow', 'contextmenu', 'sort'],
      multiple: false,
      core: {
        check_callback: Drupal.MediaBrowser.treeCheckCallback,
        data: {
          url: Drupal.MediaBrowser.getUrl('directory.tree'),
          data: function data(node) {
            return {
              'id': node.id
            };
          }
        },
        themes: {
          ellipsis: true
        }
      },
      sort: function (a, b) {
        var weight_a = this.get_node(a).original.weight;
        var weight_b = this.get_node(b).original.weight;
        if (weight_a !== weight_b) {
          return this.get_node(a).original.weight > this.get_node(b).original.weight ? 1 : -1;
        } else {
          return this.get_text(a) > this.get_text(b) ? 1 : -1;
        }
      },
      dnd: {
        copy: false,
        is_draggable: function is_draggable(nodes) {
          // Root node is not draggable.
          var is_root = nodes[0].id === 'dir-root';
          return !is_root;
        }
      },
      contextmenu: {
        items: Drupal.MediaBrowser.treeContextMenu
      }
    })
    .on('changed.jstree', function (e, data) {
      if (data.action === 'select_node') {
        var doLoadContent = false;
        if (drupalSettings.media_directories.selection_mode != 'keep') {
          if (!Drupal.MediaBrowser.keepSelectionOnChange && Drupal.MediaBrowser.getSelectedMids().length > 0) {
            var $warningDialog = $('<div>' + Drupal.theme('mediaDirectoriesDeSelectionWarningChangeDirectoryModal') + '</div>').appendTo('body');
            Drupal.dialog($warningDialog, {
              title: Drupal.t('Clear selection?'),
              buttons: [{
                text: Drupal.t('Cancel'),
                click: function click() {
                  $(this).dialog('close');
                }
              }, {
                text: Drupal.t('OK'),
                click: function click() {
                  var directory_id = data.node.a_attr["data-tid"];
                  Drupal.MediaBrowser.loadDirectoryContent(directory_id);
                  Drupal.MediaBrowser.activeDirectory = directory_id;

                  if (drupalSettings.media_directories.selection_mode != 'keep') {
                    if (!Drupal.MediaBrowser.keepSelectionOnChange) {
                      // Clear selection from global storage.
                      Drupal.MediaBrowser.clearMediaSelection();
                    }
                  }

                  Drupal.MediaBrowser.keepSelectionOnChange = false;
                  $(this).dialog('close');
                }
              }]
            }).showModal();
          }
          else {
            doLoadContent = true;
          }
        }
        else {
          doLoadContent = true;
        }

        if (doLoadContent) {
          var directory_id = data.node.a_attr["data-tid"];
          Drupal.MediaBrowser.loadDirectoryContent(directory_id);
          Drupal.MediaBrowser.activeDirectory = directory_id;
          Drupal.MediaBrowser.keepSelectionOnChange = false;
        }
      }
    })
    .on('loaded.jstree', function () {
      Drupal.MediaBrowser.loadDirectoryContent(-1);

      // Clear selection from global storage.
      Drupal.MediaBrowser.clearMediaSelection(false);
    })
    .on('rename_node.jstree', function (event, data) {
      var directory_id = $('#' + data.node.a_attr['id']).data('tid');
      Drupal.MediaBrowser.renameDirectory(directory_id, data.text);
    })
    .on('move_node.jstree', function (event, data) {
      var move_directory_id = data.node.a_attr['data-tid'];
      var target_directory_id = data.parent === '#' ? -1 : $('#' + data.parent + '_anchor').data('tid');
      Drupal.MediaBrowser.moveDirectoryToDirectory(move_directory_id, target_directory_id);
    });
  };

  /**
   * Global event bindings.
   */
  Drupal.MediaBrowser.globalBindings = function () {
    // Drag&Drop indicators for media dnd operation.
    $(document).on('dnd_move.vakata', function (e, data) {
      // Only work on media: folders drag&drop are handled from jsTree events directly.
      if (data.data.handleDndStopMedia) {
        // Check if the tree instance is dnd enabled.
        var jsTree = $(Drupal.MediaBrowser.treeSelector).jstree(true);
        if (jsTree && jsTree._data && jsTree._data.dnd) {
          // Check if hovering a folder.
          ref = jsTree.settings.dnd.large_drop_target ? $(data.event.target).closest('.jstree-node').children('.jstree-anchor') : $(data.event.target).closest('.jstree-anchor');
          if (ref && ref.length && ref.parent().is('.jstree-closed, .jstree-open, .jstree-leaf')) {
            if (data.data.currentDirectory !== data.event.target.dataset.tid) {
              data.helper.find('.jstree-icon').first().removeClass('jstree-er').addClass('jstree-ok');
            } else {
              data.helper.find('.jstree-icon').removeClass('jstree-ok').addClass('jstree-er');
            }
          }
        }
      }
    });

    // Drag and Drop event bind for external sources.
    $(document).on('dnd_stop.vakata', function (e, data) {
      var targetDirectory = data.event.target.dataset.tid;
      // Only work on media: folders drag&drop are handled from jsTree events directly.
      if (data.data.handleDndStopMedia && data.data.currentDirectory !== targetDirectory) {
        var media_items = [];
        for (var i = 0; i < data.data.nodes.length; i++) {
          media_items.push(data.data.nodes[i].id);
        }
        Drupal.MediaBrowser.moveMediaToDirectory(media_items, targetDirectory);
      }
    });
  };

  /**
   * Load directory content.
   */
  Drupal.MediaBrowser.loadDirectoryContent = function (directory_id) {
    var arguments = {
      directory_id: directory_id,
      target_bundles: Drupal.MediaBrowser.targetBundles,
      media_name: Drupal.MediaBrowser.name
    };
    if (Drupal.MediaBrowser.searchString) {
      arguments['media_name'] = Drupal.MediaBrowser.searchString;
    }
    var ajaxSettings = {
      url: Drupal.MediaBrowser.getUrl('directory.content'),
      submit: arguments
    };

    // Lock the UI.
    Drupal.MediaBrowser.startLoader();
    Drupal.ajax(ajaxSettings).execute().then(function (data) {
      Drupal.MediaBrowser.activeDirectory = directory_id;
      Drupal.MediaBrowser.media.init($('.browser--listing'));

      // Unlock the UI.
      Drupal.MediaBrowser.stopLoader();

      Drupal.MediaBrowser.setMediaSelected();
    });
  };

  Drupal.MediaBrowser.setMediaSelected = function () {
    var scrolled = false;
    // Set previous selection, if there is any.
    $.each(Drupal.MediaBrowser.getSelectedMids(), function (key, value) {
      var $element = Drupal.MediaBrowser.getMediaElement(value);
      if ($element.length > 0) {
        $element.addClass('selected is-focus checked');
        $('input[type="checkbox"]', $element).prop('checked', true);

        if (!scrolled) {
          // Scroll to the first selected item.
          $element[0].scrollIntoView(false);
          scrolled = true;
        }
      }
    });
    Drupal.MediaBrowser.toolbar.selectionChanged();
  }

  /**
   * Move media item(s) into directory.
   */
  Drupal.MediaBrowser.moveMediaToDirectory = function (media_items, directory_id) {
    if (media_items && directory_id) {
      Drupal.MediaBrowser.startLoader();
      var ajaxSettings = {
        url: Drupal.MediaBrowser.getUrl('media.move'),
        submit: {
          directory_id: directory_id,
          media_items: media_items,
          target_bundles: Drupal.MediaBrowser.targetBundles
        }
      };
      Drupal.ajax(ajaxSettings).execute().done(function () {
        Drupal.MediaBrowser.stopLoader();
      });

      // User is moving media to new directory, we need to clean selection.
      Drupal.MediaBrowser.clearMediaSelection();
    } else {
      console.log('Parameters missing!');
    }
  };

  /**
   * Move directory into directory.
   *
   * @param move_directory_id
   * @param directory_id
   */
  Drupal.MediaBrowser.moveDirectoryToDirectory = function (move_directory_id, directory_id) {
    if (move_directory_id && directory_id) {
      var ajaxSettings = {
        url: Drupal.MediaBrowser.getUrl('directory.move'),
        submit: {
          directory_id: directory_id,
          move_directory_id: move_directory_id,
          target_bundles: Drupal.MediaBrowser.targetBundles
        }
      };
      Drupal.ajax(ajaxSettings).execute();
    } else {
      console.log('Parameters missing!');
    }
  };

  /**
   * Rename directory.
   *
   * @param directory_id
   * @param new_name
   */
  Drupal.MediaBrowser.renameDirectory = function (directory_id, new_name) {
    var ajaxSettings = {
      url: Drupal.MediaBrowser.getUrl('directory.rename'),
      submit: {
        directory_id: directory_id,
        directory_new_name: new_name
      }
    };
    Drupal.ajax(ajaxSettings).execute();
  };

  /**
   * Delete directory.
   *
   * @param directory_id
   */
  Drupal.MediaBrowser.deleteDirectory = function (directory_id) {
    if (directory_id === -1 || directory_id === '') {
      console.log('Parameter missing!');
      return;
    }

    var ajaxSettings = {
      url: Drupal.MediaBrowser.getUrl('directory.delete'),
      submit: {
        directory_id: directory_id,
        target_bundles: Drupal.MediaBrowser.targetBundles
      }
    };
    Drupal.ajax(ajaxSettings).execute();
  };

  /**
   * Callback for checking if operation is allowed.
   *
   * @param operation
   * @param node
   * @param node_parent
   * @param node_position
   * @param more
   * @returns {boolean}
   */
  Drupal.MediaBrowser.treeCheckCallback = function (operation, node, node_parent, node_position, more) {
    // Media item is foreign and we don't allow any modifications.
    if (more && more.is_foreign) {
      return false;
    }

    if (operation === 'move_node') {
      // While dragging, don't allow dropping between nodes.
      if(more.dnd === true && more.pos === 'i') {
        if (node.parent !== node_parent.id) {
            return true;
        }
      }
      // Handle the last event aka "drop".
      else if (more.core === true) {
        if (node.parent !== node_parent.id) {
            return true;
        }
      }
    }
    // Create/rename and edit operations are allowed.
    else if (operation === 'create_node' || operation === 'rename_node' || operation === 'edit') {
      return true;
    }

    return false;
  };

  /**
   * Callback for context menu items.
   *
   * @param node
   * @returns {{rename: {_disabled: boolean, action: rename.action, label: *},
   *   new_directory: {action: new_directory.action, label: *}, delete:
   *   {_disabled: boolean, action: delete.action, label: *}}}
   */
  Drupal.MediaBrowser.treeContextMenu = function (node) {
    // Root node cannot be deleted or renamed.
    var is_root = node.id === 'dir-root';

    // Elements with children cannot be deleted!
    var has_children = node.children.length > 0;

    var menu_items = {};
    if (drupalSettings.media_directories.vocabulary_permissions['create']) {
      menu_items.new_directory = {
        label: Drupal.t('New folder'),
        action: function action(data) {
          var inst = $.jstree.reference(data.reference),
          obj = inst.get_node(data.reference);
          $.post({
            url: Drupal.MediaBrowser.getUrl('directory.add'),
            data: {
              action: 'create_directory',
              parent_id: obj.a_attr['data-tid'],
              name: Drupal.t('New folder')
            },
            success: function success(data) {
              if (data.hasOwnProperty('id')) {
                inst.create_node(obj, data, "last", function (new_node) {
                  try {
                    inst.edit(new_node);
                  } catch (ex) {
                    setTimeout(function () {
                      inst.edit(new_node);
                    }, 0);
                  }
                });
              }
            }
          });
        }
      };
    }

    if (drupalSettings.media_directories.vocabulary_permissions['update']) {
      menu_items.rename = {
        label: Drupal.t('Rename'),
        _disabled: is_root,
        action: function action(data) {
          var inst = $.jstree.reference(data.reference),
          obj = inst.get_node(data.reference);
          inst.edit(obj);
        }
      };
    }

    if (drupalSettings.media_directories.term_translation_enabled &&
        drupalSettings.media_directories.vocabulary_permissions['translate']) {
      menu_items.show_translations = {
        label: Drupal.t('Show translations in new tab'),
        _disabled: is_root,
        action: function action(data) {
          window.open('/taxonomy/term/' +$(data.reference).data('tid') + '/translations');
        }
      };
    }

    if (drupalSettings.media_directories.vocabulary_permissions['delete']) {
      menu_items.delete = {
        label: Drupal.t('Delete'),
        _disabled: is_root || has_children,
        action: function action(node) {
          Drupal.MediaBrowser.deleteDirectory($(node.reference).data('tid'));
        }
      };
    }

    return menu_items;
  };
})(jQuery, Drupal, drupalSettings, once);

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

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