monster_menus-9.0.x-dev/js/settings_perms.js

js/settings_perms.js
(function ($, Drupal, drupalSettings) {
  Drupal.behaviors.MMSettingsPerms = {
    attach: function (context) {
      $(once('mm-permissions', '.mm-permissions', context)).each(function () {
        $(':checkbox:not(#edit-node-everyone)', this)
          .change(function (event, recurs) {
            var id = this.name.match(/(?:^|\[)(\w+)-(\w)-(\w+)/);    // user-mode-uid or group-mode-gid
            var row = $(this).closest('tr');
            var tbody = $(this).closest('tbody');
            var list;

            $('form#' + drupalSettings.MM.settings_perms.form_id + ' .messages').remove();
            if (id[3] == 'everyone') {
              // Everything else in column
              list = $(':checkbox:not(.mm-permissions-disabled)[name*=-' + id[2] + ']:not([name="' + this.name + '"])', tbody);
              if (this.checked) {
                list.prop('checked', true);
              }
              list
                .toggleClass('mm-permissions-col-disabled', this.checked)
                .attr('disabled', this.checked);
              if (!recurs) {
                $(':checkbox:checked:not([name="' + this.name + '"])', tbody)
                  .trigger('change', true);
              }
            }

            if (id[2] != drupalSettings.MM.settings_perms.r) {
              if (id[2] == drupalSettings.MM.settings_perms.w) {
                // The rest of the row
                list = $(':checkbox:not([name="' + this.name + '"],.mm-permissions-disabled,.mm-permissions-col-disabled)', row);
              }
              else {
                // r
                list = $(':checkbox[name*=-' + drupalSettings.MM.settings_perms.r + '-]:not(.mm-permissions-disabled,.mm-permissions-col-disabled)', row);
              }

              list.attr('disabled', this.checked);
              if (this.checked) {
                list.prop('checked', true);
              }
              else if (!recurs) {
                $(':checkbox:checked[name^=' + id[1] + '-]:not([name="' + this.name + '"],[name*=-' + drupalSettings.MM.settings_perms.r + '-])', row)
                  .trigger('change', true);
              }
            }
          });

        // node perms "everyone"
        $('#edit-node-everyone', this)
          .change(function () {
            if ($(this).is(':checked')) {
            $(this)
              .closest('tbody')
              .children('tr.mm-permissions-data-row')
              .fadeOut(500, function () {
                $(this).remove();
              });
            }
          });

        // initial setup
        $('.mm-permissions-group-new,.mm-permissions-user-new', this)
          .closest('tr')
          .hide()
          .next()
          .addBack()
          .addClass('mm-permissions-new-row');
        $('.mm-permissions-group-new', this)
          .closest('tr')
          .addClass('mm-permissions-group-new');
        $('.mm-permissions-user-new', this)
          .closest('tr')
          .addClass('mm-permissions-user-new');
        var form = $(this).closest('form');

        // on submit, process collected data into single fields
        $(once('mm-permissions', form)).each(function() {
          form.submit(function () {
            if (form.find('#edit-no-save').val() * 1) {
              $('.mm-permissions-all-values-user', this).val('');
              $('.mm-permissions-all-values-group', this).val('');
              return;
            }
            var removed = {user: [], group: []};
            $('.mm-permissions', form).each(function() {
              var data = {user: '', group: ''}, used = {user: [], group: []};
              $(this)
                .find('.mm-permissions-data-row :checkbox:checked:enabled,.mm-permissions-data-row :input[type=hidden]')
                .each(function () {
                  var id = this.name.match(/(?:^|\[)(\w+)-(\w)-(\w+)/);
                  if (id && id[3] !== 'everyone') {
                    data[id[1]] += id[2] + id[3];
                    used[id[1]][id[3]] = true;
                  }
                });
              var parent = $(this).parents('details');
              $('.mm-permissions-all-values-user', parent).val(data.user);
              $('.mm-permissions-all-values-group', parent).val(data.group);
              data = null;
              $(this)
                .find('.mm-permissions-data-row :checkbox[name*=-' + drupalSettings.MM.settings_perms.disabled_selector + '-]:not(.mm-permissions-disabled:checked)')
                .each(function () {
                  var id = this.name.match(/(?:^|\[)(\w+)-\w-(\w+)/);
                  if (id && id[2] !== 'everyone' && !used[id[1]][id[2]]) {
                    removed[id[1]].push(this);
                  }
                });
            });
            var usersLen = removed.user.length;
            var all = $.merge(removed.user, removed.group);
            if (all.length) {
              var container = $('.mm-permissions:first').closest('details,div').eq(0);
              container.closest('details').attr('open', 'open');
              var conf;
              if (usersLen && removed.group.length) {
                conf = Drupal.t('Note: @indiv individual(s) and @grps group(s) will be removed, because "All Users" already have these same permissions.', {'@indiv' : usersLen, '@grps' : removed.group.length});
              }
              else if (usersLen) {
                conf = Drupal.t('Note: @indiv individual(s) will be removed, because "All Users" already have these same permissions.', {'@indiv' : usersLen});
              }
              else {
                conf = Drupal.t('Note: @grps group(s) will be removed, because "All Users" already have these same permissions.', {'@grps' : removed.group.length});
              }
              all = $(all).closest('tr');
              $('form#' + drupalSettings.MM.settings_perms.form_id + ' .messages').remove();
              var msg = $('<div class="messages messages--status"><h2>' + conf + '</h2><input type="button" value="' + Drupal.t('Continue Anyway') + '"></div>').prependTo(container);
              $(window).scrollTop(container.offset().top);
              $(':button', msg).click(function() {
                all.remove();
                form.find('#' + drupalSettings.MM.settings_perms.submit_id).click();
              });
              var oldColor = all.css('background-color'), done;
              all.css('background-color', '#fcc').fadeTo(200, 0.25).fadeTo(200, 1).fadeTo(200, 0.25,
                function() {
                  if (!done) {
                    all.css('background-color', oldColor);
                    done = true;
                  }
                }).fadeTo(200, 1);
              return false;
            }
          });
        });
        // fire all the checkbox change events, to handle disabling
        $(':checkbox:checked', this).each(function () {
          $(this).trigger('change');
        });
      });
    }
  };

  Drupal.MMSettingsUpdateSummary = function (obj) {
    $(obj).closest('details.vertical-tabs__pane').trigger('summaryUpdated');  // update any details summary
  };

  Drupal.MMSettingsPermsDelete = function (obj) {
    $(obj).closest('tr').fadeOut(500, function () {
      var sib = $(this).siblings(':first');
      $(this).remove();
      Drupal.MMSettingsUpdateSummary(sib);
    });
    $('form#' + drupalSettings.MM.settings_perms.form_id + ' .messages').remove();
    return false;
  };

  Drupal.MMSettingsPermsAddUsers = function (mmListObj, link_id) {
    if (mmListObj.length) {
      var context = $('#' + link_id).closest('.mm-permissions');
      $('form#' + drupalSettings.MM.settings_perms.form_id + ' .messages').remove();
      Drupal.mmDialogClose();
      var i = 1, matches = mmListObj.val().split(/(.*?)\{(.*?)\}/);
      var hidden_row = $('tr.mm-permissions-user-new:hidden', context);
      var obj = $('.mm-permissions [id^=edit-user-' + drupalSettings.MM.settings_perms.row_selector + '-]:checkbox:visible:not([id=edit-user-' + drupalSettings.MM.settings_perms.row_selector + '-owner]):last', context).closest('tr');
      // If no previous row or limit_write is set, use default row as source of copy
      if (!obj.length || $('[name=limit_write_not_admin]').length) obj = hidden_row;
      var new_row = [], dups = [];
      for (; i < matches.length; i += 3) {
        var dup = $('.mm-permissions-data-row :checkbox[name=user-' + drupalSettings.MM.settings_perms.row_selector + '-' + matches[i] + '],.mm-permissions-data-row :input[type=hidden][name=user-w-' + matches[i] + ']', context);
        if (dup.length) {
          $.merge(dups, dup);
        }
        else {
          $.merge(new_row,
            $(obj)
              .clone(true)
              .addClass('mm-permissions-new-row')
              .addClass('mm-permissions-data-row')
              .find('td:eq(0) div') // set user's name
                .html(matches[i + 1])
                .end()
              .find(':checkbox,:input[type=hidden]')  // rename checkboxes using uid
                .each(function () {
                  $(this).attr('name', this.name.replace(/(\w+-\w-)\w+(?=\]|$)/, '$1' + matches[i]));
                })
                .end()
              .fadeTo(0, 0)
          );
        }
      }
      mmListObj[0].delAll();
      $(mmListObj[0].mmList.p.autoComplete).val('');
      Drupal.MMSettingsAnimateDups(dups);
      if (new_row.length) {
        // wait for modal to close
        setTimeout(function () {
          $('#edit-node-everyone', context).prop('checked', false);
          $(new_row)
            .insertBefore(hidden_row)
            .show()
            .fadeTo(500, 1);  // fadeIn doesn't work correctly with TRs
          if (obj == hidden_row) {
            // fire all the checkbox change events, to handle disabling
            $(':checkbox:checked', hidden_row.closest('table')).each(function () {
              $(this).trigger('change');
            });
          }
          Drupal.MMSettingsUpdateSummary(hidden_row);
        }, 250);
      }
    }
    else {
      Drupal.mmDialogClose();
    }
    return false;
  };

  Drupal.MMSettingsPermsAddGroup = function (activator) {
    window.mmListInstance = {
      addFromChild: function (chosen, info) {
        var context = $(activator).closest('.mm-permissions');
        var mmtid = chosen.id.substring(5);
        var hidden_row = $('tr.mm-permissions-group-new:hidden', context);
        var obj = $('.mm-permissions [id^=edit-group-' + drupalSettings.MM.settings_perms.row_selector + '-]:checkbox:visible:not([id=edit-group-' + drupalSettings.MM.settings_perms.row_selector + '-everyone]):last', context).closest('tr');
        // If no previous row or limit_write is set, use default row as source of copy
        if (!obj.length || $('[name=limit_write_not_admin]').length) obj = hidden_row;
        var dups = $('.mm-permissions-data-row :checkbox[name=group-' + drupalSettings.MM.settings_perms.row_selector + '-' + mmtid + '],.mm-permissions-data-row :input[type=hidden][name=group-w-' + mmtid + ']', context);
        if (dups.length) {
          Drupal.mmDialogClose();
          Drupal.MMSettingsAnimateDups(dups);
        }
        else {
          var new_row = $(obj)
            .clone(true)
            .addClass('mm-permissions-new-row')
            .addClass('mm-permissions-data-row')
            .find('td:eq(0)')
              .find('details') // make sure details is collapsed
                .attr('open', null)
                .end()
              .find('summary') // copy group name
                .text($('a:first', chosen).text().replace(/^\s*(.*?)\s*$/, '$1'))   // IE doesn't support trim()
                .end()
              .find('summary + div div') // copy user list
                .html(info)
                .show()
                .end()
              .end()
            .find(':checkbox,:input[type=hidden]')  // rename checkboxes using mmtid
              .each(function () {
                this.name = this.name.replace(/(\w+-\w-)\w+(?=\]|$)/, '$1' + mmtid);
              })
              .end()
            .fadeTo(0, 0);
          $('form#' + drupalSettings.MM.settings_perms.form_id + ' .messages').remove();
          $('details', new_row)
            .attr('open', null)
            .find('>summary')
              .unbind('click');
          Drupal.behaviors.collapse && Drupal.behaviors.collapse.attach(new_row, drupalSettings);
          Drupal.behaviors.MMDialog.attach(new_row, drupalSettings);
          Drupal.mmDialogClose();
          // wait for modal to close
          setTimeout(function () {
            $('#edit-node-everyone', context).prop('checked', false);
            new_row
              .insertBefore(hidden_row)
              .show()
              .fadeTo(500, 1);
            Drupal.MMSettingsUpdateSummary(hidden_row);
          }, 250);
        }
      }
    };
  };

  Drupal.MMSettingsAnimateDups = function (dups) {
    dups = $(dups).closest('tr');
    if (dups.length) {
      // wait for modal to close
      setTimeout(function () {
        var old = dups.css('background-color');
        dups.css('background-color', '#ff5').fadeTo(200, 0.25).fadeTo(200, 1).fadeTo(200, 0.25).fadeTo(200, 1).fadeTo(200, 0.25).fadeTo(200, 1, function () {$(this).css('background-color', old)});
      }, 250);
    }
  };

  Drupal.MMSettingsPermsOwner = function (mmListObj) {
    if (mmListObj.length) {
      var matches = mmListObj.val().split(/(.*?)\{(.*?)\}/);
      if (matches.length > 1) {
        $('.mm-permissions .settings-perms-owner-name').text(matches[2]);
        $('[name=owner]').val(matches[1]);
      }
    }
    Drupal.mmDialogClose();
    return false;
  };
})(jQuery, Drupal, drupalSettings);

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

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