app/views/projects/_form.html.erb
<%= 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"> <%= 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 %>