houston/houston-core

View on GitHub
app/views/projects/_form.html.erb

Summary

Maintainability
Test Coverage
<%= form_for @project, :html => { :class => "form-horizontal" } do |f| %>
  <fieldset>
    <div class="control-group">
      <%= f.label :name, :class => "control-label" %>
      <div class="controls">
        <%= f.text_field :name, class: "text_field", autocomplete: "off" %>
      </div>
    </div>

    <div class="control-group">
      <%= f.label :slug, :class => "control-label" %>
      <div class="controls">
        <%= f.text_field :slug, :class => "text_field" %>
      </div>
    </div>

    <div class="control-group">
      <%= f.label :team_id, :class => "control-label" %>
      <div class="controls">
        <%= f.select :team_id, [["", nil]] + Team.all.pluck(:name, :id), :class => "select_field" %>
      </div>
    </div>

    <div class="control-group">
      <%= f.label :color_name, :class => "control-label" %>
      <div class="controls">
        <%= f.select :color_name, [["None", "default"]] + Houston.config.project_colors.keys.map { |name| [name.titleize, name] }, :class => "select_field" %>
        <% if Project.count > 0 %>
          (Unused colors: <%= (Houston.config.project_colors.keys - Project.pluck(:color_name).uniq).map(&:titleize).join(", ") %>)
        <% end %>
      </div>
    </div>

    <% Project.adapters.each do |_, adapter| %>

      <hr />

      <div class="control-group project-adapter" id="<%= adapter.attribute_name %>">
        <label class="control-label"><%= adapter.title %></label>
        <div class="controls">
          <div class="project-adapters">
            <% adapter.namespace.adapters.each do |name| %>
              <%= f.label "#{adapter.attribute_name}_name_#{name.to_s.downcase}", :class => "inline-label project-adapter-option" do %>
                <%= f.radio_button "#{adapter.attribute_name}_name", name, name: "project[props][#{adapter.prop_name}]" %>
                <%= name.titleize %>
              <% end %>
            <% end %>
          </div>
          <% adapter.namespace.adapters.each do |name| %>
            <div class="project-adapter-fields" data-adapter="<%= name %>">
              <% adapter.namespace.adapter(name).parameters.each do |parameter| %>
                <% errors = @project.errors[parameter].flatten %>
                <%= label_tag "project[props][#{parameter}]", parameter.to_s.gsub("_", " ").gsub(/\b('?[a-z])/) { $1.capitalize } %>
                <%= text_field_tag "project[props][#{parameter}]", @project.props[parameter.to_s], :class => "text_field #{"error" if errors.any?}" %>
                <% if errors.any? %>
                  <span class="help-inline">&nbsp;<%= errors.to_sentence %></span>
                <% end %>
              <% end %>
            </div>
          <% end %>
        </div>
      </div>

    <% end %>

    <% if (features = Houston.config.project_features - [:settings]).any? %>
      <hr />

      <div class="control-group">
        <label class="control-label">Features</label>
        <div class="controls" style="padding-top: 5px; padding-bottom: 5px;">
          <% features.each do |feature_slug| %>
            <% feature = Houston.project_features[feature_slug] %>
            <label for="selected_features_<%= feature_slug %>">
              <%= check_box_tag "project[selected_features][]", feature_slug, @project.feature?(feature_slug), id: "selected_features_#{feature_slug}", class: "project-feature" %>
              <%= feature.name %>
            </label>

            <% if feature.fields.any? %>
              <div class="project-feature-fields" data-feature="<%= feature_slug %>">
                <%= f.fields_for :props, @project.props do |f| %>
                  <% feature.fields.each do |form| %>
                    <div class="project-feature-field">
                      <%= form.render(self, f) %>
                    </div>
                  <% end %>
                <% end %>
              </div>
            <% end %>
          <% end %>
        </div>
      </div>
    <% end %>


    <%= render_props_fields(f, "edit_project") %>


    <div class="form-actions">
      <%= f.submit nil, :class => "btn btn-primary" %>
      <%= link_to "Cancel", projects_path, :class => "btn" %>

      <% if @project.persisted? && can?(:destroy, @project) %>
        <button class="btn btn-delete btn-danger" id="retire_project_button">Retire</button>
      <% end %>
    </div>
  </fieldset>
<% end %>

<% content_for :javascripts do %>
<script type="text/javascript">
  $(function() {
    function dasherize(word) {
      return word.replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')
        .replace(/([a-z\d])([A-Z])/g, '$1-$2')
        .toLowerCase()
        .replace(/[^a-z0-9_\-]/g, '-');
    }

    var $name = $('#project_name'),
        $slug = $('#project_slug'),
        prevSlug = dasherize($name.val());
    $name.keyup(function() {
      var name = $name.val(),
          slug = dasherize(name);
      if($slug.val() == prevSlug) {
        $slug.val(slug);
        prevSlug = slug;
      }
    });

    function showProjectAdapterParameters($div) {
      var selectedAdapter = $div.find(':radio:checked').val();
      $div.find('.project-adapter-fields').hide();
      $div.find('.project-adapter-fields[data-adapter="' + selectedAdapter + '"]').show();
    }

    function showProjectFeatureParameters() {
      $('.project-feature').each(function() {
        var $checkbox = $(this);
        $('.project-feature-fields[data-feature="' + $checkbox.val() + '"]')
          .toggle($checkbox.prop('checked'));
      });
    }

    if(window.location.hash) {
      $(window.location.hash).addClass('highlight');
    }

    $('.project-adapter').each(function() {
      var $div = $(this);
      $div.delegate(':radio', 'click', function() { showProjectAdapterParameters($div); });
      showProjectAdapterParameters($div);
    });

    $('.project-feature').click(showProjectFeatureParameters);
    showProjectFeatureParameters();

    <% if @project.persisted? && can?(:destroy, @project) %>
    $('#retire_project_button').click(function(e) {
      e.preventDefault();
      $.put('<%= retire_project_path(@project) %>')
        .success(function() { window.location = '/projects'; })
        .error(function() { console.log(arguments); });
    });
    <% end %>
  });
</script>
<% end %>