* 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> |
||||
|
||||
<% |
||||
@date_from = Date.today - (Date.today.cwday-1) |
||||
@date_to = Date.today + (7-Date.today.cwday) |
||||
@issues = Issue.find :all, |
||||
: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 ||= [] |
||||
%> |
||||
<% calendar = Redmine::Helpers::Calendar.new(Date.today, current_language, :week) |
||||
calendar.events = Issue.find :all, |
||||
: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], |
||||
:include => [:project, :tracker, :priority, :assigned_to] unless @user.projects.empty? %> |
||||
|
||||
<table class="cal"> |
||||
<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> |
||||
<%= render :partial => 'common/calendar', :locals => {:calendar => calendar } %> |
||||
|
@ -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