MiraitSystems/enju_trunk

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

Summary

Maintainability
Test Coverage
<script>
  var agentSlect2options = {
    multiple: false,
    minimumInputLength: 1,
    width: "250px",
    allowClear: true,
    placeholder: <%= raw t("agent.search_placeholder").to_json %>,
    formatNoMatches: function(term) {
      return "'" + term + "' " + <%= raw t("agent.search_nomatch").to_json %>;
    },
    formatSearching: function() {
      return <%= raw t("agent.search_searching").to_json %>;
    },
    formatInputTooShort: function(term, minLength){
      return <%= raw t("agent.search_placeholder").to_json %>;
    },
    ajax: {
      url: "/agents/search_name.json",
      dataType: 'json',
      data: function (term, page) {
          return {search_phrase: term,
          };
      },
      results: function (data, page) {
          return {results: data};
      },
    },
    initSelection: function(element, callback) {
      var id = $(element).val();
      if (id != "" && id == parseInt(id)) {
        $.ajax("/agents/search_name.json?agent_id=" + id, {
            dataType: "json"
       }).done(function(data) { callback(data); });
      }
      else{
        callback({ id: id, text: id });
      }
    },
    <% unless SystemConfiguration.get("add_only_exist_agent") %>
      createSearchChoice: function(term, data) {
        if ($(data).filter(function() {
          return this.text.localeCompare(term)===0; }).length===0) {
          return {id:term, text:term};
        }
      },
    <% end %>
  };

  var agentTypeSlect2options = {
    width: "250px",
    matcher: function(term, text, opt) {
      return text.toUpperCase().indexOf(term.toUpperCase())==0
          || opt.attr("alt").toUpperCase().indexOf(term.toUpperCase())==0;
    },
  };

  $(document).ready(function() {
    $(".creator, .contributor, .publisher").select2(agentSlect2options);
    $("select[name $= 'create_type_id']").select2(agentTypeSlect2options);
    $("select[name $= 'realize_type_id']").select2(agentTypeSlect2options);
    $("select[name $= 'produce_type_id']").select2(agentTypeSlect2options);
  });

  /**
   * select2 選択時の値代入
   * 
   */
  $(document)
    .on("select2-selecting select2-removed", ".creator", function(e){
      var targetId = e.target.id
      var targetNumber = targetId.match(/_(\d+)_/);
      if (e.type == 'select2-removed') {
          $("#creators_" + targetNumber[1] + "_full_name_transcription").val('');
      }
      else if(e.val == parseInt(e.val)){
          $("#creators_" + targetNumber[1] + "_id").val(e.object.id);
          $("#creators_" + targetNumber[1] + "_full_name").val(e.object.text);
          $("#creators_" + targetNumber[1] + "_full_name_transcription").val(e.object.full_name_transcription);
      }
      else{
          $("#creators_" + targetNumber[1] + "_id").val('');
          $("#creators_" + targetNumber[1] + "_full_name").val(e.object.id);
      }
    })
    .on("select2-selecting select2-removed", ".contributor", function(e){
      var targetId = e.target.id
      var targetNumber = targetId.match(/_(\d+)_/);
      if(e.type == 'select2-removed'){
          $("#contributors_" + targetNumber[1] + "_full_name_transcription").val('');
      }
      else if(e.val == parseInt(e.val)){
          $("#contributors_" + targetNumber[1] + "_id").val(e.object.id);
          $("#contributors_" + targetNumber[1] + "_full_name").val(e.object.text);
          $("#contributors_" + targetNumber[1] + "_full_name_transcription").val(e.object.full_name_transcription);
      }
      else{
          $("#contributors_" + targetNumber[1] + "_id").val('');
          $("#contributors_" + targetNumber[1] + "_full_name").val(e.object.id);
      }
    })
    .on("select2-selecting select2-removed", ".publisher", function(e){
      var targetId = e.target.id
      var targetNumber = targetId.match(/_(\d+)_/);
      if(e.type == 'select2-removed'){
          $("#publishers_" + targetNumber[1] + "_full_name_transcription").val('');
      }
      else if(e.val == parseInt(e.val)){
          $("#publishers_" + targetNumber[1] + "_id").val(e.object.id);
          $("#publishers_" + targetNumber[1] + "_full_name").val(e.object.text);
          $("#publishers_" + targetNumber[1] + "_full_name_transcription").val(e.object.full_name_transcription);
      }
      else{
          $("#publishers_" + targetNumber[1] + "_id").val('');
          $("#publishers_" + targetNumber[1] + "_full_name").val(e.object.id);
      }
    });

  /**
   * 著者 select2
   * 
   */
  var ItemFieldCreatorSelect2 = {
    currentNumber : <%= raw (@creators.size).to_json %>,
    actionTemplate : ''
      + '<%= button_to_function t('page.add_line'), "ItemFieldCreatorSelect2.add()" -%>'
      + '<%= button_to_function t('page.del_line'), "ItemFieldCreatorSelect2.remove(__count__)" -%>',
    add : function () {
      var newField = $("<div/>").attr("id", "CF" + this.currentNumber).attr("class", 'row2');
      
      var idFieldId = $("div[id ^= 'CF']:first").find("input[id $= 'id']").attr('id');
      var cloneId = this.cloneField(idFieldId);
      var actionButton = this.actionTemplate.replace(/__count__/mg, this.currentNumber);
      var div1 = $("<div/>");
      var div2 = $("<div/>");

      <% if SystemConfiguration.get("use_agent_type") %>
        var typeFieldId = $("div[id ^= 'CF']:first").find("select[id $= 'type_id']").attr('id');
        var cloneCreatorType = this.cloneFieldWithoutValue(typeFieldId);
        div1.append(cloneCreatorType);
        cloneCreatorType.select2(agentTypeSlect2options);
      <% end %>
      
      <% if SystemConfiguration.get("add_only_exist_agent") %>
        div2.append(cloneId).append(actionButton);
      <% else %>
        var nameFieldId = $("div[id ^= 'CF']:first").find("input[id $= 'full_name']").attr('id');
        var transcriptionFieldId = $("div[id ^= 'CF']:first").find("input[id $= 'full_name_transcription']").attr('id');
        var cloneName = this.cloneField(nameFieldId);
        var cloneFullNameTranscription = this.cloneField(transcriptionFieldId);
        div2.append(cloneId).append(cloneName).append(cloneFullNameTranscription).append(actionButton);
      <% end %>
      cloneId.select2(agentSlect2options);
      newField.append(div1).append(div2);
      $("#creator_field > #creators").append(newField);

      this.currentNumber += 1;
    },
    cloneField : function (fieldId) {
      return $('#' + fieldId).clone().attr({
          'id' : $('#' + fieldId).attr('id').replace(/_\d+_/, '_' + this.currentNumber + '_'),
          'name' : $('#' + fieldId).attr('name').replace(/\[\d+\]/, '[' + this.currentNumber + ']'),
      }).val('');
    },
    cloneFieldWithoutValue : function (fieldId) {
      return $('#' + fieldId).clone().attr({
          'id' : $('#' + fieldId).attr('id').replace(/_\d+_/, '_' + this.currentNumber + '_'),
          'name' : $('#' + fieldId).attr('name').replace(/\[\d+\]/, '[' + this.currentNumber + ']'),
      });
    },
    remove : function (div_num) {
      if($("div[id ^= 'CF']").length == 1) this.add();
      removeDivField('CF', div_num);
    }
  }

  /**
   * 協力者 select2
   * 
   */
  var ItemFieldContributorSelect2 = {
    currentNumber : <%= raw (@contributors.size).to_json %>,
    actionTemplate : ''
      + '<%= button_to_function t('page.add_line'), "ItemFieldContributorSelect2.add()" -%>'
      + '<%= button_to_function t('page.del_line'), "ItemFieldContributorSelect2.remove(__count__)" -%>',
    add : function () {
      var newField = $("<div/>").attr("id", "RF" + this.currentNumber).attr("class", 'row2');
      
      var idFieldId = $("div[id ^= 'RF']:first").find("input[id $= 'id']").attr('id');
      var cloneId = this.cloneField(idFieldId);
      var actionButton = this.actionTemplate.replace(/__count__/mg, this.currentNumber);
      var div1 = $("<div/>");
      var div2 = $("<div/>");

      <% if SystemConfiguration.get("use_agent_type") %>
        var typeFieldId = $("div[id ^= 'RF']:first").find("select[id $= 'type_id']").attr('id');
        var cloneContributorType = this.cloneFieldWithoutValue(typeFieldId);
        div1.append(cloneContributorType);
        cloneContributorType.select2(agentTypeSlect2options);
      <% end %>
      
      <% if SystemConfiguration.get("add_only_exist_agent") %>
        div2.append(cloneId).append(actionButton);
      <% else %>
        var nameFieldId = $("div[id ^= 'RF']:first").find("input[id $= 'full_name']").attr('id');
        var transcriptionFieldId = $("div[id ^= 'RF']:first").find("input[id $= 'full_name_transcription']").attr('id');
        var cloneName = this.cloneField(nameFieldId);
        var cloneFullNameTranscription = this.cloneField(transcriptionFieldId);
        div2.append(cloneId).append(cloneName).append(cloneFullNameTranscription).append(actionButton);
      <% end %>
      cloneId.select2(agentSlect2options);
      newField.append(div1).append(div2);
      $("#contributor_field > #contributors").append(newField);

      this.currentNumber += 1;
    },
    cloneField : function (fieldId) {
      return $('#' + fieldId).clone().attr({
          'id' : $('#' + fieldId).attr('id').replace(/_\d+_/, '_' + this.currentNumber + '_'),
          'name' : $('#' + fieldId).attr('name').replace(/\[\d+\]/, '[' + this.currentNumber + ']'),
      }).val('');
    },
    cloneFieldWithoutValue : function (fieldId) {
      return $('#' + fieldId).clone().attr({
          'id' : $('#' + fieldId).attr('id').replace(/_\d+_/, '_' + this.currentNumber + '_'),
          'name' : $('#' + fieldId).attr('name').replace(/\[\d+\]/, '[' + this.currentNumber + ']'),
      });
    },
    remove : function (div_num) {
      if($("div[id ^= 'RF']").length == 1) this.add();
      removeDivField('RF', div_num);
    }
  }

  /**
   * 出版者 select2
   * 
   */
  var ItemFieldPublisherSelect2 = {
    currentNumber : <%= raw (@publishers.size).to_json %>,
    actionTemplate : ''
      + '<%= button_to_function t('page.add_line'), "ItemFieldPublisherSelect2.add()" -%>'
      + '<%= button_to_function t('page.del_line'), "ItemFieldPublisherSelect2.remove(__count__)" -%>',
    add : function () {
      var newField = $("<div/>").attr("id", "PF" + this.currentNumber).attr("class", 'row2');
      
      var idFieldId = $("div[id ^= 'PF']:first").find("input[id $= 'id']").attr('id');
      var cloneId = this.cloneField(idFieldId);
      var actionButton = this.actionTemplate.replace(/__count__/mg, this.currentNumber);
      var div1 = $("<div/>");
      var div2 = $("<div/>");

      <% if SystemConfiguration.get("use_agent_type") %>
        var typeFieldId = $("div[id ^= 'PF']:first").find("select[id $= 'type_id']").attr('id');
        var clonePublisherType = this.cloneFieldWithoutValue(typeFieldId);
        div1.append(clonePublisherType);
        clonePublisherType.select2(agentTypeSlect2options);
      <% end %>
      
      <% if SystemConfiguration.get("add_only_exist_agent") %>
        div2.append(cloneId).append(actionButton);
      <% else %>
        var nameFieldId = $("div[id ^= 'PF']:first").find("input[id $= 'full_name']").attr('id');
        var transcriptionFieldId = $("div[id ^= 'PF']:first").find("input[id $= 'full_name_transcription']").attr('id');
        var cloneName = this.cloneField(nameFieldId);
        var cloneFullNameTranscription = this.cloneField(transcriptionFieldId);
        div2.append(cloneId).append(cloneName).append(cloneFullNameTranscription).append(actionButton);
      <% end %>
      cloneId.select2(agentSlect2options);
      newField.append(div1).append(div2);
      $("#publisher_field > #publishers").append(newField);

      this.currentNumber += 1;
    },
    cloneField : function (fieldId) {
      return $('#' + fieldId).clone().attr({
          'id' : $('#' + fieldId).attr('id').replace(/_\d+_/, '_' + this.currentNumber + '_'),
          'name' : $('#' + fieldId).attr('name').replace(/\[\d+\]/, '[' + this.currentNumber + ']'),
      }).val('');
    },
    cloneFieldWithoutValue : function (fieldId) {
      return $('#' + fieldId).clone().attr({
          'id' : $('#' + fieldId).attr('id').replace(/_\d+_/, '_' + this.currentNumber + '_'),
          'name' : $('#' + fieldId).attr('name').replace(/\[\d+\]/, '[' + this.currentNumber + ']'),
      });
    },
    remove : function (div_num) {
      if($("div[id ^= 'PF']").length == 1) this.add();
      removeDivField('PF', div_num);
    }
  }
</script>

<div class="row" id="creator_field">
  <div><strong><%= t('agent.creator') %></strong></div>
  <div id="creators">
    <% @creators.each_with_index do |creator, index| -%>
      <div id="CF<%= index %>" class="row2">
        <% if SystemConfiguration.get("use_agent_type") %>
          <%= select2_tag(
            "creators_#{index}_type_id", 
            "creators[][type_id]", 
            @create_types,
            (creator[:create_type_id] || creator["type_id"]).to_i, 
            :width => 250, :select_attribute => :id, :display_attribute => :display_name 
          ) %><br />
        <% end %>
        <% if SystemConfiguration.get("add_only_exist_agent") %>
          <%= text_field_tag "creators[][id]", creator[:agent_id] || creator["id"], :id => "creators_#{index}_id", :class => "creator" %>
        <% else %>
          <%= text_field_tag "creators[][id]", creator[:agent_id] || creator["id"], :id => "creators_#{index}_id", :class => "creator" %>
          <%= hidden_field_tag "creators[][full_name]", (creator.agent.try(:full_name) rescue creator["full_name"]), :id => "creators_#{index}_full_name" %>
          <%= text_field_tag "creators[][full_name_transcription]", (creator.agent.try(:full_name_transcription) rescue creator["full_name_transcription"]),
              :id => "creators_#{index}_full_name_transcription", :class => 'medium_string', 
              :placeholder => t("activerecord.attributes.agent.full_name_transcription") 
          %>
        <% end %>
        <%= button_to_function t('page.add_line'), "ItemFieldCreatorSelect2.add()" -%>
        <%= button_to_function t('page.del_line'), "ItemFieldCreatorSelect2.remove(#{index})" -%>
      </div>
    <% end %>
  </div>
</div>

<div class="row" id="contributor_field">
  <div><strong><%= t('agent.contributor') %></strong></div>
  <div id="contributors">
    <% @contributors.each_with_index do |contributor, index| -%>
      <div id="RF<%= index %>" class="row2">
        <% if SystemConfiguration.get("use_agent_type") %>
          <%= select2_tag(
            "contributors_#{index}_type_id", 
            "contributors[][type_id]", 
            @realize_types,
            (contributor[:realize_type_id] || contributor["type_id"]).to_i, 
            :width => 250, :select_attribute => :id, :display_attribute => :display_name 
          ) %><br />
        <% end %>
        <% if SystemConfiguration.get("add_only_exist_agent") %>
          <%= text_field_tag "contributors[][id]", contributor[:agent_id] || contributor["id"], :id => "contributors_#{index}_id", :class => "contributor" %>
        <% else %>
            <%= text_field_tag "contributors[][id]", contributor[:agent_id] || contributor["id"], :id => "contributors_#{index}_id", :class => "contributor" %>
            <%= hidden_field_tag "contributors[][full_name]", (contributor.agent.try(:full_name) rescue contributor["full_name"]), :id => "contributors_#{index}_full_name" %>
            <%= text_field_tag "contributors[][full_name_transcription]", (contributor.agent.try(:full_name_transcription) rescue contributor["full_name_transcription"]),
              :id => "contributors_#{index}_full_name_transcription", :class => 'medium_string',
              :placeholder => t("activerecord.attributes.agent.full_name_transcription") 
            %>
        <% end %>
        <%= button_to_function t('page.add_line'), "ItemFieldContributorSelect2.add()" -%>
        <%= button_to_function t('page.del_line'), "ItemFieldContributorSelect2.remove(#{index})" -%>
      </div>
    <% end %>
  </div>
</div>

<div class="row" id="publisher_field">
  <div><strong><%= t('agent.publisher') %></strong></div>
  <div id="publishers">
    <% @publishers.each_with_index do |publisher, index| -%>
      <div id="PF<%= index %>" class="row2">
        <% if SystemConfiguration.get("use_agent_type") %>
          <%= select2_tag(
            "publishers_#{index}_type_id", 
            "publishers[][type_id]", 
            @produce_types,
            (publisher[:produce_type_id] || publisher["type_id"]).to_i, 
            :width => 250, :select_attribute => :id, :display_attribute => :display_name 
          ) %><br />
        <% end %>
        <% if SystemConfiguration.get("add_only_exist_agent") %>
          <%= text_field_tag "publishers[][id]", publisher[:agent_id] || publisher["id"], :id => "publishers_#{index}_id", :class => "publisher" %>
        <% else %>
            <%= text_field_tag "publishers[][id]", publisher[:agent_id] || publisher["id"], :id => "publishers_#{index}_id", :class => "publisher" %>
            <%= hidden_field_tag "publishers[][full_name]", (publisher.agent.try(:full_name) rescue publisher["full_name"]), :id => "publishers_#{index}_full_name" %>
            <%= text_field_tag "publishers[][full_name_transcription]", (publisher.agent.try(:full_name_transcription) rescue publisher["full_name_transcription"]),
              :id => "publishers_#{index}_full_name_transcription", :class => 'medium_string',
              :placeholder => t("activerecord.attributes.agent.full_name_transcription") 
            %>
        <% end %>
        <%= button_to_function t('page.add_line'), "ItemFieldPublisherSelect2.add()" -%>
        <%= button_to_function t('page.del_line'), "ItemFieldPublisherSelect2.remove(#{index})" -%>
      </div>
    <% end %> 
  </div>
</div>