ging/social_stream

View on GitHub
base/app/assets/javascripts/social_stream/relation_customs.js

Summary

Maintainability
C
7 hrs
Test Coverage
//= require social_stream/callback

SocialStream.RelationCustom = (function(SS, $, undefined){
  var callback = new SS.Callback();

  var getListEl = function() {
    return $('.relation_list');
  };

  var getPermissionsPath = function() {
    return getListEl().attr('data-permissions_path');
  };

  var initList = function(el) {
    var list = getListEl();
    var scope = el ? el : list;
    
    list.find('.edit_name').hide();
    list.find('.new_relation_custom').hide();
    list.find('.actions').hide();

    scope.find('input[type=radio]').click(function() {
      hideEditForms();

      list.find('.actions').hide();
      $(this).closest('.relation_custom').find('.actions').show();
      loadPermissionList(this);
    });

    scope.find('.actions .edit').click(function() {
      showEditForm($(this).closest('.relation_custom'));
    });

    scope.find('.edit_name .submit').click(function() {
      $(this).closest('.edit_name').find('form').submit();
    });

    scope.find('a.new').click(function(e) {
      e.preventDefault();
      $(this).closest('#new_relation').find('.new_relation_custom').toggle('slow');
    });
  };

  var showEditForm = function(el) {
    el.find('label').hide('slow');
    el.find('.actions').hide('slow');

    el.find('.edit_name').show('slow');

    $('html').on('click.social_stream.relation_custom.edit_name', editFormsListener);
  };

  var editFormsListener = function(event) {
    if (event && $(event.target).closest('.relation_custom').length) {
      return;
    }

    hideEditForms();

    $('html').off('click.social_stream.relation_custom.edit_name');
  };

  var hideEditForms = function() {
    $('.edit_name:visible').each(function() {
      $(this).hide('slow');

      var parent = $(this).closest('.relation_custom');
      parent.find('label').show('slow');
      parent.find('.actions').show('slow');
    });
  };

  var loadPermissionList = function(el) {
    var radioInput = $(el);
    var relVal = radioInput.val();

    $('#permissions').find('.postit').hide();
    $('#permissions').find('.relation_permissions').hide();

    if (radioInput.attr('data-loaded')) {
      $('#relation_' + relVal + '_permissions').show();

      return;
    }

    $('#permissions').find('.loading').show();

    var formEl = $('<div/>', {
      id: 'relation_' + relVal + '_permissions',
      'class': 'relation_permissions'
    });

    formEl.append('<div/>', {
      'class': 'loading'
    });

    formEl.prependTo('#permissions');

   $.get(
     getPermissionsPath(),
     { relation_id: relVal },
     function(html) {
       $('#permissions').find('.loading').hide();
       formEl.html(html);
       radioInput.attr('data-loaded', 'true');

       SS.Permission.initForm(formEl);
     },
    'html');
  };

  var initPermission = function() {
    $('#permissions').find('.loading').hide();
  };

  var addToList = function(options) {
    var list = getListEl();

    $('#new_relation').before(options.relation.html);

    initList($('#relation_custom_' + options.relation.id));
  };

  var resetNameForm = function(options) {
    if (options.section !== 'name')
      return;

    var el = $('#relation_custom_' + options.relation.id);

    el.find('label').text(options.relation.name);
    el.find('input[name="relation_custom[name]"]').val(options.relation.name);

    hideEditForms();
  };

  var resetPermissionForm = function(options) {
    if (options.section !== 'permissions')
      return;

    $('#permissions').find('.loading').hide();

    SS.Permission.enableForm('#relation_' + options.relation.id + '_permissions');
  };

  var resetNewForm = function() {
    var el = $('#new_relation');

    el.find('.new_relation_custom').hide();

    el.find('input[name="relation_custom[name]"]').val('');
  };

  var selectNewItem = function(options) {
    $('input[name^="relation"][value="' + options.relation.id + '"]').click();
  };

  var hideElement = function(options) {
    $('#relation_custom_' + options.relation.id).hide();
    $('#relation_' + options.relation.id + '_permissions').hide();
  };

  callback.register('index',
                    initList,
                    initPermission);

  callback.register('create',
                     addToList,
                     resetNewForm,
                     selectNewItem);

  callback.register('update',
                    resetNameForm,
                    resetPermissionForm);

  callback.register('destroy', hideElement);

  return callback.extend({
  });

})(SocialStream, jQuery);