##// END OF EJS Templates
Adds a view for editing all trackers fields....
Jean-Philippe Lang -
r10100:3a32edc3bd10
parent child
Show More
@@ -0,0 +1,77
1 <h2><%= link_to l(:label_tracker_plural), trackers_path %> &#187; <%= l(:field_summary) %></h2>
2
3 <% if @trackers.any? %>
4 <%= form_tag({}) do %>
5 <div class="autoscroll">
6 <table class="list">
7 <thead>
8 <tr>
9 <th></th>
10 <% @trackers.each do |tracker| %>
11 <th>
12 <%= tracker.name %>
13 <%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('input.tracker-#{tracker.id}')",
14 :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %>
15 </th>
16 <% end %>
17 </tr>
18 </thead>
19 <tbody>
20 <tr class="group open">
21 <td colspan="<%= @trackers.size + 1 %>">
22 <span class="expander" onclick="toggleRowGroup(this);">&nbsp;</span>
23 <%= l(:field_core_fields) %>
24 </td>
25 </tr>
26 <% Tracker::CORE_FIELDS.each do |field| %>
27 <tr class="<%= cycle("odd", "even") %>">
28 <td>
29 <%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('input.core-field-#{field}')",
30 :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %>
31 <%= l("field_#{field}".sub(/_id$/, '')) %>
32 </td>
33 <% @trackers.each do |tracker| %>
34 <td align="center">
35 <%= check_box_tag "trackers[#{tracker.id}][core_fields][]", field, tracker.core_fields.include?(field),
36 :class => "tracker-#{tracker.id} core-field-#{field}" %>
37 </td>
38 <% end %>
39 </tr>
40 <% end %>
41 <% if @custom_fields.any? %>
42 <tr class="group open">
43 <td colspan="<%= @trackers.size + 1 %>">
44 <span class="expander" onclick="toggleRowGroup(this);">&nbsp;</span>
45 <%= l(:label_custom_field_plural) %>
46 </td>
47 </tr>
48 <% @custom_fields.each do |field| %>
49 <tr class="<%= cycle("odd", "even") %>">
50 <td>
51 <%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('input.custom-field-#{field.id}')",
52 :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %>
53 <%= field.name %>
54 </td>
55 <% @trackers.each do |tracker| %>
56 <td align="center">
57 <%= check_box_tag "trackers[#{tracker.id}][custom_field_ids][]", field.id, tracker.custom_fields.include?(field),
58 :class => "tracker-#{tracker.id} custom-field-#{field.id}" %>
59 </td>
60 <% end %>
61 </tr>
62 <% end %>
63 <% end %>
64 </tbody>
65 </table>
66 </div>
67 <p><%= submit_tag l(:button_save) %></p>
68 <% @trackers.each do |tracker| %>
69 <%= hidden_field_tag "trackers[#{tracker.id}][core_fields][]", '' %>
70 <%= hidden_field_tag "trackers[#{tracker.id}][custom_field_ids][]", '' %>
71 <% end %>
72 <% end %>
73 <% else %>
74 <p class="nodata"><%= l(:label_no_data) %></p>
75 <% end %>
76
77 <% html_title l(:field_summary) %>
@@ -1,83 +1,101
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2012 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 TrackersController < ApplicationController
19 19 layout 'admin'
20 20
21 21 before_filter :require_admin, :except => :index
22 22 before_filter :require_admin_or_api_request, :only => :index
23 23 accept_api_auth :index
24 24
25 25 def index
26 26 respond_to do |format|
27 27 format.html {
28 28 @tracker_pages, @trackers = paginate :trackers, :per_page => 10, :order => 'position'
29 29 render :action => "index", :layout => false if request.xhr?
30 30 }
31 31 format.api {
32 32 @trackers = Tracker.sorted.all
33 33 }
34 34 end
35 35 end
36 36
37 37 def new
38 38 @tracker ||= Tracker.new(params[:tracker])
39 39 @trackers = Tracker.find :all, :order => 'position'
40 40 @projects = Project.find(:all)
41 41 end
42 42
43 43 def create
44 44 @tracker = Tracker.new(params[:tracker])
45 45 if request.post? and @tracker.save
46 46 # workflow copy
47 47 if !params[:copy_workflow_from].blank? && (copy_from = Tracker.find_by_id(params[:copy_workflow_from]))
48 48 @tracker.workflow_rules.copy(copy_from)
49 49 end
50 50 flash[:notice] = l(:notice_successful_create)
51 51 redirect_to :action => 'index'
52 52 return
53 53 end
54 54 new
55 55 render :action => 'new'
56 56 end
57 57
58 58 def edit
59 59 @tracker ||= Tracker.find(params[:id])
60 60 @projects = Project.find(:all)
61 61 end
62 62
63 63 def update
64 64 @tracker = Tracker.find(params[:id])
65 65 if request.put? and @tracker.update_attributes(params[:tracker])
66 66 flash[:notice] = l(:notice_successful_update)
67 67 redirect_to :action => 'index'
68 68 return
69 69 end
70 70 edit
71 71 render :action => 'edit'
72 72 end
73 73
74 74 def destroy
75 75 @tracker = Tracker.find(params[:id])
76 76 unless @tracker.issues.empty?
77 77 flash[:error] = l(:error_can_not_delete_tracker)
78 78 else
79 79 @tracker.destroy
80 80 end
81 81 redirect_to :action => 'index'
82 82 end
83
84 def fields
85 if request.post? && params[:trackers]
86 params[:trackers].each do |tracker_id, tracker_params|
87 tracker = Tracker.find_by_id(tracker_id)
88 if tracker
89 tracker.core_fields = tracker_params[:core_fields]
90 tracker.custom_field_ids = tracker_params[:custom_field_ids]
91 tracker.save
92 end
93 end
94 flash[:notice] = l(:notice_successful_update)
95 redirect_to :action => 'fields'
96 return
97 end
98 @trackers = Tracker.sorted.all
99 @custom_fields = IssueCustomField.all.sort
100 end
83 101 end
@@ -1,30 +1,31
1 1 <div class="contextual">
2 2 <%= link_to l(:label_tracker_new), new_tracker_path, :class => 'icon icon-add' %>
3 <%= link_to l(:field_summary), {:action => 'fields'}, :class => 'icon icon-summary' %>
3 4 </div>
4 5
5 6 <h2><%=l(:label_tracker_plural)%></h2>
6 7
7 8 <table class="list">
8 9 <thead><tr>
9 10 <th><%=l(:label_tracker)%></th>
10 11 <th></th>
11 12 <th><%=l(:button_sort)%></th>
12 13 <th></th>
13 14 </tr></thead>
14 15 <tbody>
15 16 <% for tracker in @trackers %>
16 17 <tr class="<%= cycle("odd", "even") %>">
17 18 <td><%= link_to h(tracker.name), edit_tracker_path(tracker) %></td>
18 19 <td align="center"><% unless tracker.workflow_rules.count > 0 %><span class="icon icon-warning"><%= l(:text_tracker_no_workflow) %> (<%= link_to l(:button_edit), {:controller => 'workflows', :action => 'edit', :tracker_id => tracker} %>)</span><% end %></td>
19 20 <td align="center" style="width:15%;"><%= reorder_links('tracker', {:action => 'update', :id => tracker}, :put) %></td>
20 21 <td class="buttons">
21 22 <%= delete_link tracker_path(tracker) %>
22 23 </td>
23 24 </tr>
24 25 <% end %>
25 26 </tbody>
26 27 </table>
27 28
28 29 <p class="pagination"><%= pagination_links_full @tracker_pages %></p>
29 30
30 31 <% html_title(l(:label_tracker_plural)) -%>
@@ -1,340 +1,344
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2012 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 RedmineApp::Application.routes.draw do
19 19 root :to => 'welcome#index', :as => 'home'
20 20
21 21 match 'login', :to => 'account#login', :as => 'signin'
22 22 match 'logout', :to => 'account#logout', :as => 'signout'
23 23 match 'account/register', :to => 'account#register', :via => [:get, :post], :as => 'register'
24 24 match 'account/lost_password', :to => 'account#lost_password', :via => [:get, :post], :as => 'lost_password'
25 25 match 'account/activate', :to => 'account#activate', :via => :get
26 26
27 27 match '/news/preview', :controller => 'previews', :action => 'news', :as => 'preview_news'
28 28 match '/issues/preview/new/:project_id', :to => 'previews#issue', :as => 'preview_new_issue'
29 29 match '/issues/preview/edit/:id', :to => 'previews#issue', :as => 'preview_edit_issue'
30 30 match '/issues/preview', :to => 'previews#issue', :as => 'preview_issue'
31 31
32 32 match 'projects/:id/wiki', :to => 'wikis#edit', :via => :post
33 33 match 'projects/:id/wiki/destroy', :to => 'wikis#destroy', :via => [:get, :post]
34 34
35 35 match 'boards/:board_id/topics/new', :to => 'messages#new', :via => [:get, :post]
36 36 get 'boards/:board_id/topics/:id', :to => 'messages#show', :as => 'board_message'
37 37 match 'boards/:board_id/topics/quote/:id', :to => 'messages#quote', :via => [:get, :post]
38 38 get 'boards/:board_id/topics/:id/edit', :to => 'messages#edit'
39 39
40 40 post 'boards/:board_id/topics/preview', :to => 'messages#preview'
41 41 post 'boards/:board_id/topics/:id/replies', :to => 'messages#reply'
42 42 post 'boards/:board_id/topics/:id/edit', :to => 'messages#edit'
43 43 post 'boards/:board_id/topics/:id/destroy', :to => 'messages#destroy'
44 44
45 45 # Misc issue routes. TODO: move into resources
46 46 match '/issues/auto_complete', :to => 'auto_completes#issues', :via => :get, :as => 'auto_complete_issues'
47 47 match '/issues/context_menu', :to => 'context_menus#issues', :as => 'issues_context_menu'
48 48 match '/issues/changes', :to => 'journals#index', :as => 'issue_changes'
49 49 match '/issues/:id/quoted', :to => 'journals#new', :id => /\d+/, :via => :post, :as => 'quoted_issue'
50 50
51 51 match '/journals/diff/:id', :to => 'journals#diff', :id => /\d+/, :via => :get
52 52 match '/journals/edit/:id', :to => 'journals#edit', :id => /\d+/, :via => [:get, :post]
53 53
54 54 match '/projects/:project_id/issues/gantt', :to => 'gantts#show'
55 55 match '/issues/gantt', :to => 'gantts#show'
56 56
57 57 match '/projects/:project_id/issues/calendar', :to => 'calendars#show'
58 58 match '/issues/calendar', :to => 'calendars#show'
59 59
60 60 match 'projects/:id/issues/report', :to => 'reports#issue_report', :via => :get
61 61 match 'projects/:id/issues/report/:detail', :to => 'reports#issue_report_details', :via => :get
62 62
63 63 match 'my/account', :controller => 'my', :action => 'account', :via => [:get, :post]
64 64 match 'my/account/destroy', :controller => 'my', :action => 'destroy', :via => [:get, :post]
65 65 match 'my/page', :controller => 'my', :action => 'page', :via => :get
66 66 match 'my', :controller => 'my', :action => 'index', :via => :get # Redirects to my/page
67 67 match 'my/reset_rss_key', :controller => 'my', :action => 'reset_rss_key', :via => :post
68 68 match 'my/reset_api_key', :controller => 'my', :action => 'reset_api_key', :via => :post
69 69 match 'my/password', :controller => 'my', :action => 'password', :via => [:get, :post]
70 70 match 'my/page_layout', :controller => 'my', :action => 'page_layout', :via => :get
71 71 match 'my/add_block', :controller => 'my', :action => 'add_block', :via => :post
72 72 match 'my/remove_block', :controller => 'my', :action => 'remove_block', :via => :post
73 73 match 'my/order_blocks', :controller => 'my', :action => 'order_blocks', :via => :post
74 74
75 75 resources :users
76 76 match 'users/:id/memberships/:membership_id', :to => 'users#edit_membership', :via => :put, :as => 'user_membership'
77 77 match 'users/:id/memberships/:membership_id', :to => 'users#destroy_membership', :via => :delete
78 78 match 'users/:id/memberships', :to => 'users#edit_membership', :via => :post, :as => 'user_memberships'
79 79
80 80 match 'watchers/new', :controller=> 'watchers', :action => 'new', :via => :get
81 81 match 'watchers', :controller=> 'watchers', :action => 'create', :via => :post
82 82 match 'watchers/append', :controller=> 'watchers', :action => 'append', :via => :post
83 83 match 'watchers/destroy', :controller=> 'watchers', :action => 'destroy', :via => :post
84 84 match 'watchers/watch', :controller=> 'watchers', :action => 'watch', :via => :post
85 85 match 'watchers/unwatch', :controller=> 'watchers', :action => 'unwatch', :via => :post
86 86 match 'watchers/autocomplete_for_user', :controller=> 'watchers', :action => 'autocomplete_for_user', :via => :get
87 87
88 88 match 'projects/:id/settings/:tab', :to => "projects#settings"
89 89
90 90 resources :projects do
91 91 member do
92 92 get 'settings'
93 93 post 'modules'
94 94 post 'archive'
95 95 post 'unarchive'
96 96 post 'close'
97 97 post 'reopen'
98 98 match 'copy', :via => [:get, :post]
99 99 end
100 100
101 101 resources :memberships, :shallow => true, :controller => 'members', :only => [:index, :show, :create, :update, :destroy] do
102 102 collection do
103 103 get 'autocomplete'
104 104 end
105 105 end
106 106
107 107 resource :enumerations, :controller => 'project_enumerations', :only => [:update, :destroy]
108 108
109 109 match 'issues/:copy_from/copy', :to => 'issues#new'
110 110 resources :issues, :only => [:index, :new, :create] do
111 111 resources :time_entries, :controller => 'timelog' do
112 112 collection do
113 113 get 'report'
114 114 end
115 115 end
116 116 end
117 117 # issue form update
118 118 match 'issues/new', :controller => 'issues', :action => 'new', :via => [:put, :post], :as => 'issue_form'
119 119
120 120 resources :files, :only => [:index, :new, :create]
121 121
122 122 resources :versions, :except => [:index, :show, :edit, :update, :destroy] do
123 123 collection do
124 124 put 'close_completed'
125 125 end
126 126 end
127 127 match 'versions.:format', :to => 'versions#index'
128 128 match 'roadmap', :to => 'versions#index', :format => false
129 129 match 'versions', :to => 'versions#index'
130 130
131 131 resources :news, :except => [:show, :edit, :update, :destroy]
132 132 resources :time_entries, :controller => 'timelog' do
133 133 get 'report', :on => :collection
134 134 end
135 135 resources :queries, :only => [:new, :create]
136 136 resources :issue_categories, :shallow => true
137 137 resources :documents, :except => [:show, :edit, :update, :destroy]
138 138 resources :boards
139 139 resources :repositories, :shallow => true, :except => [:index, :show] do
140 140 member do
141 141 match 'committers', :via => [:get, :post]
142 142 end
143 143 end
144 144
145 145 match 'wiki/index', :controller => 'wiki', :action => 'index', :via => :get
146 146 match 'wiki/:id/diff/:version/vs/:version_from', :controller => 'wiki', :action => 'diff'
147 147 match 'wiki/:id/diff/:version', :controller => 'wiki', :action => 'diff'
148 148 resources :wiki, :except => [:index, :new, :create] do
149 149 member do
150 150 get 'rename'
151 151 post 'rename'
152 152 get 'history'
153 153 get 'diff'
154 154 match 'preview', :via => [:post, :put]
155 155 post 'protect'
156 156 post 'add_attachment'
157 157 end
158 158 collection do
159 159 get 'export'
160 160 get 'date_index'
161 161 end
162 162 end
163 163 match 'wiki', :controller => 'wiki', :action => 'show', :via => :get
164 164 match 'wiki/:id/annotate/:version', :controller => 'wiki', :action => 'annotate'
165 165 end
166 166
167 167 resources :issues do
168 168 collection do
169 169 match 'bulk_edit', :via => [:get, :post]
170 170 post 'bulk_update'
171 171 end
172 172 resources :time_entries, :controller => 'timelog' do
173 173 collection do
174 174 get 'report'
175 175 end
176 176 end
177 177 resources :relations, :shallow => true, :controller => 'issue_relations', :only => [:index, :show, :create, :destroy]
178 178 end
179 179 match '/issues', :controller => 'issues', :action => 'destroy', :via => :delete
180 180
181 181 resources :queries, :except => [:show]
182 182
183 183 resources :news, :only => [:index, :show, :edit, :update, :destroy]
184 184 match '/news/:id/comments', :to => 'comments#create', :via => :post
185 185 match '/news/:id/comments/:comment_id', :to => 'comments#destroy', :via => :delete
186 186
187 187 resources :versions, :only => [:show, :edit, :update, :destroy] do
188 188 post 'status_by', :on => :member
189 189 end
190 190
191 191 resources :documents, :only => [:show, :edit, :update, :destroy] do
192 192 post 'add_attachment', :on => :member
193 193 end
194 194
195 195 match '/time_entries/context_menu', :to => 'context_menus#time_entries', :as => :time_entries_context_menu
196 196
197 197 resources :time_entries, :controller => 'timelog', :except => :destroy do
198 198 collection do
199 199 get 'report'
200 200 get 'bulk_edit'
201 201 post 'bulk_update'
202 202 end
203 203 end
204 204 match '/time_entries/:id', :to => 'timelog#destroy', :via => :delete, :id => /\d+/
205 205 # TODO: delete /time_entries for bulk deletion
206 206 match '/time_entries/destroy', :to => 'timelog#destroy', :via => :delete
207 207
208 208 # TODO: port to be part of the resources route(s)
209 209 match 'projects/:id/settings/:tab', :to => 'projects#settings', :via => :get
210 210
211 211 get 'projects/:id/activity', :to => 'activities#index'
212 212 get 'projects/:id/activity.:format', :to => 'activities#index'
213 213 get 'activity', :to => 'activities#index'
214 214
215 215 # repositories routes
216 216 get 'projects/:id/repository/:repository_id/statistics', :to => 'repositories#stats'
217 217 get 'projects/:id/repository/:repository_id/graph', :to => 'repositories#graph'
218 218
219 219 get 'projects/:id/repository/:repository_id/changes(/*path(.:ext))',
220 220 :to => 'repositories#changes'
221 221
222 222 get 'projects/:id/repository/:repository_id/revisions/:rev', :to => 'repositories#revision'
223 223 get 'projects/:id/repository/:repository_id/revision', :to => 'repositories#revision'
224 224 post 'projects/:id/repository/:repository_id/revisions/:rev/issues', :to => 'repositories#add_related_issue'
225 225 delete 'projects/:id/repository/:repository_id/revisions/:rev/issues/:issue_id', :to => 'repositories#remove_related_issue'
226 226 get 'projects/:id/repository/:repository_id/revisions', :to => 'repositories#revisions'
227 227 get 'projects/:id/repository/:repository_id/revisions/:rev/:action(/*path(.:ext))',
228 228 :controller => 'repositories',
229 229 :format => false,
230 230 :constraints => {
231 231 :action => /(browse|show|entry|raw|annotate|diff)/,
232 232 :rev => /[a-z0-9\.\-_]+/
233 233 }
234 234
235 235 get 'projects/:id/repository/statistics', :to => 'repositories#stats'
236 236 get 'projects/:id/repository/graph', :to => 'repositories#graph'
237 237
238 238 get 'projects/:id/repository/changes(/*path(.:ext))',
239 239 :to => 'repositories#changes'
240 240
241 241 get 'projects/:id/repository/revisions', :to => 'repositories#revisions'
242 242 get 'projects/:id/repository/revisions/:rev', :to => 'repositories#revision'
243 243 get 'projects/:id/repository/revision', :to => 'repositories#revision'
244 244 post 'projects/:id/repository/revisions/:rev/issues', :to => 'repositories#add_related_issue'
245 245 delete 'projects/:id/repository/revisions/:rev/issues/:issue_id', :to => 'repositories#remove_related_issue'
246 246 get 'projects/:id/repository/revisions/:rev/:action(/*path(.:ext))',
247 247 :controller => 'repositories',
248 248 :format => false,
249 249 :constraints => {
250 250 :action => /(browse|show|entry|raw|annotate|diff)/,
251 251 :rev => /[a-z0-9\.\-_]+/
252 252 }
253 253 get 'projects/:id/repository/:repository_id/:action(/*path(.:ext))',
254 254 :controller => 'repositories',
255 255 :action => /(browse|show|entry|raw|changes|annotate|diff)/
256 256 get 'projects/:id/repository/:action(/*path(.:ext))',
257 257 :controller => 'repositories',
258 258 :action => /(browse|show|entry|raw|changes|annotate|diff)/
259 259
260 260 get 'projects/:id/repository/:repository_id', :to => 'repositories#show', :path => nil
261 261 get 'projects/:id/repository', :to => 'repositories#show', :path => nil
262 262
263 263 # additional routes for having the file name at the end of url
264 264 match 'attachments/:id/:filename', :controller => 'attachments', :action => 'show', :id => /\d+/, :filename => /.*/, :via => :get
265 265 match 'attachments/download/:id/:filename', :controller => 'attachments', :action => 'download', :id => /\d+/, :filename => /.*/, :via => :get
266 266 match 'attachments/download/:id', :controller => 'attachments', :action => 'download', :id => /\d+/, :via => :get
267 267 match 'attachments/thumbnail/:id(/:size)', :controller => 'attachments', :action => 'thumbnail', :id => /\d+/, :via => :get, :size => /\d+/
268 268 resources :attachments, :only => [:show, :destroy]
269 269
270 270 resources :groups do
271 271 member do
272 272 get 'autocomplete_for_user'
273 273 end
274 274 end
275 275
276 276 match 'groups/:id/users', :controller => 'groups', :action => 'add_users', :id => /\d+/, :via => :post, :as => 'group_users'
277 277 match 'groups/:id/users/:user_id', :controller => 'groups', :action => 'remove_user', :id => /\d+/, :via => :delete, :as => 'group_user'
278 278 match 'groups/destroy_membership/:id', :controller => 'groups', :action => 'destroy_membership', :id => /\d+/, :via => :post
279 279 match 'groups/edit_membership/:id', :controller => 'groups', :action => 'edit_membership', :id => /\d+/, :via => :post
280 280
281 resources :trackers, :except => :show
281 resources :trackers, :except => :show do
282 collection do
283 match 'fields', :via => [:get, :post]
284 end
285 end
282 286 resources :issue_statuses, :except => :show do
283 287 collection do
284 288 post 'update_issue_done_ratio'
285 289 end
286 290 end
287 291 resources :custom_fields, :except => :show
288 292 resources :roles, :except => :show do
289 293 collection do
290 294 match 'permissions', :via => [:get, :post]
291 295 end
292 296 end
293 297 resources :enumerations, :except => :show
294 298
295 299 get 'projects/:id/search', :controller => 'search', :action => 'index'
296 300 get 'search', :controller => 'search', :action => 'index'
297 301
298 302 match 'mail_handler', :controller => 'mail_handler', :action => 'index', :via => :post
299 303
300 304 match 'admin', :controller => 'admin', :action => 'index', :via => :get
301 305 match 'admin/projects', :controller => 'admin', :action => 'projects', :via => :get
302 306 match 'admin/plugins', :controller => 'admin', :action => 'plugins', :via => :get
303 307 match 'admin/info', :controller => 'admin', :action => 'info', :via => :get
304 308 match 'admin/test_email', :controller => 'admin', :action => 'test_email', :via => :get
305 309 match 'admin/default_configuration', :controller => 'admin', :action => 'default_configuration', :via => :post
306 310
307 311 resources :auth_sources do
308 312 member do
309 313 get 'test_connection'
310 314 end
311 315 end
312 316
313 317 match 'workflows', :controller => 'workflows', :action => 'index', :via => :get
314 318 match 'workflows/edit', :controller => 'workflows', :action => 'edit', :via => [:get, :post]
315 319 match 'workflows/permissions', :controller => 'workflows', :action => 'permissions', :via => [:get, :post]
316 320 match 'workflows/copy', :controller => 'workflows', :action => 'copy', :via => [:get, :post]
317 321 match 'settings', :controller => 'settings', :action => 'index', :via => :get
318 322 match 'settings/edit', :controller => 'settings', :action => 'edit', :via => [:get, :post]
319 323 match 'settings/plugin/:id', :controller => 'settings', :action => 'plugin', :via => [:get, :post]
320 324
321 325 match 'sys/projects', :to => 'sys#projects', :via => :get
322 326 match 'sys/projects/:id/repository', :to => 'sys#create_project_repository', :via => :post
323 327 match 'sys/fetch_changesets', :to => 'sys#fetch_changesets', :via => :get
324 328
325 329 match 'uploads', :to => 'attachments#upload', :via => :post
326 330
327 331 get 'robots.txt', :to => 'welcome#robots'
328 332
329 333 Dir.glob File.expand_path("plugins/*", Rails.root) do |plugin_dir|
330 334 file = File.join(plugin_dir, "config/routes.rb")
331 335 if File.exists?(file)
332 336 begin
333 337 instance_eval File.read(file)
334 338 rescue Exception => e
335 339 puts "An error occurred while loading the routes definition of #{File.basename(plugin_dir)} plugin (#{file}): #{e.message}."
336 340 exit 1
337 341 end
338 342 end
339 343 end
340 344 end
@@ -1,188 +1,218
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2012 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 require File.expand_path('../../test_helper', __FILE__)
19 19 require 'trackers_controller'
20 20
21 21 # Re-raise errors caught by the controller.
22 22 class TrackersController; def rescue_action(e) raise e end; end
23 23
24 24 class TrackersControllerTest < ActionController::TestCase
25 25 fixtures :trackers, :projects, :projects_trackers, :users, :issues, :custom_fields
26 26
27 27 def setup
28 28 @controller = TrackersController.new
29 29 @request = ActionController::TestRequest.new
30 30 @response = ActionController::TestResponse.new
31 31 User.current = nil
32 32 @request.session[:user_id] = 1 # admin
33 33 end
34 34
35 35 def test_index
36 36 get :index
37 37 assert_response :success
38 38 assert_template 'index'
39 39 end
40 40
41 41 def test_index_by_anonymous_should_redirect_to_login_form
42 42 @request.session[:user_id] = nil
43 43 get :index
44 44 assert_redirected_to '/login?back_url=http%3A%2F%2Ftest.host%2Ftrackers'
45 45 end
46 46
47 47 def test_index_by_user_should_respond_with_406
48 48 @request.session[:user_id] = 2
49 49 get :index
50 50 assert_response 406
51 51 end
52 52
53 53 def test_new
54 54 get :new
55 55 assert_response :success
56 56 assert_template 'new'
57 57 end
58 58
59 59 def test_create
60 60 assert_difference 'Tracker.count' do
61 61 post :create, :tracker => { :name => 'New tracker', :project_ids => ['1', '', ''], :custom_field_ids => ['1', '6', ''] }
62 62 end
63 63 assert_redirected_to :action => 'index'
64 64 tracker = Tracker.first(:order => 'id DESC')
65 65 assert_equal 'New tracker', tracker.name
66 66 assert_equal [1], tracker.project_ids.sort
67 67 assert_equal Tracker::CORE_FIELDS, tracker.core_fields
68 68 assert_equal [1, 6], tracker.custom_field_ids.sort
69 69 assert_equal 0, tracker.workflow_rules.count
70 70 end
71 71
72 72 def create_with_disabled_core_fields
73 73 assert_difference 'Tracker.count' do
74 74 post :create, :tracker => { :name => 'New tracker', :core_fields => ['assigned_to_id', 'fixed_version_id', ''] }
75 75 end
76 76 assert_redirected_to :action => 'index'
77 77 tracker = Tracker.first(:order => 'id DESC')
78 78 assert_equal 'New tracker', tracker.name
79 79 assert_equal %w(assigned_to_id fixed_version_id), tracker.core_fields
80 80 end
81 81
82 82 def test_create_new_with_workflow_copy
83 83 assert_difference 'Tracker.count' do
84 84 post :create, :tracker => { :name => 'New tracker' }, :copy_workflow_from => 1
85 85 end
86 86 assert_redirected_to :action => 'index'
87 87 tracker = Tracker.find_by_name('New tracker')
88 88 assert_equal 0, tracker.projects.count
89 89 assert_equal Tracker.find(1).workflow_rules.count, tracker.workflow_rules.count
90 90 end
91 91
92 92 def test_create_with_failure
93 93 assert_no_difference 'Tracker.count' do
94 94 post :create, :tracker => { :name => '', :project_ids => ['1', '', ''], :custom_field_ids => ['1', '6', ''] }
95 95 end
96 96 assert_response :success
97 97 assert_template 'new'
98 98 assert_error_tag :content => /name can&#x27;t be blank/i
99 99 end
100 100
101 101 def test_edit
102 102 Tracker.find(1).project_ids = [1, 3]
103 103
104 104 get :edit, :id => 1
105 105 assert_response :success
106 106 assert_template 'edit'
107 107
108 108 assert_tag :input, :attributes => { :name => 'tracker[project_ids][]',
109 109 :value => '1',
110 110 :checked => 'checked' }
111 111
112 112 assert_tag :input, :attributes => { :name => 'tracker[project_ids][]',
113 113 :value => '2',
114 114 :checked => nil }
115 115
116 116 assert_tag :input, :attributes => { :name => 'tracker[project_ids][]',
117 117 :value => '',
118 118 :type => 'hidden'}
119 119 end
120 120
121 121 def test_edit_should_check_core_fields
122 122 tracker = Tracker.find(1)
123 123 tracker.core_fields = %w(assigned_to_id fixed_version_id)
124 124 tracker.save!
125 125
126 126 get :edit, :id => 1
127 127 assert_response :success
128 128 assert_template 'edit'
129 129
130 130 assert_select 'input[name=?][value=assigned_to_id][checked=checked]', 'tracker[core_fields][]'
131 131 assert_select 'input[name=?][value=fixed_version_id][checked=checked]', 'tracker[core_fields][]'
132 132
133 133 assert_select 'input[name=?][value=category_id]', 'tracker[core_fields][]'
134 134 assert_select 'input[name=?][value=category_id][checked=checked]', 'tracker[core_fields][]', 0
135 135
136 136 assert_select 'input[name=?][value=][type=hidden]', 'tracker[core_fields][]'
137 137 end
138 138
139 139 def test_update
140 140 put :update, :id => 1, :tracker => { :name => 'Renamed',
141 141 :project_ids => ['1', '2', ''] }
142 142 assert_redirected_to :action => 'index'
143 143 assert_equal [1, 2], Tracker.find(1).project_ids.sort
144 144 end
145 145
146 146 def test_update_without_projects
147 147 put :update, :id => 1, :tracker => { :name => 'Renamed',
148 148 :project_ids => [''] }
149 149 assert_redirected_to :action => 'index'
150 150 assert Tracker.find(1).project_ids.empty?
151 151 end
152 152
153 153 def test_update_without_core_fields
154 154 put :update, :id => 1, :tracker => { :name => 'Renamed', :core_fields => [''] }
155 155 assert_redirected_to :action => 'index'
156 156 assert Tracker.find(1).core_fields.empty?
157 157 end
158 158
159 159 def test_update_with_failure
160 160 put :update, :id => 1, :tracker => { :name => '' }
161 161 assert_response :success
162 162 assert_template 'edit'
163 163 assert_error_tag :content => /name can&#x27;t be blank/i
164 164 end
165 165
166 166 def test_move_lower
167 167 tracker = Tracker.find_by_position(1)
168 168 put :update, :id => 1, :tracker => { :move_to => 'lower' }
169 169 assert_equal 2, tracker.reload.position
170 170 end
171 171
172 172 def test_destroy
173 173 tracker = Tracker.create!(:name => 'Destroyable')
174 174 assert_difference 'Tracker.count', -1 do
175 175 delete :destroy, :id => tracker.id
176 176 end
177 177 assert_redirected_to :action => 'index'
178 178 assert_nil flash[:error]
179 179 end
180 180
181 181 def test_destroy_tracker_in_use
182 182 assert_no_difference 'Tracker.count' do
183 183 delete :destroy, :id => 1
184 184 end
185 185 assert_redirected_to :action => 'index'
186 186 assert_not_nil flash[:error]
187 187 end
188
189 def test_get_fields
190 get :fields
191 assert_response :success
192 assert_template 'fields'
193
194 assert_select 'form' do
195 assert_select 'input[type=checkbox][name=?][value=assigned_to_id]', 'trackers[1][core_fields][]'
196 assert_select 'input[type=checkbox][name=?][value=2]', 'trackers[1][custom_field_ids][]'
197
198 assert_select 'input[type=hidden][name=?][value=]', 'trackers[1][core_fields][]'
199 assert_select 'input[type=hidden][name=?][value=]', 'trackers[1][custom_field_ids][]'
200 end
201 end
202
203 def test_post_fields
204 post :fields, :trackers => {
205 '1' => {'core_fields' => ['assigned_to_id', 'due_date', ''], 'custom_field_ids' => ['1', '2']},
206 '2' => {'core_fields' => [''], 'custom_field_ids' => ['']}
207 }
208 assert_redirected_to '/trackers/fields'
209
210 tracker = Tracker.find(1)
211 assert_equal %w(assigned_to_id due_date), tracker.core_fields
212 assert_equal [1, 2], tracker.custom_field_ids.sort
213
214 tracker = Tracker.find(2)
215 assert_equal [], tracker.core_fields
216 assert_equal [], tracker.custom_field_ids.sort
217 end
188 218 end
@@ -1,71 +1,79
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2012 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 require File.expand_path('../../../test_helper', __FILE__)
19 19
20 20 class RoutingTrackersTest < ActionController::IntegrationTest
21 21 def test_trackers
22 22 assert_routing(
23 23 { :method => 'get', :path => "/trackers" },
24 24 { :controller => 'trackers', :action => 'index' }
25 25 )
26 26 assert_routing(
27 27 { :method => 'get', :path => "/trackers.xml" },
28 28 { :controller => 'trackers', :action => 'index', :format => 'xml' }
29 29 )
30 30 assert_routing(
31 31 { :method => 'post', :path => "/trackers" },
32 32 { :controller => 'trackers', :action => 'create' }
33 33 )
34 34 assert_routing(
35 35 { :method => 'post', :path => "/trackers.xml" },
36 36 { :controller => 'trackers', :action => 'create', :format => 'xml' }
37 37 )
38 38 assert_routing(
39 39 { :method => 'get', :path => "/trackers/new" },
40 40 { :controller => 'trackers', :action => 'new' }
41 41 )
42 42 assert_routing(
43 43 { :method => 'get', :path => "/trackers/new.xml" },
44 44 { :controller => 'trackers', :action => 'new', :format => 'xml' }
45 45 )
46 46 assert_routing(
47 47 { :method => 'get', :path => "/trackers/1/edit" },
48 48 { :controller => 'trackers', :action => 'edit', :id => '1' }
49 49 )
50 50 assert_routing(
51 51 { :method => 'put', :path => "/trackers/1" },
52 52 { :controller => 'trackers', :action => 'update',
53 53 :id => '1' }
54 54 )
55 55 assert_routing(
56 56 { :method => 'put', :path => "/trackers/1.xml" },
57 57 { :controller => 'trackers', :action => 'update',
58 58 :format => 'xml', :id => '1' }
59 59 )
60 60 assert_routing(
61 61 { :method => 'delete', :path => "/trackers/1" },
62 62 { :controller => 'trackers', :action => 'destroy',
63 63 :id => '1' }
64 64 )
65 65 assert_routing(
66 66 { :method => 'delete', :path => "/trackers/1.xml" },
67 67 { :controller => 'trackers', :action => 'destroy',
68 68 :format => 'xml', :id => '1' }
69 69 )
70 assert_routing(
71 { :method => 'get', :path => "/trackers/fields" },
72 { :controller => 'trackers', :action => 'fields' }
73 )
74 assert_routing(
75 { :method => 'post', :path => "/trackers/fields" },
76 { :controller => 'trackers', :action => 'fields' }
77 )
70 78 end
71 79 end
General Comments 0
You need to be logged in to leave comments. Login now