diaspora/diaspora

View on GitHub
app/assets/javascripts/mobile/profile_aspects.js

Summary

Maintainability
A
1 hr
Test Coverage
$(document).ready(function(){
  /* profile page: aspect-dropdown */

  // renders the cover text for the dropdown
  function profileAspectDropdown_refresh($el) {
    var cover_text, num_selected = $el.find('option.selected').length;
    if(num_selected === 0) {
      $el.removeClass('has_connection');
      cover_text = Diaspora.I18n.t('aspect_dropdown.add_to_aspect');
    } else {
      $el.addClass('has_connection');
      if(num_selected === 1) {
        cover_text = $el.find('option.selected').data('name');
      } else {
        cover_text = Diaspora.I18n.t('aspect_dropdown.toggle', { 'count' : num_selected });
      }
    }
    $el.find('option.list_cover').text(cover_text);
  }

  // onchange handler for aspect dropdown instances
  var profileAspectDropDown_onchange = function() {
    var $el      = $(this),
        selected = $el.find('option:selected');
    $el.find('option.list_cover').text(Diaspora.I18n.t('aspect_dropdown.updating'));
    $el.val('list_cover'); // switch back to cover

    if(selected.hasClass('selected')) {
      // remove from aspect
      var membershipId = selected.data("membership_id");

      $.ajax({
        url: Routes.aspectMembership(membershipId),
        type: "DELETE",
        dataType: "json",
        headers: {
          "Accept": "application/json, text/javascript, */*; q=0.01"
        }
      }).done(function() {
        selected.text("– " + Diaspora.I18n.t('aspect_dropdown.mobile_row_unchecked', {name: selected.data('name')}));
        selected.removeClass('selected');
        profileAspectDropdown_refresh($el);
      }).fail(function() {
        alert(Diaspora.I18n.t('aspect_dropdown.error_remove'));
        profileAspectDropdown_refresh($el);
      });

    } else {
      // add to aspect
      var person_id = $el.data('person-id');

      $.ajax({
        url: Routes.aspectMemberships(),
        data: JSON.stringify({
          "person_id": person_id,
          "aspect_id": parseInt(selected.val(), 10)
        }),
        processData: false,
        type: 'POST',
        dataType: 'json',
        headers: {
          'Accept': "application/json, text/javascript, */*; q=0.01"
        },
        contentType: "application/json; charset=UTF-8"
      }).done(function(data) {
        selected.data('membership_id', data.id); // remember membership-id
        selected.text("✓ " + Diaspora.I18n.t('aspect_dropdown.mobile_row_checked', {name: selected.data('name')}));
        selected.addClass('selected');
        profileAspectDropdown_refresh($el);
      }).fail(function() {
        alert(Diaspora.I18n.t('aspect_dropdown.error'));
        profileAspectDropdown_refresh($el);
      });

    }
  };

  // initialize list_cover and register eventhandler for every user_aspect dropdown there is
  $('.user_aspects').each(function() {
    profileAspectDropdown_refresh($(this));
    $(this).change(profileAspectDropDown_onchange);
  });
});