Patch #39050 » new_design_calendar.patch
app/controllers/calendars_controller.rb | ||
---|---|---|
48 | 48 |
@query.issues( |
49 | 49 |
:include => [:tracker, :assigned_to, :priority], |
50 | 50 |
:conditions => [ |
51 |
"((start_date BETWEEN ? AND ?) OR (due_date BETWEEN ? AND ?) OR ((start_date < ?) AND (due_date > ?)))", |
|
52 |
@calendar.startdt, @calendar.enddt, |
|
53 |
@calendar.startdt, @calendar.enddt, |
|
51 |
"((start_date BETWEEN ? AND ?) OR (due_date BETWEEN ? AND ?))", |
|
54 | 52 |
@calendar.startdt, @calendar.enddt, |
53 |
@calendar.startdt, @calendar.enddt |
|
55 | 54 |
] |
56 | 55 |
) |
57 | 56 |
events += |
app/models/issue.rb | ||
---|---|---|
1450 | 1450 | |
1451 | 1451 |
# Returns a string of css classes that apply to the issue |
1452 | 1452 |
def css_classes(user=User.current) |
1453 |
s = +"issue issue-#{id} tracker-#{tracker_id} status-#{status_id} #{priority.try(:css_classes)}"
|
|
1453 |
s = +"issue tracker-#{tracker_id} status-#{status_id} #{priority.try(:css_classes)}" |
|
1454 | 1454 |
s << ' closed' if closed? |
1455 | 1455 |
s << ' overdue' if overdue? |
1456 | 1456 |
s << ' child' if child? |
app/views/common/_calendar.html.erb | ||
---|---|---|
6 | 6 |
<li scope="col" class="calhead"><%= day_name((calendar.first_wday + i) % 7) %></li> |
7 | 7 |
<% end %> |
8 | 8 |
<% calendar.format_month.each_slice(7) do |week| %> |
9 |
<% weekly_events = calendar.events_on_week(week[0]) %> |
|
10 | 9 |
<li class='week-number'> |
11 | 10 |
<span class="label-week"><%= l(:label_week) %></span> <%= calendar.week_number week.first %> |
12 | 11 |
</li> |
... | ... | |
15 | 14 |
<p class="day-num"><%= day.day %> |
16 | 15 |
<span class="abbr-day">(<%= abbr_day_name(day.cwday) %>)</span> |
17 | 16 |
</p> |
18 |
<div class="cal-events"> |
|
19 |
<% weekly_events.each do |i| %> |
|
20 |
<div class="cal-event <%= "event-" + i.class.name.downcase %>"> |
|
21 |
<% if i.is_a? Issue %> |
|
22 |
<% if ((day == week[0] && (i.start_date.nil? || i.start_date < week[0])) || day == i.start_date || day == i.due_date) %> |
|
23 |
<% duration = ((i.due_date.nil? ? week[6] : [i.due_date, week[6]].min) - day).to_i + 1 %> |
|
24 |
<%= tag.div class: [ i.css_classes, 'tooltip hascontextmenu', day == week[0] ? 'week-0' : '', 'duration-' + duration.to_s, starting: day == i.start_date, ending: day == i.due_date ] do %> |
|
25 |
<span class="text"> |
|
26 |
<%= "#{i.project} -" unless @project && @project == i.project %> |
|
27 |
<%= link_to_issue i %> |
|
28 |
</span> |
|
29 |
<span class="tip"><%= render_issue_tooltip i %></span> |
|
30 |
<%= check_box_tag 'ids[]', i.id, false, :style => 'display:none;', :id => nil %> |
|
31 |
<% end %> |
|
32 |
<% end %> |
|
33 |
<% elsif i.due_date == day %> |
|
34 |
<span class="icon icon-package"> |
|
35 |
<%= "#{i.project} -" unless @project && @project == i.project %> |
|
36 |
<%= link_to_version i %> |
|
37 |
</span> |
|
17 |
<% calendar.events_on(day).each do |i| %> |
|
18 |
<% if i.is_a? Issue %> |
|
19 |
<%= tag.div class: [ i.css_classes, 'tooltip hascontextmenu', starting: day == i.start_date, ending: day == i.due_date] do %> |
|
20 |
<%= "#{i.project} -" unless @project && @project == i.project %> |
|
21 |
<%= link_to_issue i, :truncate => 30 %> |
|
22 |
<span class="tip"><%= render_issue_tooltip i %></span> |
|
23 |
<%= check_box_tag 'ids[]', i.id, false, :style => 'display:none;', :id => nil %> |
|
38 | 24 |
<% end %> |
39 |
</div> |
|
25 |
<% else %> |
|
26 |
<span class="icon icon-package"> |
|
27 |
<%= "#{i.project} -" unless @project && @project == i.project %> |
|
28 |
<%= link_to_version i %> |
|
29 |
</span> |
|
30 |
<% end %> |
|
40 | 31 |
<% end %> |
41 |
</div> |
|
42 | 32 |
</li> |
43 | 33 |
<% end %> |
44 | 34 |
<% end %> |
lib/redmine/helpers/calendar.rb | ||
---|---|---|
66 | 66 | |
67 | 67 |
# Sets calendar events |
68 | 68 |
def events=(events) |
69 |
@events = events.sort_by do |e| |
|
70 |
[ |
|
71 |
e.is_a?(Issue) ? 0 : 1, |
|
72 |
e.start_date || @enddt, |
|
73 |
e.due_date || @enddt, |
|
74 |
(e.start_date.nil? || e.start_date < @startdt) ? 0 : 1, |
|
75 |
] |
|
76 |
end |
|
69 |
@events = events |
|
77 | 70 |
@ending_events_by_days = @events.group_by {|event| event.due_date} |
78 | 71 |
@starting_events_by_days = @events.group_by {|event| event.start_date} |
79 | 72 |
end |
... | ... | |
83 | 76 |
((@ending_events_by_days[day] || []) + (@starting_events_by_days[day] || [])).uniq |
84 | 77 |
end |
85 | 78 | |
86 |
def events_on_week(week_start_date) |
|
87 |
@events.filter do |e| |
|
88 |
if e.is_a? Issue |
|
89 |
if e.start_date.nil? || e.due_date.nil? |
|
90 |
(!e.start_date.nil? && e.due_date.nil? && e.start_date < week_start_date+7) || |
|
91 |
(e.start_date.nil? && !e.due_date.nil? && e.due_date >= week_start_date+7) |
|
92 |
else |
|
93 |
e.start_date < week_start_date+7 && e.due_date >= week_start_date |
|
94 |
end |
|
95 |
else |
|
96 |
e.due_date >= week_start_date && e.due_date < week_start_date+7 |
|
97 |
end |
|
98 |
end |
|
99 |
end |
|
100 | ||
101 | 79 |
# Calendar current month |
102 | 80 |
def month |
103 | 81 |
@date.month |
public/javascripts/context_menu.js | ||
---|---|---|
30 | 30 |
if (event.which == 1 || (navigator.appVersion.match(/\bMSIE\b/))) { |
31 | 31 |
var tr = target.closest('.hascontextmenu').first(); |
32 | 32 |
if (tr.length > 0) { |
33 |
if (tr.closest(".cal").length > 0) { |
|
34 |
// Select the same issue id elements in the Calendar |
|
35 |
var issueNumberClass = tr.attr("class").split(" ").filter((i) => i.startsWith("issue-"))[0]; |
|
36 |
if (issueNumberClass !== undefined) { |
|
37 |
tr = tr.closest(".cal").find(".hascontextmenu" + "." + issueNumberClass); |
|
38 |
} |
|
39 |
} |
|
40 | 33 |
// a row was clicked |
41 | 34 |
if (target.is('td.checkbox')) { |
42 | 35 |
// the td containing the checkbox was clicked, toggle the checkbox |
public/stylesheets/application.css | ||
---|---|---|
1110 | 1110 |
border: 1px solid #c0c0c0; |
1111 | 1111 |
border-spacing: 0; |
1112 | 1112 |
border-radius: 3px; |
1113 |
position: relative; |
|
1114 | 1113 |
} |
1115 | 1114 | |
1116 | 1115 |
.cal .calhead { |
... | ... | |
1131 | 1130 |
.cal .week-number .label-week { |
1132 | 1131 |
display: none; |
1133 | 1132 |
} |
1134 |
.cal .week-number .event-id { |
|
1135 |
visibility: hidden; |
|
1136 |
} |
|
1137 |
.cal .week-number .event-version { |
|
1138 |
height: 2rem; |
|
1139 |
} |
|
1140 | 1133 | |
1141 | 1134 |
.cal .calbody { |
1142 | 1135 |
border: 1px solid #d7d7d7; |
... | ... | |
1147 | 1140 |
line-height: 1.2; |
1148 | 1141 |
min-height: calc(1.2em * 6); |
1149 | 1142 |
padding: 2px; |
1150 |
display: grid; |
|
1151 |
grid-template-rows: auto 1fr; |
|
1152 | 1143 |
} |
1153 | 1144 | |
1154 | 1145 |
.cal .calbody p.day-num {font-size: 1.1em; text-align:right;} |
... | ... | |
1156 | 1147 |
.cal .calbody.odd p.day-num {color: #bbb;} |
1157 | 1148 |
.cal .calbody.today {background:#ffd;} |
1158 | 1149 |
.cal .calbody.today p.day-num {font-weight: bold;} |
1159 |
.cal .calbody .cal-event { |
|
1160 |
height: calc(1.2rem + 10px); |
|
1161 |
} |
|
1162 |
.cal .calbody .cal-event.event-version { |
|
1163 |
height: calc(2.2rem + 10px); |
|
1164 |
} |
|
1165 |
.cal .calbody .cal-event > .issue { |
|
1166 |
position: absolute; |
|
1167 |
} |
|
1168 | ||
1169 |
.cal .calbody .cal-event > .issue > .text { |
|
1170 |
display: inline-block; |
|
1171 |
width: 100%; |
|
1172 |
white-space: nowrap; |
|
1173 |
overflow: hidden; |
|
1174 |
text-overflow: ellipsis; |
|
1175 |
} |
|
1176 | ||
1177 |
/* ((ul.width - week-number.width) / 7 * n - div.issue.padding - div.issue.border - li.calbody.padding - li.calbody.border) */ |
|
1178 |
.cal .calbody .cal-event > .issue.duration-1 {width: calc((100% - 2rem) / 7 * 1 - 12px - 2px - 2px - 2px);} |
|
1179 |
.cal .calbody .cal-event > .issue.duration-2 {width: calc((100% - 2rem) / 7 * 2 - 12px - 2px - 2px - 2px);} |
|
1180 |
.cal .calbody .cal-event > .issue.duration-3 {width: calc((100% - 2rem) / 7 * 3 - 12px - 2px - 2px - 2px);} |
|
1181 |
.cal .calbody .cal-event > .issue.duration-4 {width: calc((100% - 2rem) / 7 * 4 - 12px - 2px - 2px - 2px);} |
|
1182 |
.cal .calbody .cal-event > .issue.duration-5 {width: calc((100% - 2rem) / 7 * 5 - 12px - 2px - 2px - 2px);} |
|
1183 |
.cal .calbody .cal-event > .issue.duration-6 {width: calc((100% - 2rem) / 7 * 6 - 12px - 2px - 2px - 2px);} |
|
1184 |
.cal .calbody .cal-event > .issue.duration-7 {width: calc((100% - 2rem) / 7 * 7 - 12px - 2px - 2px - 2px);} |
|
1185 | ||
1186 |
.cal .calbody .cal-event > .issue.ending:not(.week-0):not(.starting) {display:none;} |
|
1187 | 1150 | |
1188 | 1151 |
.cal .calbody .icon {padding-top: 2px; padding-bottom: 3px;} |
1189 | 1152 |
.cal .calbody.nwday:not(.odd) {background-color:#f1f1f1;} |
1153 |
.cal .starting a.issue, p.cal.legend .starting {background: url(../images/bullet_go.png) no-repeat -1px -2px; padding-left:16px;} |
|
1154 |
.cal .ending a.issue, p.cal.legend .ending {background: url(../images/bullet_end.png) no-repeat -1px -2px; padding-left:16px;} |
|
1155 |
.cal .starting.ending a.issue, p.cal.legend .starting.ending {background: url(../images/bullet_diamond.png) no-repeat -1px -2px; padding-left:16px;} |
|
1190 | 1156 | |
1191 |
p.cal.legend {display:none;} |
|
1192 | 1157 |
p.cal.legend span {display:block;} |
1193 | 1158 |
.controller-calendars p.buttons {margin-top: unset;} |
1194 | 1159 |
public/stylesheets/responsive.css | ||
---|---|---|
836 | 836 |
display: inline; |
837 | 837 |
} |
838 | 838 | |
839 |
.cal .calbody .cal-events > .cal-event { |
|
840 |
height: auto; |
|
841 |
} |
|
842 | ||
843 |
.cal .calbody .cal-events > .cal-event > .issue { |
|
844 |
width: auto; |
|
845 |
position: relative; |
|
846 |
overflow: visible; |
|
847 |
white-space:normal; |
|
848 |
} |
|
849 | ||
850 |
div.tooltip:hover span.tip { |
|
851 |
position: absolute; |
|
852 |
} |
|
853 | ||
854 | 839 |
.cal .week-number { |
855 | 840 |
border: 1px solid #c0c0c0; |
856 | 841 |
text-align: left; |
... | ... | |
866 | 851 |
font-size: 1.1em; |
867 | 852 |
text-align: left; |
868 | 853 |
} |
869 | ||
870 |
.cal .calbody .cal-events > .cal-event > .issue.starting, |
|
871 |
.cal .calbody .cal-events > .cal-event > .issue.ending {display: block;} |
|
872 |
.cal .calbody .cal-events > .cal-event > .issue.week-0:not(.starting):not(.ending) {display:none;} |
|
873 | ||
874 |
.cal .starting a.issue, p.cal.legend .starting {background: url(../images/bullet_go.png) no-repeat -1px -2px; padding-left:16px;} |
|
875 |
.cal .ending a.issue, p.cal.legend .ending {background: url(../images/bullet_end.png) no-repeat -1px -2px; padding-left:16px;} |
|
876 |
.cal .starting.ending a.issue, p.cal.legend .starting.ending {background: url(../images/bullet_diamond.png) no-repeat -1px -2px; padding-left:16px;} |
|
877 | ||
878 |
p.cal.legend {display:block;} |
|
879 | 854 |
} |
880 | 855 | |
881 | 856 |
@media all and (max-width: 599px) { |
- « Previous
- 1
- 2
- 3
- 4
- Next »