Merge https://github.com/daviscabral/redmine-budget-plugin into rm2.x
Conflicts: app/controllers/deliverables_controller.rb
This commit is contained in:
@@ -38,7 +38,6 @@ class DeliverablesController < ApplicationController
|
||||
# Action to preview the Deliverable description
|
||||
def preview
|
||||
@text = params[:deliverable][:description]
|
||||
render :partial => 'common/preview'
|
||||
end
|
||||
|
||||
# Saves a new Deliverable
|
||||
@@ -57,9 +56,9 @@ class DeliverablesController < ApplicationController
|
||||
if @deliverable.save
|
||||
@flash = l(:notice_successful_create)
|
||||
format.html { redirect_to :action => 'index' }
|
||||
format.js { render :action => 'create.js.rjs'}
|
||||
format.js
|
||||
else
|
||||
format.js { render :action => 'create_error.js.rjs'}
|
||||
format.js
|
||||
end
|
||||
end
|
||||
|
||||
@@ -67,7 +66,7 @@ class DeliverablesController < ApplicationController
|
||||
|
||||
# Builds the edit form for the Deliverable
|
||||
def edit
|
||||
@deliverable = Deliverable.find_by_id_and_project_id(params[:deliverable_id], params[:id])
|
||||
@deliverable = Deliverable.find_by_id_and_project_id(params[:deliverable_id], @project.id)
|
||||
end
|
||||
|
||||
# Updates an existing Deliverable, optionally changing it's type
|
||||
@@ -81,9 +80,9 @@ class DeliverablesController < ApplicationController
|
||||
respond_to do |format|
|
||||
if @deliverable.update_attributes(params[:deliverable])
|
||||
@flash = l(:notice_successful_create)
|
||||
format.html { redirect_to :action => 'index', :id => @project.id }
|
||||
format.html { redirect_to :action => 'index', :id => @project.identifier }
|
||||
else
|
||||
format.html { render :action => 'edit', :id => @project.id}
|
||||
format.html { render :action => 'edit', :id => @project.identifier }
|
||||
end
|
||||
end
|
||||
|
||||
@@ -98,7 +97,7 @@ class DeliverablesController < ApplicationController
|
||||
render_403 and return unless @deliverable.editable_by?(User.current)
|
||||
@deliverable.destroy
|
||||
flash[:notice] = l(:notice_successful_delete)
|
||||
redirect_to :action => 'index', :id => @project.id
|
||||
redirect_to :action => 'index', :id => @project.identifier
|
||||
end
|
||||
|
||||
# Create a query in the session and redirects to the issue list with that query
|
||||
@@ -114,7 +113,7 @@ class DeliverablesController < ApplicationController
|
||||
|
||||
session[:query] = {:project_id => @query.project_id, :filters => @query.filters}
|
||||
|
||||
redirect_to :controller => 'issues', :action => 'index', :project_id => @project.id
|
||||
redirect_to :controller => 'issues', :action => 'index', :project_id => @project.identifier
|
||||
end
|
||||
|
||||
# Assigns issues to the Deliverable based on their Version
|
||||
@@ -127,12 +126,12 @@ class DeliverablesController < ApplicationController
|
||||
number_updated = @deliverable.assign_issues_by_version(params[:version][:id])
|
||||
|
||||
flash[:notice] = l(:message_updated_issues, number_updated)
|
||||
redirect_to :action => 'index', :id => @project.id
|
||||
redirect_to :action => 'index', :id => @project.identifier
|
||||
end
|
||||
|
||||
private
|
||||
def find_project
|
||||
@project = Project.find(params[:id])
|
||||
@project = Project.where(:identifier => params[:id]).first || Project.find(params[:id])
|
||||
end
|
||||
|
||||
def get_settings
|
||||
@@ -152,13 +151,13 @@ class DeliverablesController < ApplicationController
|
||||
def sort_if_needed(deliverables)
|
||||
if session[@sort_name] && %w(score spent progress labor_budget).include?(session[@sort_name][:key])
|
||||
case session[@sort_name][:key]
|
||||
when "score":
|
||||
when "score" then
|
||||
sorted = deliverables.sort {|a,b| a.score <=> b.score}
|
||||
when "spent":
|
||||
when "spent" then
|
||||
sorted = deliverables.sort {|a,b| a.spent <=> b.spent}
|
||||
when "progress":
|
||||
when "progress" then
|
||||
sorted = deliverables.sort {|a,b| a.progress <=> b.progress}
|
||||
when "labor_budget":
|
||||
when "labor_budget" then
|
||||
sorted = deliverables.sort {|a,b| a.labor_budget <=> b.labor_budget}
|
||||
end
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ module DeliverablesHelper
|
||||
# TODO Later: Refactor since observers are not used anymore
|
||||
def field_with_budget_observer_and_totals(form, object, field, percent_field, default_value='')
|
||||
content_tag(:tr,
|
||||
content_tag(:td, "<label for='deliverable_#{field.to_s}'>#{l_field(field, 'field_')}</label>") +
|
||||
content_tag(:td, "<label for='deliverable_#{field.to_s}'>#{l_field(field, 'field_')}</label>".html_safe) +
|
||||
content_tag(:td, number_or_percent_field(object, field, percent_field, default_value, :size => 7)) +
|
||||
content_tag(:td,
|
||||
content_tag(:span,
|
||||
@@ -15,27 +15,27 @@ module DeliverablesHelper
|
||||
),
|
||||
:class => "calculation-column"
|
||||
))
|
||||
|
||||
|
||||
end
|
||||
|
||||
def number_or_percent_field(object, number_field, percent_field, default_value, options)
|
||||
# Build a text_field by hand named after the number field but with the percent_field and % as the value
|
||||
return text_field_tag('deliverable_' + number_field.to_s,
|
||||
return text_field_tag('deliverable_' + number_field.to_s,
|
||||
object.read_attribute(percent_field).to_s + "%",
|
||||
options.merge({ :name => "deliverable[#{number_field.to_s}]"})) unless object.read_attribute(percent_field).blank?
|
||||
|
||||
|
||||
# Number and fallback with no values
|
||||
value = object.read_attribute(number_field) || default_value || ''
|
||||
return text_field(:deliverable, number_field, options.merge({ :value => value}))
|
||||
end
|
||||
|
||||
|
||||
# Helper to generate a consistant HTML format for displaying basic data
|
||||
def paragraph_with_data(label, data)
|
||||
content_tag(:p,
|
||||
content_tag(:span, label, :class => 'title') +
|
||||
content_tag(:span, h(data), :class => 'data'))
|
||||
end
|
||||
|
||||
|
||||
def row_with_data(label, data, css_class='')
|
||||
content_tag(:tr,
|
||||
content_tag(:td, label, :class => 'title') +
|
||||
@@ -51,7 +51,7 @@ module DeliverablesHelper
|
||||
content_tag(:span, h(data1), :class => 'left-data') +
|
||||
content_tag(:span, h(data2), :class => 'right-data'),
|
||||
:class => 'fake-table'))
|
||||
|
||||
|
||||
end
|
||||
|
||||
# Helper to generate a consistant HTML format for displaying basic data
|
||||
@@ -67,11 +67,11 @@ module DeliverablesHelper
|
||||
def allowed_management?
|
||||
return User.current.allowed_to?(:manage_budget, @project)
|
||||
end
|
||||
|
||||
|
||||
def l_field(field, prefix='')
|
||||
l((prefix + field.to_s).to_sym)
|
||||
end
|
||||
|
||||
|
||||
def toggle_arrows(deliverable_id)
|
||||
open_js = "expandRow(#{deliverable_id})"
|
||||
close_js = "collapseRow(#{deliverable_id})"
|
||||
@@ -79,7 +79,7 @@ module DeliverablesHelper
|
||||
return toggle_arrow(deliverable_id, "toggle-arrow-closed.gif", open_js, false) +
|
||||
toggle_arrow(deliverable_id, "toggle-arrow-open.gif", close_js, true)
|
||||
end
|
||||
|
||||
|
||||
def toggle_arrow(deliverable_id, image, js, hide=false)
|
||||
style = "display:none;" if hide
|
||||
style ||= ''
|
||||
@@ -89,9 +89,9 @@ module DeliverablesHelper
|
||||
:class => "toggle toggle_" + deliverable_id.to_s,
|
||||
:style => style
|
||||
)
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
def number_or_percent(number_field, percent_field)
|
||||
return number_to_currency(number_field, :unit => l(:label_currency), :precision => 0) unless number_field.blank?
|
||||
return number_to_percentage(percent_field, :precision => 0) unless percent_field.blank?
|
||||
|
||||
@@ -2,5 +2,5 @@
|
||||
<td colspan="9" style="text-align: left;">
|
||||
<%= l(:field_description) %>: <%= textilizable deliverable.description %>
|
||||
</td>
|
||||
<%= Redmine::Hook.call_hook(:plugin_budget_view_deliverable_description_row, { :deliverable => deliverable }) %>
|
||||
<% Redmine::Hook.call_hook(:plugin_budget_view_deliverable_description_row, { :deliverable => deliverable }) %>
|
||||
</tr>
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
<tr id="deliverable-details-<%= deliverable.id %>" class="deliverable deliverable-details <%= css %>" style="display:none;">
|
||||
<td class="deliverable-actions">
|
||||
<%= content_tag(:p,link_to(l(:button_edit), :action => 'edit', :id => @project.id, :deliverable_id => deliverable.id)) if allowed_management? -%>
|
||||
<%= content_tag(:p,link_to(l(:button_delete), { :action => 'destroy', :id => @project.id, :deliverable_id => deliverable.id}, :confirm => l(:text_are_you_sure))) if allowed_management? %>
|
||||
<%= content_tag(:p,link_to(l(:label_issue_plural), :action => 'issues', :id => @project.id, :deliverable_id => deliverable.id)) -%>
|
||||
<%= content_tag(:p,link_to(l(:button_edit), :action => 'edit', :id => @project.identifier, :deliverable_id => deliverable.id)) if allowed_management? -%>
|
||||
<%= content_tag(:p,link_to(l(:button_delete), { :action => 'destroy', :id => @project.identifier, :deliverable_id => deliverable.id}, :confirm => l(:text_are_you_sure))) if allowed_management? %>
|
||||
<%= content_tag(:p,link_to(l(:label_issue_plural), :action => 'issues', :id => @project.identifier, :deliverable_id => deliverable.id)) -%>
|
||||
<% if allowed_management? && @project.versions.size > 0 %>
|
||||
<div>
|
||||
<% form_for :deliverable, deliverable, :url => { :action => "bulk_assign_issues", :id => @project.id, :deliverable_id => deliverable.id} do |f| %>
|
||||
|
||||
<%= form_tag({ :action => "bulk_assign_issues", :id => @project.identifier, :deliverable_id => deliverable.id}) do %>
|
||||
<%= select("version", "id", @project.versions.sort.collect {|v| [v.name, v.id ] }, { :prompt => '-- Version --' }) %><br />
|
||||
<%= submit_tag(l(:label_bulk_assign)) %>
|
||||
<% end %>
|
||||
@@ -18,9 +17,8 @@
|
||||
<table class="progress-table">
|
||||
<%= row_with_double_data l(:label_progress), number_to_percentage(deliverable.progress, :precision => 0), '' %>
|
||||
<% if allowed_management? %>
|
||||
|
||||
<% if deliverable.hourly? %>
|
||||
<%= row_with_double_data l(:label_hours_estimated), number_with_precision(deliverable.total_hours, 0), '' %>
|
||||
<%= row_with_double_data l(:label_hours_estimated), number_with_precision(deliverable.total_hours, :precision => 0), '' %>
|
||||
<% end %>
|
||||
<% if deliverable.fixed? %>
|
||||
<%= row_with_double_data l(:label_fixed_amount), '', number_to_currency(deliverable.fixed_cost, :unit => l(:label_currency), :precision => 0) %>
|
||||
@@ -61,5 +59,5 @@
|
||||
<% end %>
|
||||
</table>
|
||||
</td>
|
||||
<%= Redmine::Hook.call_hook(:plugin_budget_view_deliverable_details_row, { :deliverable => deliverable }) %>
|
||||
<% Redmine::Hook.call_hook(:plugin_budget_view_deliverable_details_row, { :deliverable => deliverable }) %>
|
||||
</tr>
|
||||
|
||||
@@ -11,5 +11,5 @@
|
||||
<%= content_tag(:td, number_to_currency(deliverable.spent, :unit => l(:label_currency), :precision => 0), :class => 'spent') if allowed_management? %>
|
||||
<%= content_tag(:td, format_date(deliverable.due), :class => 'due_date') %>
|
||||
<%= content_tag(:td, progress_bar(deliverable.progress, :width => '100%', :class => 'done_ratio')) %>
|
||||
<%= Redmine::Hook.call_hook(:plugin_budget_view_deliverable_summary_row, { :deliverable => deliverable }) %>
|
||||
<% Redmine::Hook.call_hook(:plugin_budget_view_deliverable_summary_row, { :deliverable => deliverable }) %>
|
||||
</tr>
|
||||
|
||||
@@ -23,7 +23,11 @@
|
||||
</td>
|
||||
<td>
|
||||
<%= check_box(:deliverable, :type, {}, FixedDeliverable.name, HourlyDeliverable.name) %>
|
||||
<%= observe_field('deliverable_type', :function => "new Budget.changeType();") %>
|
||||
<script type="text/javascript">
|
||||
$("#deliverable_type").change(function() {
|
||||
new Budget.changeType();
|
||||
});
|
||||
</script>
|
||||
</td>
|
||||
<td class="calculation-column">
|
||||
</td>
|
||||
@@ -75,12 +79,10 @@
|
||||
<%= content_tag(:span, 0, :id => 'total-budget-calculation', :class => "budget-calculation") %>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
</table>
|
||||
<%= f.hidden_field :budget %>
|
||||
<%= observe_form('deliverable-form', :function => "new Budget.updateAmounts();", :on => 'blur') %>
|
||||
|
||||
|
||||
</div>
|
||||
<script type="text/javascript">new Budget.changeType();</script>
|
||||
<script type="text/javascript">new Budget.updateAmounts();</script>
|
||||
@@ -93,18 +95,18 @@
|
||||
|
||||
</div>
|
||||
<%= mode == :create ? submit_tag(l(:button_create)) : submit_tag(l(:button_update)) %>
|
||||
<%= link_to_remote l(:label_preview),
|
||||
{ :url => { :controller => 'deliverables', :action => 'preview', :id => @project },
|
||||
:method => 'post',
|
||||
:update => 'preview',
|
||||
:with => "Form.serialize('deliverable-form')",
|
||||
:complete => "Element.scrollTo('preview')"
|
||||
}, :accesskey => accesskey(:preview) %>
|
||||
<%= link_to l(:label_preview), preview_deliverable_path(:id => @project), :id => "budget_preview_link", :accesskey => accesskey(:preview) %>
|
||||
<script type="text/javascript">
|
||||
$("#budget_preview_link").click(function() {
|
||||
$.post($(this).attr("href"), $("#deliverable-form").serializeArray(), 'script');
|
||||
return false;
|
||||
});
|
||||
</script>
|
||||
|
||||
<%# Same as `wikitoolbar_for 'deliverable_description'` but without the help link %>
|
||||
<%= javascript_include_tag('jstoolbar/jstoolbar') %>
|
||||
<%= javascript_include_tag("jstoolbar/lang/jstoolbar-#{current_language}") %>
|
||||
<%= javascript_tag("var toolbar = new jsToolBar($('deliverable_description'));toolbar.draw();") %>
|
||||
<%= javascript_tag("var toolbar = new jsToolBar($('#deliverable_description')[0]);toolbar.draw();") %>
|
||||
|
||||
|
||||
<div id="preview" class="wiki"></div>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<%= sort_header_tag("spent", :caption => l(:caption_spent)) if allowed_management? %>
|
||||
<%= sort_header_tag("#{Deliverable.table_name}.due", :caption => l(:caption_due)) %>
|
||||
<%= sort_header_tag("progress", :caption => l(:caption_progress)) %>
|
||||
<%= Redmine::Hook.call_hook(:plugin_budget_view_deliverable_list_header, { }) %>
|
||||
<% Redmine::Hook.call_hook(:plugin_budget_view_deliverable_list_header, { }) %>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<% deliverables.each do |deliverable| -%>
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
<h3><%= l(:budget_title) %></h3>
|
||||
<%= link_to_function l(:label_new_deliverable), "$('new-deliverable').toggle();" if allowed_management? %><br />
|
||||
<%= link_to_function l(:label_new_deliverable), "$('#new-deliverable').toggle();" if allowed_management? %><br />
|
||||
<%= link_to_function l(:label_toggle_all), "toggleAll();" if allowed_management? %><br />
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
# If there is no deliverable list, refresh the page
|
||||
if ($('#deliverable-list').length == 0) { document.location.reload() }
|
||||
|
||||
# Add deliverable to list
|
||||
$("#deliverable-list").prepend("<%= escape_javascript render(:partial => 'deliverable', :locals => {:deliverable => @deliverable}) %>");
|
||||
|
||||
# Update budget
|
||||
$('#budget-summary').html("<%= escape_javascript render(:partial => 'budget', :object => @budget) %>");
|
||||
$("#budget-summary").effect("highlight", {}, 300);
|
||||
|
||||
# Remove errors if found
|
||||
$("#errorExplanation").remove();
|
||||
|
||||
var form = $('#deliverable-form');
|
||||
form.find('input:text, input:password, input:file, select, textarea').val('');
|
||||
form.find('input:radio, input:checkbox').removeAttr('checked').removeAttr('selected');
|
||||
|
||||
Budget.updateAmounts();
|
||||
|
||||
# Add a fading out flash
|
||||
$('#new-deliverable').before('<%= escape_javascript content_tag(:div, @flash, :class => "flash notice", :id => "rjs-flash") %>');
|
||||
setTimeout(function() { $("#rjs-flash").effect("fade", {}, 300) }, 3000);
|
||||
|
||||
$("#preview").remove();
|
||||
@@ -1,26 +0,0 @@
|
||||
# If there is no deliverable list, refresh the page
|
||||
page << "if ($('deliverable-list') == null) {document.location.reload()}"
|
||||
|
||||
# Add deliverable to list
|
||||
page.insert_html :top, 'deliverable-list', :partial => 'deliverable', :locals => {:deliverable => @deliverable}
|
||||
|
||||
# Update budget
|
||||
page.replace_html 'budget-summary', :partial => 'budget', :object => @budget
|
||||
page.visual_effect :highlight, 'budget-summary'
|
||||
|
||||
# Remove errors if found
|
||||
page.select('#errorExplanation').each do |value|
|
||||
page.remove value
|
||||
end
|
||||
|
||||
page << "Form.reset($('deliverable-form'))"
|
||||
page << "Budget.updateAmounts()"
|
||||
|
||||
# Add a fading out flash
|
||||
page.insert_html :before, 'new-deliverable', content_tag(:div, @flash, :class => "flash notice", :id => 'rjs-flash')
|
||||
page.delay(3) do
|
||||
page.visual_effect :fade, 'rjs-flash'
|
||||
end
|
||||
|
||||
# Clear preview
|
||||
page.replace_html 'preview', ''
|
||||
@@ -0,0 +1,2 @@
|
||||
$('#new-deliverable').html("<%= escape_javascript render(:partial => 'form') %>");
|
||||
Budget.updateAmounts();
|
||||
@@ -1,2 +0,0 @@
|
||||
page.replace_html 'new-deliverable', :partial => 'form'
|
||||
page << "Budget.updateAmounts()"
|
||||
@@ -1,6 +1,6 @@
|
||||
<h2><%= l(:label_update_deliverable) %></h2>
|
||||
<% form_for :deliverable, @deliverable, :url => {:controller => 'deliverables', :action => 'update', :id => @project, :deliverable_id => @deliverable.id },
|
||||
:method => :post, :builder => TabularFormBuilder, :lang => current_language,
|
||||
<%= form_for @deliverable, :url => {:controller => 'deliverables', :action => 'update', :id => @project, :deliverable_id => @deliverable.id },
|
||||
:method => :put, :builder => Redmine::Views::LabelledFormBuilder, :lang => current_language,
|
||||
:html => {:multipart => true, :id => 'deliverable-form', :class => 'tabular'} do |f| %>
|
||||
|
||||
<%= render :partial => 'form', :locals => { :mode => :update, :f => f } %>
|
||||
|
||||
@@ -5,9 +5,7 @@
|
||||
<% if allowed_management? %>
|
||||
<div id="new-deliverable" style="<%= @display_form ? '' : 'display:none;' -%>">
|
||||
<h2><%= l(:label_new_deliverable) %></h2>
|
||||
<% remote_form_for :deliverable, @deliverable, :url => {:controller => 'deliverables', :action => 'create', :id => @project },
|
||||
:method => :post, :builder => TabularFormBuilder, :lang => current_language,
|
||||
:html => {:multipart => true, :id => 'deliverable-form', :class => 'tabular'} do |f| %>
|
||||
<%= form_for @deliverable, :url => create_deliverable_path(params[:id]), :method => :post, :builder => Redmine::Views::LabelledFormBuilder, :remote => true, :lang => current_language, :html => {:multipart => true, :id => 'deliverable-form', :class => 'tabular'} do |f| %>
|
||||
<%= render :partial => 'form', :locals => { :mode => :create, :f => f } %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
$("#preview").html("<%= escape_javascript render(:partial => 'common/preview') %>");
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
<p>
|
||||
<%= l(:message_budget_settings) %>
|
||||
<%= l(:message_budget_settings).html_safe %>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Reference in New Issue
Block a user