##// END OF EJS Templates
Use content_tag for empty option....
Jean-Philippe Lang -
r8873:61b14f6391af
parent child
Show More
@@ -1,205 +1,205
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2011 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class VersionsController < ApplicationController
19 19 menu_item :roadmap
20 20 model_object Version
21 21 before_filter :find_model_object, :except => [:index, :new, :create, :close_completed]
22 22 before_filter :find_project_from_association, :except => [:index, :new, :create, :close_completed]
23 23 before_filter :find_project, :only => [:index, :new, :create, :close_completed]
24 24 before_filter :authorize
25 25
26 26 accept_api_auth :index, :show, :create, :update, :destroy
27 27
28 28 helper :custom_fields
29 29 helper :projects
30 30
31 31 def index
32 32 respond_to do |format|
33 33 format.html {
34 34 @trackers = @project.trackers.find(:all, :order => 'position')
35 35 retrieve_selected_tracker_ids(@trackers, @trackers.select {|t| t.is_in_roadmap?})
36 36 @with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
37 37 project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id]
38 38
39 39 @versions = @project.shared_versions || []
40 40 @versions += @project.rolled_up_versions.visible if @with_subprojects
41 41 @versions = @versions.uniq.sort
42 42 unless params[:completed]
43 43 @completed_versions = @versions.select {|version| version.closed? || version.completed? }
44 44 @versions -= @completed_versions
45 45 end
46 46
47 47 @issues_by_version = {}
48 48 unless @selected_tracker_ids.empty?
49 49 @versions.each do |version|
50 50 issues = version.fixed_issues.visible.find(:all,
51 51 :include => [:project, :status, :tracker, :priority],
52 52 :conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids},
53 53 :order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id")
54 54 @issues_by_version[version] = issues
55 55 end
56 56 end
57 57 @versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?}
58 58 }
59 59 format.api {
60 60 @versions = @project.shared_versions.all
61 61 }
62 62 end
63 63 end
64 64
65 65 def show
66 66 respond_to do |format|
67 67 format.html {
68 68 @issues = @version.fixed_issues.visible.find(:all,
69 69 :include => [:status, :tracker, :priority],
70 70 :order => "#{Tracker.table_name}.position, #{Issue.table_name}.id")
71 71 }
72 72 format.api
73 73 end
74 74 end
75 75
76 76 def new
77 77 @version = @project.versions.build(params[:version])
78 78
79 79 respond_to do |format|
80 80 format.html
81 81 format.js do
82 82 render :update do |page|
83 83 page.replace_html 'ajax-modal', :partial => 'versions/new_modal'
84 84 page << "showModal('ajax-modal', '600px');"
85 85 page << "Form.Element.focus('version_name');"
86 86 end
87 87 end
88 88 end
89 89 end
90 90
91 91 def create
92 92 @version = @project.versions.build
93 93 if params[:version]
94 94 attributes = params[:version].dup
95 95 attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
96 96 @version.attributes = attributes
97 97 end
98 98
99 99 if request.post?
100 100 if @version.save
101 101 respond_to do |format|
102 102 format.html do
103 103 flash[:notice] = l(:notice_successful_create)
104 104 redirect_back_or_default :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
105 105 end
106 106 format.js do
107 107 render(:update) {|page|
108 108 page << 'hideModal();'
109 109 # IE doesn't support the replace_html rjs method for select box options
110 110 page.replace "issue_fixed_version_id",
111 content_tag('select', '<option></option>' + version_options_for_select(@project.shared_versions.open, @version), :id => 'issue_fixed_version_id', :name => 'issue[fixed_version_id]')
111 content_tag('select', content_tag('option') + version_options_for_select(@project.shared_versions.open, @version), :id => 'issue_fixed_version_id', :name => 'issue[fixed_version_id]')
112 112 }
113 113 end
114 114 format.api do
115 115 render :action => 'show', :status => :created, :location => version_url(@version)
116 116 end
117 117 end
118 118 else
119 119 respond_to do |format|
120 120 format.html { render :action => 'new' }
121 121 format.js do
122 122 render :update do |page|
123 123 page.replace_html 'ajax-modal', :partial => 'versions/new_modal'
124 124 page << "Form.Element.focus('version_name');"
125 125 end
126 126 end
127 127 format.api { render_validation_errors(@version) }
128 128 end
129 129 end
130 130 end
131 131 end
132 132
133 133 def edit
134 134 end
135 135
136 136 def update
137 137 if request.put? && params[:version]
138 138 attributes = params[:version].dup
139 139 attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing'])
140 140 if @version.update_attributes(attributes)
141 141 respond_to do |format|
142 142 format.html {
143 143 flash[:notice] = l(:notice_successful_update)
144 144 redirect_back_or_default :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
145 145 }
146 146 format.api { head :ok }
147 147 end
148 148 else
149 149 respond_to do |format|
150 150 format.html { render :action => 'edit' }
151 151 format.api { render_validation_errors(@version) }
152 152 end
153 153 end
154 154 end
155 155 end
156 156
157 157 def close_completed
158 158 if request.put?
159 159 @project.close_completed_versions
160 160 end
161 161 redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
162 162 end
163 163
164 164 verify :method => :delete, :only => :destroy, :render => {:nothing => true, :status => :method_not_allowed }
165 165 def destroy
166 166 if @version.fixed_issues.empty?
167 167 @version.destroy
168 168 respond_to do |format|
169 169 format.html { redirect_back_or_default :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project }
170 170 format.api { head :ok }
171 171 end
172 172 else
173 173 respond_to do |format|
174 174 format.html {
175 175 flash[:error] = l(:notice_unable_delete_version)
176 176 redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
177 177 }
178 178 format.api { head :unprocessable_entity }
179 179 end
180 180 end
181 181 end
182 182
183 183 def status_by
184 184 respond_to do |format|
185 185 format.html { render :action => 'show' }
186 186 format.js { render(:update) {|page| page.replace_html 'status_by', render_issue_status_by(@version, params[:status_by])} }
187 187 end
188 188 end
189 189
190 190 private
191 191 def find_project
192 192 @project = Project.find(params[:project_id])
193 193 rescue ActiveRecord::RecordNotFound
194 194 render_404
195 195 end
196 196
197 197 def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil)
198 198 if ids = params[:tracker_ids]
199 199 @selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s }
200 200 else
201 201 @selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s }
202 202 end
203 203 end
204 204
205 205 end
General Comments 0
You need to be logged in to leave comments. Login now