0001-manager-add-a-day-picker-popdown-to-agenda-day-view-.patch
chrono/manager/static/css/style.scss | ||
---|---|---|
78 | 78 |
padding: 0 1ex; |
79 | 79 |
} |
80 | 80 | |
81 |
.dayview h2 span { |
|
81 |
.dayview h2 > span {
|
|
82 | 82 |
display: inline-block; |
83 | 83 |
min-width: 22ex; |
84 | 84 |
} |
... | ... | |
155 | 155 |
span.start-time { |
156 | 156 |
font-size: 80%; |
157 | 157 |
} |
158 | ||
159 |
.day-title { |
|
160 |
cursor: pointer; |
|
161 |
} |
|
162 | ||
163 |
.day-title .day-picker { |
|
164 |
&::before { |
|
165 |
position: absolute; |
|
166 |
content: ""; |
|
167 |
display: block; |
|
168 |
width: 1ex; |
|
169 |
height: 1ex; |
|
170 |
border: 1px solid #d0d0d0; |
|
171 |
border-width: 1px 0 0 1px; |
|
172 |
top: -0.6ex; |
|
173 |
background: #FAFAFA; |
|
174 |
transform: rotate(45deg); |
|
175 |
} |
|
176 |
position: absolute; |
|
177 |
background: #FAFAFA; |
|
178 |
border: 1px solid #d0d0d0; |
|
179 |
box-shadow: 0px 1px 1px 2px rgba(0, 0, 0, 0.04); |
|
180 |
padding: 1ex 4ex; |
|
181 |
left: 0; |
|
182 |
top: 3ex; |
|
183 |
z-index: 100; |
|
184 |
} |
chrono/manager/static/js/chrono.manager.js | ||
---|---|---|
4 | 4 |
var booked = $(this).data('booked'); |
5 | 5 |
$(this).find('.occupation-bar').css('max-width', 100 * booked / total + '%'); |
6 | 6 |
}); |
7 |
$('.day-title > span').on('click', function() { |
|
8 |
$(this).parent().find('.day-picker').toggle(); |
|
9 |
}); |
|
10 |
$('.day-picker button').on('click', function() { |
|
11 |
window.location = '../../../' + $('[name=year]').val() + '/' + $('[name=month]').val() + '/' + $('[name=day]').val() + '/'; |
|
12 |
return false; |
|
13 |
}); |
|
7 | 14 |
}); |
chrono/manager/templates/chrono/manager_agenda_day_view.html | ||
---|---|---|
11 | 11 |
{% block appbar %} |
12 | 12 |
<h2> |
13 | 13 |
<a href="{{ view.get_previous_day_url }}">←</a> |
14 |
<span class="day-title">{{ view.date|date:"l j F Y" }}</span> |
|
14 |
<span class="day-title"><span>{{ view.date|date:"l j F Y" }}</span> |
|
15 |
{% with selected_day=view.date|date:"j" selected_month=view.date|date:"n" selected_year=view.date|date:"Y" %} |
|
16 |
<div class="day-picker" style="display: none"> |
|
17 |
<select name="day">{% for day in view.get_days %}<option value="{{ day }}" {% if selected_day == day %}selected{% endif %}>{{day}}</option>{% endfor %}</select> |
|
18 |
<select name="month">{% for month, month_label in view.get_months %}<option value="{{ month }}" {% if selected_month == month %}selected{% endif %}>{{ month_label }}</option>{% endfor %}</select> |
|
19 |
<select name="year">{% for year in view.get_years %}<option value="{{ year }}" {% if selected_year == year %}selected{% endif %}>{{year}}</option>{% endfor %}</select> |
|
20 |
<button>{% trans 'Set Date' %}</button> |
|
21 |
</div> |
|
22 |
{% endwith %} |
|
23 |
</span> |
|
15 | 24 |
<a href="{{ view.get_next_day_url }}">→</a> |
16 | 25 |
</h2> |
17 | 26 |
{% if user_can_manage %} |
chrono/manager/views.py | ||
---|---|---|
23 | 23 |
from django.db.models import Q |
24 | 24 |
from django.http import HttpResponse, Http404, HttpResponseRedirect |
25 | 25 |
from django.shortcuts import get_object_or_404 |
26 |
from django.utils.dates import MONTHS |
|
26 | 27 |
from django.utils.timezone import localtime, now, make_aware |
27 | 28 |
from django.utils.translation import ugettext_lazy as _ |
28 | 29 |
from django.utils.translation import ungettext |
... | ... | |
250 | 251 |
current_date += interval |
251 | 252 |
first = False |
252 | 253 | |
254 |
def get_days(self): |
|
255 |
return [str(x) for x in range(1, 32)] |
|
256 | ||
257 |
def get_months(self): |
|
258 |
return [(str(x), MONTHS[x]) for x in range(1, 13)] |
|
259 | ||
260 |
def get_years(self): |
|
261 |
year = now().year |
|
262 |
return [str(x) for x in range(year, year+5)] |
|
263 | ||
253 | 264 |
agenda_day_view = AgendaDayView.as_view() |
254 | 265 | |
255 | 266 | |
256 |
- |