Chris@1464
|
1 <% @gantt.view = self %>
|
Chris@1464
|
2 <div class="contextual">
|
Chris@1464
|
3 <% if !@query.new_record? && @query.editable_by?(User.current) %>
|
Chris@1464
|
4 <%= link_to l(:button_edit), edit_query_path(@query, :gantt => 1), :class => 'icon icon-edit' %>
|
Chris@1464
|
5 <%= delete_link query_path(@query, :gantt => 1) %>
|
Chris@1464
|
6 <% end %>
|
Chris@1464
|
7 </div>
|
Chris@1464
|
8
|
Chris@1464
|
9 <h2><%= @query.new_record? ? l(:label_gantt) : h(@query.name) %></h2>
|
Chris@1464
|
10
|
Chris@1464
|
11 <%= form_tag({:controller => 'gantts', :action => 'show',
|
Chris@1464
|
12 :project_id => @project, :month => params[:month],
|
Chris@1464
|
13 :year => params[:year], :months => params[:months]},
|
Chris@1464
|
14 :method => :get, :id => 'query_form') do %>
|
Chris@1464
|
15 <%= hidden_field_tag 'set_filter', '1' %>
|
Chris@1464
|
16 <%= hidden_field_tag 'gantt', '1' %>
|
Chris@1464
|
17 <fieldset id="filters" class="collapsible <%= @query.new_record? ? "" : "collapsed" %>">
|
Chris@1464
|
18 <legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend>
|
Chris@1464
|
19 <div style="<%= @query.new_record? ? "" : "display: none;" %>">
|
Chris@1464
|
20 <%= render :partial => 'queries/filters', :locals => {:query => @query} %>
|
Chris@1464
|
21 </div>
|
Chris@1464
|
22 </fieldset>
|
Chris@1464
|
23 <fieldset class="collapsible collapsed">
|
Chris@1464
|
24 <legend onclick="toggleFieldset(this);"><%= l(:label_options) %></legend>
|
Chris@1464
|
25 <div style="display: none;">
|
Chris@1464
|
26 <table>
|
Chris@1464
|
27 <tr>
|
Chris@1464
|
28 <td>
|
Chris@1464
|
29 <fieldset>
|
Chris@1464
|
30 <legend><%= l(:label_related_issues) %></legend>
|
Chris@1464
|
31 <label for="draw_relations">
|
Chris@1464
|
32 <%= check_box 'query', 'draw_relations', :id => 'draw_relations' %>
|
Chris@1464
|
33 <% rels = [IssueRelation::TYPE_BLOCKS, IssueRelation::TYPE_PRECEDES] %>
|
Chris@1464
|
34 <% rels.each do |rel| %>
|
Chris@1464
|
35 <% color = Redmine::Helpers::Gantt::DRAW_TYPES[rel][:color] %>
|
Chris@1464
|
36 <%= content_tag(:span, ' '.html_safe,
|
Chris@1464
|
37 :style => "background-color: #{color}") %>
|
Chris@1464
|
38 <%= l(IssueRelation::TYPES[rel][:name]) %>
|
Chris@1464
|
39 <% end %>
|
Chris@1464
|
40 </label>
|
Chris@1464
|
41 </fieldset>
|
Chris@1464
|
42 </td>
|
Chris@1464
|
43 <td>
|
Chris@1464
|
44 <fieldset>
|
Chris@1464
|
45 <legend><%= l(:label_gantt_progress_line) %></legend>
|
Chris@1464
|
46 <label for="draw_progress_line">
|
Chris@1464
|
47 <%= check_box 'query', 'draw_progress_line', :id => 'draw_progress_line' %>
|
Chris@1464
|
48 <%= l(:label_display) %>
|
Chris@1464
|
49 </label>
|
Chris@1464
|
50 </fieldset>
|
Chris@1464
|
51 </td>
|
Chris@1464
|
52 </tr>
|
Chris@1464
|
53 </table>
|
Chris@1464
|
54 </div>
|
Chris@1464
|
55 </fieldset>
|
Chris@1464
|
56
|
Chris@1464
|
57 <p class="contextual">
|
Chris@1464
|
58 <%= gantt_zoom_link(@gantt, :in) %>
|
Chris@1464
|
59 <%= gantt_zoom_link(@gantt, :out) %>
|
Chris@1464
|
60 </p>
|
Chris@1464
|
61
|
Chris@1464
|
62 <p class="buttons">
|
Chris@1464
|
63 <%= text_field_tag 'months', @gantt.months, :size => 2 %>
|
Chris@1464
|
64 <%= l(:label_months_from) %>
|
Chris@1464
|
65 <%= select_month(@gantt.month_from, :prefix => "month", :discard_type => true) %>
|
Chris@1464
|
66 <%= select_year(@gantt.year_from, :prefix => "year", :discard_type => true) %>
|
Chris@1464
|
67 <%= hidden_field_tag 'zoom', @gantt.zoom %>
|
Chris@1464
|
68
|
Chris@1464
|
69 <%= link_to_function l(:button_apply), '$("#query_form").submit()',
|
Chris@1464
|
70 :class => 'icon icon-checked' %>
|
Chris@1464
|
71 <%= link_to l(:button_clear), { :project_id => @project, :set_filter => 1 },
|
Chris@1464
|
72 :class => 'icon icon-reload' %>
|
Chris@1464
|
73 <% if @query.new_record? && User.current.allowed_to?(:save_queries, @project, :global => true) %>
|
Chris@1464
|
74 <%= link_to_function l(:button_save),
|
Chris@1464
|
75 "$('#query_form').attr('action', '#{ @project ? new_project_query_path(@project) : new_query_path }').submit();",
|
Chris@1464
|
76 :class => 'icon icon-save' %>
|
Chris@1464
|
77 <% end %>
|
Chris@1464
|
78 </p>
|
Chris@1464
|
79 <% end %>
|
Chris@1464
|
80
|
Chris@1464
|
81 <%= error_messages_for 'query' %>
|
Chris@1464
|
82 <% if @query.valid? %>
|
Chris@1464
|
83 <%
|
Chris@1464
|
84 zoom = 1
|
Chris@1464
|
85 @gantt.zoom.times { zoom = zoom * 2 }
|
Chris@1464
|
86
|
Chris@1464
|
87 subject_width = 330
|
Chris@1464
|
88 header_height = 18
|
Chris@1464
|
89
|
Chris@1464
|
90 headers_height = header_height
|
Chris@1464
|
91 show_weeks = false
|
Chris@1464
|
92 show_days = false
|
Chris@1464
|
93
|
Chris@1464
|
94 if @gantt.zoom > 1
|
Chris@1464
|
95 show_weeks = true
|
Chris@1464
|
96 headers_height = 2 * header_height
|
Chris@1464
|
97 if @gantt.zoom > 2
|
Chris@1464
|
98 show_days = true
|
Chris@1464
|
99 headers_height = 3 * header_height
|
Chris@1464
|
100 end
|
Chris@1464
|
101 end
|
Chris@1464
|
102
|
Chris@1464
|
103 # Width of the entire chart
|
Chris@1464
|
104 g_width = ((@gantt.date_to - @gantt.date_from + 1) * zoom).to_i
|
Chris@1464
|
105 @gantt.render(:top => headers_height + 8,
|
Chris@1464
|
106 :zoom => zoom,
|
Chris@1464
|
107 :g_width => g_width,
|
Chris@1464
|
108 :subject_width => subject_width)
|
Chris@1464
|
109 g_height = [(20 * (@gantt.number_of_rows + 6)) + 150, 206].max
|
Chris@1464
|
110 t_height = g_height + headers_height
|
Chris@1464
|
111 %>
|
Chris@1464
|
112
|
Chris@1464
|
113 <% if @gantt.truncated %>
|
Chris@1464
|
114 <p class="warning"><%= l(:notice_gantt_chart_truncated, :max => @gantt.max_rows) %></p>
|
Chris@1464
|
115 <% end %>
|
Chris@1464
|
116
|
Chris@1464
|
117 <table style="width:100%; border:0; border-collapse: collapse;">
|
Chris@1464
|
118 <tr>
|
Chris@1464
|
119 <td style="width:<%= subject_width %>px; padding:0px;">
|
Chris@1464
|
120 <%
|
Chris@1464
|
121 style = ""
|
Chris@1464
|
122 style += "position:relative;"
|
Chris@1464
|
123 style += "height: #{t_height + 24}px;"
|
Chris@1464
|
124 style += "width: #{subject_width + 1}px;"
|
Chris@1464
|
125 %>
|
Chris@1464
|
126 <%= content_tag(:div, :style => style) do %>
|
Chris@1464
|
127 <%
|
Chris@1464
|
128 style = ""
|
Chris@1464
|
129 style += "right:-2px;"
|
Chris@1464
|
130 style += "width: #{subject_width}px;"
|
Chris@1464
|
131 style += "height: #{headers_height}px;"
|
Chris@1464
|
132 style += 'background: #eee;'
|
Chris@1464
|
133 %>
|
Chris@1464
|
134 <%= content_tag(:div, "", :style => style, :class => "gantt_hdr") %>
|
Chris@1464
|
135 <%
|
Chris@1464
|
136 style = ""
|
Chris@1464
|
137 style += "right:-2px;"
|
Chris@1464
|
138 style += "width: #{subject_width}px;"
|
Chris@1464
|
139 style += "height: #{t_height}px;"
|
Chris@1464
|
140 style += 'border-left: 1px solid #c0c0c0;'
|
Chris@1464
|
141 style += 'overflow: hidden;'
|
Chris@1464
|
142 %>
|
Chris@1464
|
143 <%= content_tag(:div, "", :style => style, :class => "gantt_hdr") %>
|
Chris@1464
|
144 <%= content_tag(:div, :class => "gantt_subjects") do %>
|
Chris@1464
|
145 <%= @gantt.subjects.html_safe %>
|
Chris@1464
|
146 <% end %>
|
Chris@1464
|
147 <% end %>
|
Chris@1464
|
148 </td>
|
Chris@1464
|
149
|
Chris@1464
|
150 <td>
|
Chris@1464
|
151 <div style="position:relative;height:<%= t_height + 24 %>px;overflow:auto;" id="gantt_area">
|
Chris@1464
|
152 <%
|
Chris@1464
|
153 style = ""
|
Chris@1464
|
154 style += "width: #{g_width - 1}px;"
|
Chris@1464
|
155 style += "height: #{headers_height}px;"
|
Chris@1464
|
156 style += 'background: #eee;'
|
Chris@1464
|
157 %>
|
Chris@1464
|
158 <%= content_tag(:div, ' '.html_safe, :style => style, :class => "gantt_hdr") %>
|
Chris@1464
|
159
|
Chris@1464
|
160 <% ###### Months headers ###### %>
|
Chris@1464
|
161 <%
|
Chris@1464
|
162 month_f = @gantt.date_from
|
Chris@1464
|
163 left = 0
|
Chris@1464
|
164 height = (show_weeks ? header_height : header_height + g_height)
|
Chris@1464
|
165 %>
|
Chris@1464
|
166 <% @gantt.months.times do %>
|
Chris@1464
|
167 <%
|
Chris@1464
|
168 width = (((month_f >> 1) - month_f) * zoom - 1).to_i
|
Chris@1464
|
169 style = ""
|
Chris@1464
|
170 style += "left: #{left}px;"
|
Chris@1464
|
171 style += "width: #{width}px;"
|
Chris@1464
|
172 style += "height: #{height}px;"
|
Chris@1464
|
173 %>
|
Chris@1464
|
174 <%= content_tag(:div, :style => style, :class => "gantt_hdr") do %>
|
Chris@1464
|
175 <%= link_to h("#{month_f.year}-#{month_f.month}"),
|
Chris@1464
|
176 @gantt.params.merge(:year => month_f.year, :month => month_f.month),
|
Chris@1464
|
177 :title => "#{month_name(month_f.month)} #{month_f.year}" %>
|
Chris@1464
|
178 <% end %>
|
Chris@1464
|
179 <%
|
Chris@1464
|
180 left = left + width + 1
|
Chris@1464
|
181 month_f = month_f >> 1
|
Chris@1464
|
182 %>
|
Chris@1464
|
183 <% end %>
|
Chris@1464
|
184
|
Chris@1464
|
185 <% ###### Weeks headers ###### %>
|
Chris@1464
|
186 <% if show_weeks %>
|
Chris@1464
|
187 <%
|
Chris@1464
|
188 left = 0
|
Chris@1464
|
189 height = (show_days ? header_height - 1 : header_height - 1 + g_height)
|
Chris@1464
|
190 %>
|
Chris@1464
|
191 <% if @gantt.date_from.cwday == 1 %>
|
Chris@1464
|
192 <%
|
Chris@1464
|
193 # @date_from is monday
|
Chris@1464
|
194 week_f = @gantt.date_from
|
Chris@1464
|
195 %>
|
Chris@1464
|
196 <% else %>
|
Chris@1464
|
197 <%
|
Chris@1464
|
198 # find next monday after @date_from
|
Chris@1464
|
199 week_f = @gantt.date_from + (7 - @gantt.date_from.cwday + 1)
|
Chris@1464
|
200 width = (7 - @gantt.date_from.cwday + 1) * zoom - 1
|
Chris@1464
|
201 style = ""
|
Chris@1464
|
202 style += "left: #{left}px;"
|
Chris@1464
|
203 style += "top: 19px;"
|
Chris@1464
|
204 style += "width: #{width}px;"
|
Chris@1464
|
205 style += "height: #{height}px;"
|
Chris@1464
|
206 %>
|
Chris@1464
|
207 <%= content_tag(:div, ' '.html_safe,
|
Chris@1464
|
208 :style => style, :class => "gantt_hdr") %>
|
Chris@1464
|
209 <% left = left + width + 1 %>
|
Chris@1464
|
210 <% end %>
|
Chris@1464
|
211 <% while week_f <= @gantt.date_to %>
|
Chris@1464
|
212 <%
|
Chris@1464
|
213 width = ((week_f + 6 <= @gantt.date_to) ?
|
Chris@1464
|
214 7 * zoom - 1 :
|
Chris@1464
|
215 (@gantt.date_to - week_f + 1) * zoom - 1).to_i
|
Chris@1464
|
216 style = ""
|
Chris@1464
|
217 style += "left: #{left}px;"
|
Chris@1464
|
218 style += "top: 19px;"
|
Chris@1464
|
219 style += "width: #{width}px;"
|
Chris@1464
|
220 style += "height: #{height}px;"
|
Chris@1464
|
221 %>
|
Chris@1464
|
222 <%= content_tag(:div, :style => style, :class => "gantt_hdr") do %>
|
Chris@1464
|
223 <%= content_tag(:small) do %>
|
Chris@1464
|
224 <%= week_f.cweek if width >= 16 %>
|
Chris@1464
|
225 <% end %>
|
Chris@1464
|
226 <% end %>
|
Chris@1464
|
227 <%
|
Chris@1464
|
228 left = left + width + 1
|
Chris@1464
|
229 week_f = week_f + 7
|
Chris@1464
|
230 %>
|
Chris@1464
|
231 <% end %>
|
Chris@1464
|
232 <% end %>
|
Chris@1464
|
233
|
Chris@1464
|
234 <% ###### Days headers ####### %>
|
Chris@1464
|
235 <% if show_days %>
|
Chris@1464
|
236 <%
|
Chris@1464
|
237 left = 0
|
Chris@1464
|
238 height = g_height + header_height - 1
|
Chris@1464
|
239 wday = @gantt.date_from.cwday
|
Chris@1464
|
240 %>
|
Chris@1464
|
241 <% (@gantt.date_to - @gantt.date_from + 1).to_i.times do %>
|
Chris@1464
|
242 <%
|
Chris@1464
|
243 width = zoom - 1
|
Chris@1464
|
244 style = ""
|
Chris@1464
|
245 style += "left: #{left}px;"
|
Chris@1464
|
246 style += "top:37px;"
|
Chris@1464
|
247 style += "width: #{width}px;"
|
Chris@1464
|
248 style += "height: #{height}px;"
|
Chris@1464
|
249 style += "font-size:0.7em;"
|
Chris@1464
|
250 clss = "gantt_hdr"
|
Chris@1464
|
251 clss << " nwday" if @gantt.non_working_week_days.include?(wday)
|
Chris@1464
|
252 %>
|
Chris@1464
|
253 <%= content_tag(:div, :style => style, :class => clss) do %>
|
Chris@1464
|
254 <%= day_letter(wday) %>
|
Chris@1464
|
255 <% end %>
|
Chris@1464
|
256 <%
|
Chris@1464
|
257 left = left + width + 1
|
Chris@1464
|
258 wday = wday + 1
|
Chris@1464
|
259 wday = 1 if wday > 7
|
Chris@1464
|
260 %>
|
Chris@1464
|
261 <% end %>
|
Chris@1464
|
262 <% end %>
|
Chris@1464
|
263
|
Chris@1464
|
264 <%= @gantt.lines.html_safe %>
|
Chris@1464
|
265
|
Chris@1464
|
266 <% ###### Today red line (excluded from cache) ###### %>
|
Chris@1464
|
267 <% if Date.today >= @gantt.date_from and Date.today <= @gantt.date_to %>
|
Chris@1464
|
268 <%
|
Chris@1464
|
269 today_left = (((Date.today - @gantt.date_from + 1) * zoom).floor() - 1).to_i
|
Chris@1464
|
270 style = ""
|
Chris@1464
|
271 style += "position: absolute;"
|
Chris@1464
|
272 style += "height: #{g_height}px;"
|
Chris@1464
|
273 style += "top: #{headers_height + 1}px;"
|
Chris@1464
|
274 style += "left: #{today_left}px;"
|
Chris@1464
|
275 style += "width:10px;"
|
Chris@1464
|
276 style += "border-left: 1px dashed red;"
|
Chris@1464
|
277 %>
|
Chris@1464
|
278 <%= content_tag(:div, ' '.html_safe, :style => style, :id => 'today_line') %>
|
Chris@1464
|
279 <% end %>
|
Chris@1464
|
280 <%
|
Chris@1464
|
281 style = ""
|
Chris@1464
|
282 style += "position: absolute;"
|
Chris@1464
|
283 style += "height: #{g_height}px;"
|
Chris@1464
|
284 style += "top: #{headers_height + 1}px;"
|
Chris@1464
|
285 style += "left: 0px;"
|
Chris@1464
|
286 style += "width: #{g_width - 1}px;"
|
Chris@1464
|
287 %>
|
Chris@1464
|
288 <%= content_tag(:div, '', :style => style, :id => "gantt_draw_area") %>
|
Chris@1464
|
289 </div>
|
Chris@1464
|
290 </td>
|
Chris@1464
|
291 </tr>
|
Chris@1464
|
292 </table>
|
Chris@1464
|
293
|
Chris@1464
|
294 <table style="width:100%">
|
Chris@1464
|
295 <tr>
|
Chris@1464
|
296 <td style="text-align:left;">
|
Chris@1464
|
297 <%= link_to_content_update("\xc2\xab " + l(:label_previous),
|
Chris@1464
|
298 params.merge(@gantt.params_previous)) %>
|
Chris@1464
|
299 </td>
|
Chris@1464
|
300 <td style="text-align:right;">
|
Chris@1464
|
301 <%= link_to_content_update(l(:label_next) + " \xc2\xbb",
|
Chris@1464
|
302 params.merge(@gantt.params_next)) %>
|
Chris@1464
|
303 </td>
|
Chris@1464
|
304 </tr>
|
Chris@1464
|
305 </table>
|
Chris@1464
|
306
|
Chris@1464
|
307 <% other_formats_links do |f| %>
|
Chris@1464
|
308 <%= f.link_to 'PDF', :url => params.merge(@gantt.params) %>
|
Chris@1464
|
309 <%= f.link_to('PNG', :url => params.merge(@gantt.params)) if @gantt.respond_to?('to_image') %>
|
Chris@1464
|
310 <% end %>
|
Chris@1464
|
311 <% end # query.valid? %>
|
Chris@1464
|
312
|
Chris@1464
|
313 <% content_for :sidebar do %>
|
Chris@1464
|
314 <%= render :partial => 'issues/sidebar' %>
|
Chris@1464
|
315 <% end %>
|
Chris@1464
|
316
|
Chris@1464
|
317 <% html_title(l(:label_gantt)) -%>
|
Chris@1464
|
318
|
Chris@1464
|
319 <% content_for :header_tags do %>
|
Chris@1464
|
320 <%= javascript_include_tag 'raphael' %>
|
Chris@1464
|
321 <%= javascript_include_tag 'gantt' %>
|
Chris@1464
|
322 <% end %>
|
Chris@1464
|
323
|
Chris@1464
|
324 <%= javascript_tag do %>
|
Chris@1464
|
325 var issue_relation_type = <%= raw Redmine::Helpers::Gantt::DRAW_TYPES.to_json %>;
|
Chris@1464
|
326 $(document).ready(drawGanttHandler);
|
Chris@1464
|
327 $(window).resize(drawGanttHandler);
|
Chris@1464
|
328 $(function() {
|
Chris@1464
|
329 $("#draw_relations").change(drawGanttHandler);
|
Chris@1464
|
330 $("#draw_progress_line").change(drawGanttHandler);
|
Chris@1464
|
331 });
|
Chris@1464
|
332 <% end %>
|