* added an helper and moved the rendering code to a shared partial (used by project calendar and my calendar) * first day of week can now be set in lang files (general_first_day_of_week) git-svn-id: http://redmine.rubyforge.org/svn/trunk@815 e93f8b46-1217-0410-a6f0-8f06a7374b81pull/351/head
parent
cdb2781b48
commit
ec51cdd0f9
@ -0,0 +1,36 @@ |
|||||||
|
<table class="cal"> |
||||||
|
<thead> |
||||||
|
<tr><td></td><% 7.times do |i| %><th><%= day_name( (calendar.first_wday+i)%7 ) %></th><% end %></tr> |
||||||
|
</thead> |
||||||
|
<tbody> |
||||||
|
<tr> |
||||||
|
<% day = calendar.startdt |
||||||
|
while day <= calendar.enddt %> |
||||||
|
<%= "<th>#{day.cweek}</th>" if day.cwday == calendar.first_wday %> |
||||||
|
<td class="<%= day.month==calendar.month ? 'even' : 'odd' %><%= ' today' if Date.today == day %>"> |
||||||
|
<p class="day-num"><%= day.day %></p> |
||||||
|
<% calendar.events_on(day).each do |i| %> |
||||||
|
<% if i.is_a? Issue %> |
||||||
|
<div class="tooltip"> |
||||||
|
<%= if day == i.start_date && day == i.due_date |
||||||
|
image_tag('arrow_bw.png') |
||||||
|
elsif day == i.start_date |
||||||
|
image_tag('arrow_from.png') |
||||||
|
elsif day == i.due_date |
||||||
|
image_tag('arrow_to.png') |
||||||
|
end %> |
||||||
|
<%= h("#{i.project.name} -") unless @project && @project == i.project %> |
||||||
|
<%= link_to_issue i %>: <%= h(truncate(i.subject, 30)) %> |
||||||
|
<span class="tip"><%= render_issue_tooltip i %></span> |
||||||
|
</div> |
||||||
|
<% else %> |
||||||
|
<%= link_to_version i, :class => "icon icon-package" %> |
||||||
|
<% end %> |
||||||
|
<% end %> |
||||||
|
</td> |
||||||
|
<%= '</tr><tr>' if day.cwday==calendar.last_wday and day!=calendar.enddt %> |
||||||
|
<% day = day + 1 |
||||||
|
end %> |
||||||
|
</tr> |
||||||
|
</tbody> |
||||||
|
</table> |
@ -1,47 +1,8 @@ |
|||||||
<h3><%= l(:label_calendar) %></h3> |
<h3><%= l(:label_calendar) %></h3> |
||||||
|
|
||||||
<% |
<% calendar = Redmine::Helpers::Calendar.new(Date.today, current_language, :week) |
||||||
@date_from = Date.today - (Date.today.cwday-1) |
calendar.events = Issue.find :all, |
||||||
@date_to = Date.today + (7-Date.today.cwday) |
:conditions => ["#{Issue.table_name}.project_id in (#{@user.projects.collect{|m| m.id}.join(',')}) AND ((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?))", calendar.startdt, calendar.enddt, calendar.startdt, calendar.enddt], |
||||||
@issues = Issue.find :all, |
:include => [:project, :tracker, :priority, :assigned_to] unless @user.projects.empty? %> |
||||||
:conditions => ["#{Issue.table_name}.project_id in (#{@user.projects.collect{|m| m.id}.join(',')}) AND ((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?))", @date_from, @date_to, @date_from, @date_to], |
|
||||||
:include => [:project, :tracker] unless @user.projects.empty? |
|
||||||
@issues ||= [] |
|
||||||
%> |
|
||||||
|
|
||||||
<table class="cal"> |
<%= render :partial => 'common/calendar', :locals => {:calendar => calendar } %> |
||||||
<thead><tr> |
|
||||||
<td></td> |
|
||||||
<% 1.upto(7) do |d| %> |
|
||||||
<th align="center" width="14%"><%= day_name(d) %></th> |
|
||||||
<% end %> |
|
||||||
</tr></thead> |
|
||||||
<tbdoy> |
|
||||||
<tr height="100"> |
|
||||||
<% day = @date_from |
|
||||||
while day <= @date_to |
|
||||||
if day.cwday == 1 %> |
|
||||||
<th valign="middle"><%= day.cweek %></th> |
|
||||||
<% end %> |
|
||||||
<td valign="top" width="14%" class="<%= day.month==@month ? "even" : "odd" %>"> |
|
||||||
<p align="right"><%= day==Date.today ? "<b>#{day.day}</b>" : day.day %></p> |
|
||||||
<% day_issues = [] |
|
||||||
@issues.each { |i| day_issues << i if i.start_date == day or i.due_date == day } |
|
||||||
day_issues.each do |i| %> |
|
||||||
<%= if day == i.start_date and day == i.due_date |
|
||||||
image_tag('arrow_bw.png') |
|
||||||
elsif day == i.start_date |
|
||||||
image_tag('arrow_from.png') |
|
||||||
elsif day == i.due_date |
|
||||||
image_tag('arrow_to.png') |
|
||||||
end %> |
|
||||||
<small><%= link_to_issue i %>: <%=h i.subject.sub(/^(.{30}[^\s]*\s).*$/, '\1 (...)') %></small><br /> |
|
||||||
<% end %> |
|
||||||
</td> |
|
||||||
<%= '</tr><tr height="100">' if day.cwday >= 7 and day!=@date_to %> |
|
||||||
<% |
|
||||||
day = day + 1 |
|
||||||
end %> |
|
||||||
</tr> |
|
||||||
</tbody> |
|
||||||
</table> |
|
||||||
|
@ -0,0 +1,76 @@ |
|||||||
|
# redMine - project management software |
||||||
|
# Copyright (C) 2006-2007 Jean-Philippe Lang |
||||||
|
# |
||||||
|
# This program is free software; you can redistribute it and/or |
||||||
|
# modify it under the terms of the GNU General Public License |
||||||
|
# as published by the Free Software Foundation; either version 2 |
||||||
|
# of the License, or (at your option) any later version. |
||||||
|
# |
||||||
|
# This program is distributed in the hope that it will be useful, |
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
# GNU General Public License for more details. |
||||||
|
# |
||||||
|
# You should have received a copy of the GNU General Public License |
||||||
|
# along with this program; if not, write to the Free Software |
||||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||||
|
|
||||||
|
module Redmine |
||||||
|
module Helpers |
||||||
|
|
||||||
|
# Simple class to compute the start and end dates of a calendar |
||||||
|
class Calendar |
||||||
|
include GLoc |
||||||
|
attr_reader :startdt, :enddt |
||||||
|
|
||||||
|
def initialize(date, lang = current_language, period = :month) |
||||||
|
@date = date |
||||||
|
@events = [] |
||||||
|
@ending_events_by_days = {} |
||||||
|
@starting_events_by_days = {} |
||||||
|
set_language lang |
||||||
|
case period |
||||||
|
when :month |
||||||
|
@startdt = Date.civil(date.year, date.month, 1) |
||||||
|
@enddt = (@startdt >> 1)-1 |
||||||
|
# starts from the first day of the week |
||||||
|
@startdt = @startdt - (@startdt.cwday - first_wday)%7 |
||||||
|
# ends on the last day of the week |
||||||
|
@enddt = @enddt + (last_wday - @enddt.cwday)%7 |
||||||
|
when :week |
||||||
|
@startdt = date - (date.cwday - first_wday)%7 |
||||||
|
@enddt = date + (last_wday - date.cwday)%7 |
||||||
|
else |
||||||
|
raise 'Invalid period' |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
# Sets calendar events |
||||||
|
def events=(events) |
||||||
|
@events = events |
||||||
|
@ending_events_by_days = @events.group_by {|event| event.due_date} |
||||||
|
@starting_events_by_days = @events.group_by {|event| event.start_date} |
||||||
|
end |
||||||
|
|
||||||
|
# Returns events for the given day |
||||||
|
def events_on(day) |
||||||
|
((@ending_events_by_days[day] || []) + (@starting_events_by_days[day] || [])).uniq |
||||||
|
end |
||||||
|
|
||||||
|
# Calendar current month |
||||||
|
def month |
||||||
|
@date.month |
||||||
|
end |
||||||
|
|
||||||
|
# Return the first day of week |
||||||
|
# 1 = Monday ... 7 = Sunday |
||||||
|
def first_wday |
||||||
|
@first_dow ||= (l(:general_first_day_of_week).to_i - 1)%7 + 1 |
||||||
|
end |
||||||
|
|
||||||
|
def last_wday |
||||||
|
@last_dow ||= (first_wday + 5)%7 + 1 |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,43 @@ |
|||||||
|
# redMine - project management software |
||||||
|
# Copyright (C) 2006-2007 Jean-Philippe Lang |
||||||
|
# |
||||||
|
# This program is free software; you can redistribute it and/or |
||||||
|
# modify it under the terms of the GNU General Public License |
||||||
|
# as published by the Free Software Foundation; either version 2 |
||||||
|
# of the License, or (at your option) any later version. |
||||||
|
# |
||||||
|
# This program is distributed in the hope that it will be useful, |
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
# GNU General Public License for more details. |
||||||
|
# |
||||||
|
# You should have received a copy of the GNU General Public License |
||||||
|
# along with this program; if not, write to the Free Software |
||||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||||
|
|
||||||
|
require File.dirname(__FILE__) + '/../test_helper' |
||||||
|
|
||||||
|
class CalendarTest < Test::Unit::TestCase |
||||||
|
|
||||||
|
def test_monthly |
||||||
|
c = Redmine::Helpers::Calendar.new(Date.today, :fr, :month) |
||||||
|
assert_equal [1, 7], [c.startdt.cwday, c.enddt.cwday] |
||||||
|
|
||||||
|
c = Redmine::Helpers::Calendar.new('2007-07-14'.to_date, :fr, :month) |
||||||
|
assert_equal ['2007-06-25'.to_date, '2007-08-05'.to_date], [c.startdt, c.enddt] |
||||||
|
|
||||||
|
c = Redmine::Helpers::Calendar.new(Date.today, :en, :month) |
||||||
|
assert_equal [7, 6], [c.startdt.cwday, c.enddt.cwday] |
||||||
|
end |
||||||
|
|
||||||
|
def test_weekly |
||||||
|
c = Redmine::Helpers::Calendar.new(Date.today, :fr, :week) |
||||||
|
assert_equal [1, 7], [c.startdt.cwday, c.enddt.cwday] |
||||||
|
|
||||||
|
c = Redmine::Helpers::Calendar.new('2007-07-14'.to_date, :fr, :week) |
||||||
|
assert_equal ['2007-07-09'.to_date, '2007-07-15'.to_date], [c.startdt, c.enddt] |
||||||
|
|
||||||
|
c = Redmine::Helpers::Calendar.new(Date.today, :en, :week) |
||||||
|
assert_equal [7, 6], [c.startdt.cwday, c.enddt.cwday] |
||||||
|
end |
||||||
|
end |
Loading…
Reference in new issue