diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 39eb33b9..adb49114 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -87,9 +87,15 @@ class ProjectsController < ApplicationController @members_by_role = @project.members.find(:all, :include => [:user, :role], :order => 'position').group_by {|m| m.role} @subprojects = @project.active_children @news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "#{News.table_name}.created_on DESC") - @trackers = @project.trackers - @open_issues_by_tracker = Issue.count(:group => :tracker, :joins => "INNER JOIN #{IssueStatus.table_name} ON #{IssueStatus.table_name}.id = #{Issue.table_name}.status_id", :conditions => ["project_id=? and #{IssueStatus.table_name}.is_closed=?", @project.id, false]) - @total_issues_by_tracker = Issue.count(:group => :tracker, :conditions => ["project_id=?", @project.id]) + @trackers = @project.rolled_up_trackers + Issue.visible_by(User.current) do + @open_issues_by_tracker = Issue.count(:group => :tracker, + :include => [:project, :status, :tracker], + :conditions => ["(#{Project.table_name}.id=? OR #{Project.table_name}.parent_id=?) and #{IssueStatus.table_name}.is_closed=?", @project.id, @project.id, false]) + @total_issues_by_tracker = Issue.count(:group => :tracker, + :include => [:project, :status, :tracker], + :conditions => ["#{Project.table_name}.id=? OR #{Project.table_name}.parent_id=?", @project.id, @project.id]) + end TimeEntry.visible_by(User.current) do @total_hours = TimeEntry.sum(:hours, :include => :project, @@ -307,9 +313,9 @@ class ProjectsController < ApplicationController @year ||= Date.today.year @month ||= Date.today.month @calendar = Redmine::Helpers::Calendar.new(Date.civil(@year, @month, 1), current_language, :month) - + @with_subprojects = params[:with_subprojects].nil? ? true : (params[:with_subprojects] == '1') events = [] - @project.issues_with_subprojects(params[:with_subprojects]) do + @project.issues_with_subprojects(@with_subprojects) do events += Issue.find(:all, :include => [:tracker, :status, :assigned_to, :priority, :project], :conditions => ["((start_date BETWEEN ? AND ?) OR (due_date BETWEEN ? AND ?)) AND #{Issue.table_name}.tracker_id IN (#{@selected_tracker_ids.join(',')})", @calendar.startdt, @calendar.enddt, @calendar.startdt, @calendar.enddt] @@ -350,9 +356,10 @@ class ProjectsController < ApplicationController @date_from = Date.civil(@year_from, @month_from, 1) @date_to = (@date_from >> @months) - 1 + @with_subprojects = params[:with_subprojects].nil? ? true : (params[:with_subprojects] == '1') @events = [] - @project.issues_with_subprojects(params[:with_subprojects]) do + @project.issues_with_subprojects(@with_subprojects) do @events += Issue.find(:all, :order => "start_date, due_date", :include => [:tracker, :status, :assigned_to, :priority, :project], diff --git a/app/models/issue.rb b/app/models/issue.rb index 6b9b3bd1..9d7f6eaa 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -231,4 +231,10 @@ class Issue < ActiveRecord::Base def soonest_start @soonest_start ||= relations_to.collect{|relation| relation.successor_soonest_start}.compact.min end + + def self.visible_by(usr) + with_scope(:find => { :conditions => Project.visible_by(usr) }) do + yield + end + end end diff --git a/app/models/query.rb b/app/models/query.rb index a4103c08..73828f73 100644 --- a/app/models/query.rb +++ b/app/models/query.rb @@ -83,7 +83,7 @@ class Query < ActiveRecord::Base @@operators_by_filter_type = { :list => [ "=", "!" ], :list_status => [ "o", "=", "!", "c", "*" ], :list_optional => [ "=", "!", "!*", "*" ], - :list_one_or_more => [ "*", "=" ], + :list_subprojects => [ "*", "!*", "=" ], :date => [ "t+", "t+", "t", "w", ">t-", " [ ">t-", " [ "=", "~", "!", "!~" ], @@ -163,7 +163,7 @@ class Query < ActiveRecord::Base @available_filters["category_id"] = { :type => :list_optional, :order => 6, :values => @project.issue_categories.collect{|s| [s.name, s.id.to_s] } } @available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => @project.versions.sort.collect{|s| [s.name, s.id.to_s] } } unless @project.active_children.empty? - @available_filters["subproject_id"] = { :type => :list_one_or_more, :order => 13, :values => @project.active_children.collect{|s| [s.name, s.id.to_s] } } + @available_filters["subproject_id"] = { :type => :list_subprojects, :order => 13, :values => @project.active_children.collect{|s| [s.name, s.id.to_s] } } end @project.all_custom_fields.select(&:is_filter?).each do |field| case field.field_format @@ -259,16 +259,18 @@ class Query < ActiveRecord::Base def statement # project/subprojects clause clause = '' - if project && has_filter?("subproject_id") - subproject_ids = [] - if operator_for("subproject_id") == "=" - subproject_ids = values_for("subproject_id").each(&:to_i) + if project && !@project.active_children.empty? + ids = [project.id] + if has_filter?("subproject_id") && operator_for("subproject_id") == "=" + # include the selected subprojects + ids += values_for("subproject_id").each(&:to_i) else - subproject_ids = project.active_children.collect{|p| p.id} + # include all the subprojects unless 'none' is selected + ids += project.active_children.collect{|p| p.id} unless has_filter?("subproject_id") && operator_for("subproject_id") == "!*" end - clause << "#{Issue.table_name}.project_id IN (%d,%s)" % [project.id, subproject_ids.join(",")] if project + clause << "#{Issue.table_name}.project_id IN (%s)" % ids.join(',') elsif project - clause << "#{Issue.table_name}.project_id=%d" % project.id + clause << "#{Issue.table_name}.project_id = %d" % project.id else clause << Project.visible_by(User.current) end diff --git a/app/views/projects/calendar.rhtml b/app/views/projects/calendar.rhtml index a2af3e2b..743721cb 100644 --- a/app/views/projects/calendar.rhtml +++ b/app/views/projects/calendar.rhtml @@ -31,9 +31,10 @@
<% end %> <% if @project.active_children.any? %> -
+
+ <%= hidden_field_tag 'with_subprojects', 0 %> <% end %> -

<%= submit_tag l(:button_apply), :class => 'button-small' %>

+

<%= submit_tag l(:button_apply), :class => 'button-small', :name => nil %>

<% end %> <% end %> diff --git a/app/views/projects/gantt.rhtml b/app/views/projects/gantt.rhtml index ece77669..2979bce2 100644 --- a/app/views/projects/gantt.rhtml +++ b/app/views/projects/gantt.rhtml @@ -235,7 +235,8 @@ if Date.today >= @date_from and Date.today <= @date_to %>
<% end %> <% if @project.active_children.any? %> -
+
+ <%= hidden_field_tag 'with_subprojects', 0 %> <% end %>

<%= submit_tag l(:button_apply), :class => 'button-small' %>

<% end %> diff --git a/app/views/queries/_filters.rhtml b/app/views/queries/_filters.rhtml index bc60bd5e..2465818d 100644 --- a/app/views/queries/_filters.rhtml +++ b/app/views/queries/_filters.rhtml @@ -75,7 +75,7 @@ function toggle_multi_select(field) {