Commit 7ac96fd9 authored by Serge S. Koval's avatar Serge S. Koval

Fixed #321. Time picker works now

parent 81646c0c
...@@ -15,9 +15,10 @@ class TimeField(fields.Field): ...@@ -15,9 +15,10 @@ class TimeField(fields.Field):
A text field which stores a `datetime.time` object. A text field which stores a `datetime.time` object.
Accepts time string in multiple formats: 20:10, 20:10:00, 10:00 am, 9:30pm, etc. Accepts time string in multiple formats: 20:10, 20:10:00, 10:00 am, 9:30pm, etc.
""" """
widget = widgets.TextInput() widget = admin_widgets.TimePickerWidget()
def __init__(self, label=None, validators=None, formats=None, **kwargs): def __init__(self, label=None, validators=None, formats=None,
default_format=None, widget_format=None, **kwargs):
""" """
Constructor Constructor
...@@ -27,6 +28,10 @@ class TimeField(fields.Field): ...@@ -27,6 +28,10 @@ class TimeField(fields.Field):
Field validators Field validators
:param formats: :param formats:
Supported time formats, as a enumerable. Supported time formats, as a enumerable.
:param default_format:
Default time format. Defaults to '%H:%M:%S'
:param widget_format:
Widget date format. Defaults to 'hh:ii:ss'
:param kwargs: :param kwargs:
Any additional parameters Any additional parameters
""" """
...@@ -36,11 +41,14 @@ class TimeField(fields.Field): ...@@ -36,11 +41,14 @@ class TimeField(fields.Field):
'%I:%M:%S%p', '%I:%M%p', '%I:%M:%S%p', '%I:%M%p',
'%I:%M:%S %p', '%I:%M %p') '%I:%M:%S %p', '%I:%M %p')
self.default_format = default_format or '%H:%M:%S'
self.widget_format = widget_format or 'hh:ii:ss'
def _value(self): def _value(self):
if self.raw_data: if self.raw_data:
return u' '.join(self.raw_data) return u' '.join(self.raw_data)
else: else:
return self.data and self.data.strftime(self.format) or u'' return self.data and self.data.strftime(self.default_format) or u''
def process_formdata(self, valuelist): def process_formdata(self, valuelist):
if valuelist: if valuelist:
......
...@@ -64,6 +64,19 @@ class DateTimePickerWidget(widgets.TextInput): ...@@ -64,6 +64,19 @@ class DateTimePickerWidget(widgets.TextInput):
return super(DateTimePickerWidget, self).__call__(field, **kwargs) return super(DateTimePickerWidget, self).__call__(field, **kwargs)
class TimePickerWidget(widgets.TextInput):
"""
Date picker widget.
You must include bootstrap-datepicker.js and form.js for styling to work.
"""
def __call__(self, field, **kwargs):
kwargs['data-role'] = u'timepicker'
kwargs['data-date-format'] = field.widget_format or 'hh:ii:ss'
kwargs['data-date-autoclose'] = u'true'
return super(TimePickerWidget, self).__call__(field, **kwargs)
class RenderTemplateWidget(object): class RenderTemplateWidget(object):
""" """
WTForms widget that renders Jinja2 template WTForms widget that renders Jinja2 template
......
...@@ -106,11 +106,20 @@ ...@@ -106,11 +106,20 @@
processAjaxWidget($el, name); processAjaxWidget($el, name);
return true; return true;
case 'datepicker': case 'datepicker':
$el.datetimepicker({minView: 'month'}); $el.datetimepicker({
minView: 'month'
});
return true; return true;
case 'datetimepicker': case 'datetimepicker':
$el.datetimepicker(); $el.datetimepicker();
return true; return true;
case 'timepicker':
$el.datetimepicker({
startView: 'day',
maxView: 'day',
formatViewType: 'time'
});
return true;
} }
}; };
......
...@@ -481,6 +481,7 @@ ...@@ -481,6 +481,7 @@
if (this.date == null || this.viewDate == null) { if (this.date == null || this.viewDate == null) {
return; return;
} }
var d = new Date(this.viewDate), var d = new Date(this.viewDate),
year = d.getUTCFullYear(), year = d.getUTCFullYear(),
month = d.getUTCMonth(), month = d.getUTCMonth(),
...@@ -493,8 +494,10 @@ ...@@ -493,8 +494,10 @@
endMonth = this.endDate !== Infinity ? this.endDate.getUTCMonth() : Infinity, endMonth = this.endDate !== Infinity ? this.endDate.getUTCMonth() : Infinity,
currentDate = (new UTCDate(this.date.getUTCFullYear(), this.date.getUTCMonth(), this.date.getUTCDate())).valueOf(), currentDate = (new UTCDate(this.date.getUTCFullYear(), this.date.getUTCMonth(), this.date.getUTCDate())).valueOf(),
today = new Date(); today = new Date();
this.picker.find('.datetimepicker-days thead th:eq(1)')
this.picker.find('.datetimepicker-days thead th:eq(1)')
.text(dates[this.language].months[month]+' '+year); .text(dates[this.language].months[month]+' '+year);
if (this.formatViewType == "time") { if (this.formatViewType == "time") {
var hourConverted = hours % 12 ? hours % 12 : 12; var hourConverted = hours % 12 ? hours % 12 : 12;
var hoursDisplay = (hourConverted < 10 ? '0' : '') + hourConverted; var hoursDisplay = (hourConverted < 10 ? '0' : '') + hourConverted;
...@@ -510,6 +513,7 @@ ...@@ -510,6 +513,7 @@
this.picker.find('.datetimepicker-minutes thead th:eq(1)') this.picker.find('.datetimepicker-minutes thead th:eq(1)')
.text(dayMonth + ' ' + dates[this.language].months[month] + ' ' + year); .text(dayMonth + ' ' + dates[this.language].months[month] + ' ' + year);
} }
this.picker.find('tfoot th.today') this.picker.find('tfoot th.today')
.text(dates[this.language].today) .text(dates[this.language].today)
.toggle(this.todayBtn !== false); .toggle(this.todayBtn !== false);
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
{% block head %} {% block head %}
{{ super() }} {{ super() }}
<link href="{{ url_for('admin.static', filename='select2/select2.css') }}" rel="stylesheet"> <link href="{{ url_for('admin.static', filename='select2/select2.css') }}" rel="stylesheet">
<link href="{{ url_for('admin.static', filename='datepicker/bootstrap-datepicker.css') }}" rel="stylesheet"> <link href="{{ url_for('admin.static', filename='datetimepicker/bootstrap-datetimepicker.css') }}" rel="stylesheet">
{% endblock %} {% endblock %}
{% block body %} {% block body %}
...@@ -139,7 +139,7 @@ ...@@ -139,7 +139,7 @@
{% block tail %} {% block tail %}
{{ super() }} {{ super() }}
<script src="{{ url_for('admin.static', filename='datepicker/bootstrap-datepicker.js') }}"></script> <script src="{{ url_for('admin.static', filename='datetimepicker/bootstrap-datetimepicker.js') }}"></script>
<script src="{{ url_for('admin.static', filename='admin/js/form.js') }}"></script> <script src="{{ url_for('admin.static', filename='admin/js/form.js') }}"></script>
<script src="{{ url_for('admin.static', filename='admin/js/filters.js') }}"></script> <script src="{{ url_for('admin.static', filename='admin/js/filters.js') }}"></script>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment