MiraitSystems/enju_trunk

View on GitHub
app/views/manifestations/_form_classification_field.html.erb

Summary

Maintainability
Test Coverage
<script>
  /**
   * 分類フィールド
   * 
   */
  var ItemFieldClassificationSelect2 = {
    // Classification select2 options
    classificationSlect2options: {
      multiple: false,
      minimumInputLength: 1,
      width: "260px",
      allowClear: true,
      placeholder: <%= raw t("classification.search_placeholder").to_json %>,
      formatNoMatches: function(term) {
        return "'" + term + "' " + <%= raw t("classification.search_nomatch").to_json %>;
      },
      formatSearching: function() {
        return <%= raw t("classification.search_searching").to_json %>;
      },
      formatInputTooShort: function(term, minLength){
        return <%= raw t("classification.search_placeholder").to_json %>;
      },
      ajax: {
        url: "/classifications/search_name.json",
        dataType: 'json',
        data: function (term, page) {
          var currentNumber = $(this).attr('id').match(/\d+/);
          var classificationTypeId = $('#classifications_' + currentNumber + '_classification_type_id').val();
          return {
            classification_type_id: classificationTypeId,
            search_phrase: term,
          };
        },
        results: function (data, page) {
            return {results: data};
        },
      },
      initSelection: function(element, callback) {
        var id = $(element).val();
        if (id != "") {
          $.ajax("/classifications/search_name.json?classification_id=" + id, {
              dataType: "json"
         }).done(function(data) { callback(data); });
        }
      },
    },
    // ClassificationType select2 options
    classificationTypeSlect2options: {
      width: "200px",
      matcher: function(term, text, opt) {
        return text.toUpperCase().indexOf(term.toUpperCase())==0
            || opt.attr("alt").toUpperCase().indexOf(term.toUpperCase())==0;
      },
    },
    currentNumber : <%= raw (@classifications.size).to_json %>,
    actionTemplate : ''
      + '<%= button_to_function t('page.add_line'), "ItemFieldClassificationSelect2.add()" %>'
      + '<%= button_to_function t('page.del_line'), "ItemFieldClassificationSelect2.remove(__count__)" %>',
    add : function () {
      var newField = $("<div/>").attr("id", "CLASSIFICATION" + this.currentNumber).attr('class', 'row2');
      var classificationTypeFieldId = $("div[id ^= 'CLASSIFICATION']:first").find("select[id $= 'classification_type_id']").attr('id');
      var classificationFieldId = $("div[id ^= 'CLASSIFICATION']:first").find("input[id $= 'classification_id']").attr('id');
      var cloneClassificationType = this.cloneField(classificationTypeFieldId);
      var cloneClassificationId = this.cloneField(classificationFieldId);
      var actionButton = this.actionTemplate.replace(/__count__/mg, this.currentNumber);
      
      newField.append(cloneClassificationType).append(cloneClassificationId).append(actionButton);

      cloneClassificationType.select2(this.classificationTypeSlect2options);
      cloneClassificationId.val('');
      cloneClassificationId.select2(this.classificationSlect2options);

      $("#classifications").append(newField);

      this.currentNumber += 1;
    },
    remove : function (trNumber) {
      if($("div[id ^= 'CLASSIFICATION']").length == 1) this.add();
      removeDivField('CLASSIFICATION', trNumber);
    },
    cloneField : function (fieldId) {
      return $('#' + fieldId).clone().attr({
          'id' : $('#' + fieldId).attr('id').replace(/_\d+_/, '_' + this.currentNumber + '_'),
          'name' : $('#' + fieldId).attr('name').replace(/\[\d+\]/, '[' + this.currentNumber + ']'),
      });
    },
  };
  
  $(document).ready(function() {
    $("select[id $= 'classification_type_id']").select2(ItemFieldClassificationSelect2.classificationTypeSlect2options);
    $("input[id $= 'classification_id']").select2(ItemFieldClassificationSelect2.classificationSlect2options);
  });

  /**
   * ClassificationType deselect
   * 
   */
  $(document).on("select2-selecting", "select[id $= 'classification_type_id']", function(e){
    var targetId = e.target.id
    var targetNumber = targetId.match(/_(\d+)_/);
    $("#classifications_" + targetNumber[1] + "_classification_id").select2('val', '');
  });

</script>

<div class="row">
  <div><%= f.label t('activerecord.models.classification') -%></div>
  <div id="classifications">
    <% @classifications.each_with_index do |classification, index| -%>
      <div id="CLASSIFICATION<%= index %>" class="row2">
        <%= select2_tag("classifications_#{index}_classification_type_id", 
                        "classifications[][classification_type_id]", 
                        @classification_types,
                        classification[:classification_type_id],
                        :width => 200, :select_attribute => :id, :display_attribute => :display_name
                        ) %>
        <%= text_field_tag "classifications[][classification_id]",
          classification[:classification_id], 
          :id => "classifications_#{index}_classification_id", 
          :class => "classification_id" %>
        <%= button_to_function t('page.add_line'), "ItemFieldClassificationSelect2.add()" %>
        <%= button_to_function t('page.del_line'), "ItemFieldClassificationSelect2.remove(#{index})" %>
      </div>
    <% end %>
  </div>
</div>