migrate project creation

This commit is contained in:
Reinier Balt 2010-10-16 16:45:08 +02:00
parent 36e63a4ad9
commit 4413cabbba
12 changed files with 152 additions and 94 deletions

View file

@ -10,6 +10,7 @@ class ProjectsController < ApplicationController
def index
@source_view = params['_source_view'] || 'project_list'
@projects = current_user.projects
@new_project = current_user.projects.build
if params[:projects_and_actions]
projects_and_actions
else
@ -73,6 +74,7 @@ class ProjectsController < ApplicationController
render_failure "Expected post format is valid xml like so: <request><project><name>project name</name></project></request>."
return
end
@project = current_user.projects.build
params_are_invalid = true
if (params['project'] || (params['request'] && params['request']['project']))
@ -81,9 +83,11 @@ class ProjectsController < ApplicationController
end
@go_to_project = params['go_to_project']
@saved = @project.save
@project_not_done_counts = { @project.id => 0 }
@active_projects_count = current_user.projects.active.count
@contexts = current_user.contexts
respond_to do |format|
format.js { @down_count = current_user.projects.size }
format.xml do
@ -95,6 +99,7 @@ class ProjectsController < ApplicationController
head :created, :location => project_url(@project), :text => @project.id
end
end
format.html {redirect_to :action => 'index'}
end
end

View file

@ -0,0 +1,40 @@
<div id="project_new_project_container">
<div id="toggle_project_link" class="hide_form">
<a id="toggle_project_new" href="#" title="<%= t('projects.hide_new_project_form') %>" accesskey="n">&laquo; <%= t('projects.hide_form') %></a>
</div>
<div id="project_new" class="project_new" style="display:block">
<% form_for(@new_project, :html => {:id => 'project_form',:name=>'project',:class => "inline-form", :method => :post }) do -%>
<div id="error_status"><%= error_messages_for("project") %></div>
<label for="project_name"><%= Project.human_attribute_name(:name) %>:</label><br />
<%= text_field 'project', 'name', "tabindex" => 1 %><br />
<label for="project_description"><%= Project.human_attribute_name(:description) %> (<%= t('common.optional') %>):</label><br />
<%= text_area 'project', 'description', "cols" => 30, "rows" => 4, "tabindex" => 2 %><br />
<% unless @contexts.empty? -%>
<label for="default_context_name"><%= Project.human_attribute_name(:default_context_name) %> (<%= t('common.optional') %>):</label><br />
<%= text_field_tag("project[default_context_name]", @new_project.default_context.name, :tabindex => 3) %>
<br />
<% end -%>
<label for="default_tags"><%= Project.human_attribute_name(:default_tags) %> (<%= t('common.optional') %>):</label><br />
<%= text_field_tag("project[default_tags]", @new_project.default_tags, :tabindex => 4) %>
<br/>
<div class="submit_box">
<div class="widgets">
<button type="submit" class="positive" id="project_new_project_submit">
<%= image_tag("accept.png", :alt => "") + t('projects.add_project') %>
</button>
</div>
</div>
<input id="go_to_project" type="checkbox" tabindex="5" name="go_to_project"/><label for="go_to_project"><%= t('projects.to_new_project_page') %></label><br />
<% end -%>
</div>
</div>

View file

@ -0,0 +1,48 @@
<% if @saved -%>
<% if @go_to_project %>
redirect_to ("<%= project_path(@project) %>")
<% end %>
hide_errors();
hide_empty_msg();
set_page_badge(<%= @down_count %>);
update_active_projects_container();
add_project();
clear_form();
<% else -%>
show_errors();
<% end -%>
function show_errors() {
$('div#error_status').html(html_for_error_messages());
$('div#error_status').show();
}
function hide_errors() {
$('div#error_status').hide();
}
function hide_empty_msg() {
$('projects-empty-nd').hide();
}
function add_project() {
$('#list-active-projects').append(html_for_project_listing);
}
function clear_form() {
$('#project_form').clearForm();
$('#project_form input:text:first').focus();
}
function update_active_projects_container() {
ProjectListPage.set_state_container_visibility('active', true);
ProjectListPage.update_state_count('active', <%=@active_projects_count%>);
}
function html_for_error_messages() {
return "<%= escape_javascript(error_messages_for('project')) %>";
}
function html_for_project_listing() {
return "<%= @saved ? escape_javascript(render(:partial => 'project_listing', :locals => { :project_listing => @project })) : "" %>";
}

View file

@ -1,17 +0,0 @@
if @saved and @go_to_project
page.redirect_to project_path(@project)
elsif @saved
page.hide 'status'
page['badge_count'].replace_html @down_count
page.hide 'projects-empty-nd'
page.show 'list-active-projects-container'
page.replace_html "active-projects-count", @active_projects_count
page.insert_html :bottom, "list-active-projects", :partial => 'project_listing', :locals => { :project_listing => @project }
page.sortable "list-active-projects", get_listing_sortable_options('list-active-projects')
page << "$('#project-form').clearForm();"
page << "$('#project-form input:text:first').focus();"
else
page.show 'status'
page.replace_html 'status', "#{error_messages_for('project')}"
end
page.hide "busy"

View file

@ -1,7 +1,7 @@
remove_deleted_project();
ProjectListPage.update_state_count(<%=@active_projects_count%>, <%=@hidden_projects_count%>, <%=@completed_projects_count%>)
ProjectListPage.show_or_hide_state_container(<%= @show_active_projects %>, <%= @show_hidden_projects %>, <%= @show_completed_projects %>);
page_notify('notice', "Deleted project '#{@project.name}'", 5);
ProjectListPage.update_all_states_count(<%=@active_projects_count%>, <%=@hidden_projects_count%>, <%=@completed_projects_count%>)
ProjectListPage.show_or_hide_all_state_containers(<%= @show_active_projects %>, <%= @show_hidden_projects %>, <%= @show_completed_projects %>);
page_notify('notice', "Deleted project '<%= @project.name%>'", 5);
set_page_badge(<%=@down_count%>);
function remove_deleted_project() {

View file

@ -7,60 +7,8 @@
<%= render :partial => 'project_state_group', :object => @completed_projects, :locals => { :state => 'completed'} %>
</div>
<% @project = @new_project -%>
<div id="input_box">
<div id="project_new_project_filler">
<div id="project_new_project_container">
<div id="toggle_project_link" class="hide_form">
<a id="toggle_project_new" href="#" title="<%= t('projects.hide_new_project_form') %>" accesskey="n">&laquo; <%= t('projects.hide_form') %></a>
</div>
<div id="project_new" class="project_new" style="display:block">
<% form_remote_tag(:url => projects_path, :method => :post,
:html=> { :id=>'project-form', :name=>'project', :class => 'inline-form'},
:before => "$('#project_new_project_submit').block({message:null})",
:complete => "$('#project_new_project_submit').unblock()") do -%>
<div id="status"><%= error_messages_for('project') %></div>
<label for="project_name"><%= Project.human_attribute_name(:name) %>:</label><br />
<%= text_field 'project', 'name', "tabindex" => 1 %><br />
<label for="project_description"><%= Project.human_attribute_name(:description) %> (<%= t('common.optional') %>):</label><br />
<%= text_area 'project', 'description', "cols" => 30, "rows" => 4, "tabindex" => 2 %><br />
<% unless @contexts.empty? -%>
<label for="default_context_name"><%= Project.human_attribute_name(:default_context_name) %> (<%= t('common.optional') %>):</label><br />
<%= text_field_tag("project[default_context_name]", @project.default_context.name, :tabindex => 3) %>
<br />
<% end -%>
<label for="default_tags"><%= Project.human_attribute_name(:default_tags) %> (<%= t('common.optional') %>):</label><br />
<%= text_field_tag("project[default_tags]", @project.default_tags, :tabindex => 4) %>
<br />
<br/>
<div class="submit_box">
<div class="widgets">
<button type="submit" class="positive" id="project_new_project_submit">
<%= image_tag("accept.png", :alt => "") + t('projects.add_project') %>
</button>
</div>
</div>
<br/><br/>
<input id="go_to_project" type="checkbox" tabindex="5" name="go_to_project"/><label for="go_to_project"><%= t('projects.to_new_project_page') %></label><br />
<% end -%>
</div>
</div>
<%= render :partial => 'new_project_form' %>
</div>
</div>
<script type="text/javascript">
window.onload=function(){
Nifty("div#project_new_project_container","normal");
}
</script>

View file

@ -10,9 +10,8 @@
replace_project_form_with_updated_project();
<% end -%>
update_sortable();
ProjectListPage.update_state_count(<%=@active_projects_count%>, <%=@hidden_projects_count%>, <%=@completed_projects_count%>)
ProjectListPage.show_or_hide_state_container(<%= @show_active_projects %>, <%= @show_hidden_projects %>, <%= @show_completed_projects %>);
ProjectListPage.update_all_states_count(<%=@active_projects_count%>, <%=@hidden_projects_count%>, <%=@completed_projects_count%>)
ProjectListPage.show_or_hide_all_state_containers(<%= @show_active_projects %>, <%= @show_hidden_projects %>, <%= @show_completed_projects %>);
<% else # assume source_view :project %>

View file

@ -56,7 +56,7 @@ Feature: Manage the list of projects
When I drag the project "manage me" below "upgrade jquery"
Then the project "upgrade jquery" should be above the project "manage me"
@selenium, @wip
@selenium
Scenario: Hiding and unhiding the new project form
When I go to the projects page
Then the new project form should be visible
@ -65,7 +65,14 @@ Feature: Manage the list of projects
When I follow "Create a new project »"
Then the new project form should be visible
@selenium, @wip
Scenario: Adding a new project
When I go to the projects page
And I submit a new project with name "finish cucumber tests for project"
Then I should see "finish cucumber tests for project"
And the badge should show 4
And the project list badge for "active" projects should show 4
Scenario: Adding a new project and take me to the project page
Scenario: Sorting the project alphabetically
Scenario: Sorting the project by number of task

View file

@ -26,6 +26,11 @@ When /^I drag the project "([^"]*)" below "([^"]*)"$/ do |project_drag, project_
selenium.mouse_up_at(drop_project_container_xpath,coord_string)
end
When /^I submit a new project with name "([^"]*)"$/ do |project_name|
fill_in "project[name]", :with => project_name
submit_new_project_form
end
Then /^the project "([^"]*)" should be above the project "([^"]*)"$/ do |project_high, project_low|
high_id = @current_user.projects.find_by_name(project_high).id
low_id = @current_user.projects.find_by_name(project_low).id

View file

@ -2,11 +2,18 @@ if ENV["RAILS_ENV"] == "selenium"
puts "Configuring to use Selenium with Webrat for Cucumber stories"
Webrat.configure do |config|
config.mode = :selenium
config.application_environment = :selenium
# use only if you run a separate rails test server instance and do not
# want webrat to start one for you
# config.application_port = 3001
config.selenium_browser_startup_timeout = 30
# use only if you run a separate selenium server instance and do not
# want webrat to start one for you
#config.selenium_server_address = "localhost"
# config.selenium_server_address = "localhost"
# config.selenium_server_port = "4444"
end
Cucumber::Rails::World.use_transactional_fixtures = false

View file

@ -11,6 +11,9 @@ module TracksStepHelper
selenium.click("xpath=//form[@id='context-form']//button[@id='context_new_submit']", :wait_for => :ajax, :javascript_framework => :jquery)
end
def submit_new_project_form
selenium.click("xpath=//form[@id='project_form']//button[@id='project_new_project_submit']", :wait_for => :ajax, :javascript_framework => :jquery)
end
end
World(TracksStepHelper)

View file

@ -45,26 +45,23 @@ var TracksForm = {
}
var ProjectListPage = {
update_state_count: function (active, hidden, completed) {
$('#active-projects-count').html(active);
$('#hidden-projects-count').html(hidden);
$('#completed-projects-count').html(completed);
update_state_count: function(state, count) {
$('#'+state+'-projects-count').html(count);
},
show_or_hide_state_container: function (show_active, show_hidden, show_completed) {
$(["active", "hidden", "completed"]).each(function() {
container = $('#list-'+this+'-projects-container');
set_state_container_visibility(container, eval('show_'+this));
});
function set_state_container_visibility (container, set_visible) {
update_all_states_count: function (active_count, hidden_count, completed_count) {
$(["active", "hidden", "completed"]).each(function() { ProjectListPage.update_state_count(this, eval(this+'_count')); });
},
show_or_hide_all_state_containers: function (show_active, show_hidden, show_completed) {
$(["active", "hidden", "completed"]).each(function() { ProjectListPage.set_state_container_visibility(this, eval('show_'+this)); });
},
set_state_container_visibility: function (state, set_visible) {
if (set_visible) {
container.slideDown("fast");
$('#list-'+state+'-projects-container').slideDown("fast");
} else {
container.slideUp("fast");
$('#list-'+state+'-projects-container').slideUp("fast");
}
}
}
}
}
$.fn.clearForm = function() {
return this.each(function() {
@ -147,6 +144,10 @@ todoItems = {
}
}
function redirect_to(path) {
$(window.location).attr('href', path);
}
function setup_container_toggles(){
// bind handlers
$('.container_toggle').click(function(evt){
@ -373,7 +374,8 @@ $(document).ready(function() {
Nifty("div#feedicons-project","normal");
Nifty("div#feedicons-context","normal");
Nifty("div#todo_new_action_container","normal");
Nifty("div#project_new_project_container","normal");
/* Moved from standard.html.erb layout */
$('ul.sf-menu').superfish({
delay: 250,
@ -604,6 +606,17 @@ $(document).ready(function() {
return false;
});
$("form#project_form button.positive").live('click', function (ev) {
$('form.#project_form').ajaxSubmit({
type: 'POST',
async: true,
buttons_dom_elem: $(this),
beforeSend: function() {this.buttons_dom_elem.block({message: null});},
complete: function() {this.buttons_dom_elem.unblock();}
});
return false;
});
$('#toggle_project_new').click(function(evt){
TracksForm.toggle('toggle_project_new', 'project_new', 'project-form',
'« Hide form', 'Hide new project form',