Skip to content

Commit 415e82f

Browse files
committed
Merge branch '3.x'
2 parents cecd073 + 627b276 commit 415e82f

File tree

9 files changed

+100
-70
lines changed

9 files changed

+100
-70
lines changed

bootstrap_datepicker_plus/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ def _make_version(major, minor, micro, releaselevel, serial):
88
return version
99

1010

11-
version_info = (3, 0, 5, "final", 0)
11+
version_info = (3, 0, 6, "final", 0)
1212
__version__ = _make_version(*version_info)

bootstrap_datepicker_plus/_base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ def get_context(self, name, value, attrs):
112112
"""Return widget context dictionary."""
113113
# pylint: disable=no-member
114114
context = super().get_context(name, value, attrs)
115-
context["widget"]["attrs"]["dp_config"] = json_dumps(self.config)
115+
context["widget"]["attrs"]["data-dp-config"] = json_dumps(self.config)
116116
return context
117117

118118
def start_of(self, event_id):
Lines changed: 82 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,86 @@
1-
jQuery(function ($) {
2-
var datepickerDict = {};
3-
var isBootstrap4 = $.fn.collapse.Constructor.VERSION.split('.').shift() == "4";
4-
function fixMonthEndDate(e, picker) {
5-
e.date && picker.val().length && picker.val(e.date.endOf('month').format('YYYY-MM-DD'));
1+
(function (factory) {
2+
if (typeof define === 'function' && define.amd)
3+
define(['jquery'], factory)
4+
else if (typeof module === 'object' && module.exports)
5+
module.exports = factory(require('jquery'))
6+
else
7+
factory(jQuery)
8+
}(function ($) {
9+
var datepickerDict = {};
10+
const bootstrapVersion = (window.bootstrap?.Collapse||$.fn.collapse.Constructor).VERSION;
11+
var isBootstrap4 = bootstrapVersion.split('.').shift() === "4";
12+
var isBootstrap5 = bootstrapVersion.split('.').shift() === "5";
13+
function fixMonthEndDate(e, picker) {
14+
e.date && picker.val().length && picker.val(e.date.endOf('month').format('YYYY-MM-DD'));
15+
}
16+
function initOnePicker(element, options) {
17+
var $element = $(element), data = {};
18+
try {
19+
data = JSON.parse($element.attr('data-dp-config'));
620
}
7-
$("[dp_config]:not([disabled])").each(function (i, element) {
8-
var $element = $(element), data = {};
9-
try {
10-
data = JSON.parse($element.attr('dp_config'));
11-
}
12-
catch (x) { }
13-
if (data.id && data.options) {
14-
data.$element = $element.datetimepicker(data.options);
15-
data.datepickerdata = $element.data("DateTimePicker");
16-
datepickerDict[data.id] = data;
17-
data.$element.next('.input-group-addon').on('click', function(){
18-
data.datepickerdata.show();
19-
});
20-
if(isBootstrap4){
21-
data.$element.on("dp.show", function (e) {
22-
$('.collapse.in').addClass('show');
23-
});
24-
}
25-
}
21+
catch (x) { }
22+
$.extend(1, data.options, options);
23+
if (data.id && data.options) {
24+
data.$element = $element.datetimepicker(data.options);
25+
data.datepickerdata = $element.data("DateTimePicker");
26+
data.$element.next('.input-group-addon').on('click', function() {
27+
data.datepickerdata.show();
28+
});
29+
if (isBootstrap4 || isBootstrap5) {
30+
data.$element.on("dp.show", function(e) {
31+
$('.collapse.in').addClass('show');
32+
});
33+
}
34+
}
35+
return data;
36+
};
37+
function initLinkedPickers(to_picker) {
38+
var from_picker = datepickerDict[to_picker.linked_to];
39+
from_picker.datepickerdata.maxDate(to_picker.datepickerdata.date() || false);
40+
to_picker.datepickerdata.minDate(from_picker.datepickerdata.date() || false);
41+
from_picker.$element.on("dp.change", function (e) {
42+
to_picker.datepickerdata.minDate(e.date || false);
2643
});
27-
$.each(datepickerDict, function (id, to_picker) {
28-
if (to_picker.linked_to) {
29-
var from_picker = datepickerDict[to_picker.linked_to];
30-
from_picker.datepickerdata.maxDate(to_picker.datepickerdata.date() || false);
31-
to_picker.datepickerdata.minDate(from_picker.datepickerdata.date() || false);
32-
from_picker.$element.on("dp.change", function (e) {
33-
to_picker.datepickerdata.minDate(e.date || false);
34-
});
35-
to_picker.$element.on("dp.change", function (e) {
36-
if (to_picker.picker_type == 'MONTH') fixMonthEndDate(e, to_picker.$element);
37-
from_picker.datepickerdata.maxDate(e.date || false);
38-
});
39-
if (to_picker.picker_type == 'MONTH') {
40-
to_picker.$element.on("dp.hide", function (e) {
41-
fixMonthEndDate(e, to_picker.$element);
42-
});
43-
fixMonthEndDate({ date: to_picker.datepickerdata.date() }, to_picker.$element);
44-
}
45-
}
44+
to_picker.$element.on("dp.change", function (e) {
45+
if (to_picker.picker_type == 'MONTH') fixMonthEndDate(e, to_picker.$element);
46+
from_picker.datepickerdata.maxDate(e.date || false);
4647
});
47-
if(isBootstrap4) {
48-
$('body').on('show.bs.collapse','.bootstrap-datetimepicker-widget .collapse',function(e){
49-
$(e.target).addClass('in');
50-
});
51-
$('body').on('hidden.bs.collapse','.bootstrap-datetimepicker-widget .collapse',function(e){
52-
$(e.target).removeClass('in');
53-
});
48+
if (to_picker.picker_type == 'MONTH') {
49+
to_picker.$element.on("dp.hide", function (e) {
50+
fixMonthEndDate(e, to_picker.$element);
51+
});
52+
fixMonthEndDate({ date: to_picker.datepickerdata.date() }, to_picker.$element);
53+
}
54+
};
55+
$.fn.djangoDatetimePicker = function(options){
56+
options = options || {};
57+
var newPickers = {};
58+
$.each(this, function (i, element) {
59+
var picker = initOnePicker($(element), options);
60+
newPickers[picker.id] = picker;
61+
});
62+
$.extend(datepickerDict, newPickers);
63+
$.each(newPickers, function (i, picker) {
64+
if (picker.linked_to)
65+
initLinkedPickers(picker);
66+
});
67+
return this;
68+
}
69+
$(function(){
70+
$("[data-dp-config]:not([disabled])").djangoDatetimePicker();
71+
if (isBootstrap4 || isBootstrap5) {
72+
$('body').on('show.bs.collapse','.bootstrap-datetimepicker-widget .collapse',function(e){
73+
$(e.target).addClass('in');
74+
});
75+
$('body').on('hidden.bs.collapse','.bootstrap-datetimepicker-widget .collapse',function(e){
76+
$(e.target).removeClass('in');
77+
});
78+
}
79+
if(isBootstrap5){
80+
$('.input-group-addon[data-target="#datetimepicker1"]').each(function (){
81+
$(this).attr('data-bs-target','#datetimepicker1').removeAttr('data-target')
82+
$(this).attr('data-bs-toggle','datetimepickerv').removeAttr('data-toggle')
83+
})
5484
}
55-
});
85+
});
86+
}));
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<div class="input-group date">
2-
{% include "bootstrap_datepicker_plus/input.html" %}
3-
<div class="input-group-addon input-group-append" data-target="#datetimepicker1" data-toggle="datetimepickerv">
4-
<div class="input-group-text"><i class="glyphicon glyphicon-calendar"></i></div>
5-
</div>
2+
{% include "bootstrap_datepicker_plus/input.html" %}
3+
<div class="input-group-addon input-group-append input-group-text">
4+
<i class="glyphicon glyphicon-calendar"></i>
5+
</div>
66
</div>
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<div class="input-group date">
2-
{% include "bootstrap_datepicker_plus/input.html" %}
3-
<div class="input-group-addon input-group-append" data-target="#datetimepicker1" data-toggle="datetimepickerv">
4-
<div class="input-group-text"><i class="glyphicon glyphicon-time"></i></div>
5-
</div>
2+
{% include "bootstrap_datepicker_plus/input.html" %}
3+
<div class="input-group-addon input-group-append input-group-text">
4+
<i class="glyphicon glyphicon-time"></i>
5+
</div>
66
</div>

dev/myapp/templates/layouts/bootstrap4.html

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
{% block extra_css %}
1010
{% endblock %}
1111
</head>
12-
1312
<body>
1413
<nav class="navbar navbar-expand-lg navbar-light bg-light">
1514
<a class="navbar-brand" href="https://github.com/monim67/django-bootstrap-datepicker-plus">
@@ -42,10 +41,10 @@ <h4 class="alert-heading">Not supported!</h4>
4241
</div>
4342
{% endif %}
4443
</div>
45-
44+
4645
{% bootstrap_javascript jquery='full' %} {# Embed Bootstrap JS+jQuery #}
4746
{% block extra_js %}
4847
{% endblock %}
4948
</body>
5049

51-
</html>
50+
</html>

docs/index.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
django-bootstrap-datepicker-plus documentation
33
##################################################
44

5-
This django widget contains Bootstrap 3 and Bootstrap 4
5+
This django widget contains Bootstrap 3, Bootstrap 4 and Bootstrap 5
66
Date-Picker, Time-Picker, DateTime-Picker, Month-Picker and Year-Picker input
7-
with date-range-picker functionality for django version 2.1, 2.0, 1.11, 1.10 and 1.8.
7+
with date-range-picker functionality for django version >= 1.8.
88
The widget implements `bootstrap-datetimepicker v4 <http://eonasdan.github.io/bootstrap-datetimepicker/>`_
99
to show bootstrap-datepicker in django model forms and custom forms
1010
which can be configured easily for date-range selection.

setup.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ def readme():
1111
setup(
1212
name="django-bootstrap-datepicker-plus",
1313
version=bootstrap_datepicker_plus.__version__,
14-
description="Bootstrap3/Bootstrap4 DatePickerInput, TimePickerInput, "
14+
description="Bootstrap3/Bootstrap4/Bootstrap5 DatePickerInput, TimePickerInput, "
1515
"DateTimePickerInput, MonthPickerInput, YearPickerInput "
16-
"with date-range-picker functionality for django version 1.11, 1.10 and 1.8",
16+
"with date-range-picker functionality for django version >= 1.8",
1717
long_description=readme(),
1818
url="https://github.com/monim67/django-bootstrap-datepicker-plus",
1919
author="Munim Munna",
@@ -22,7 +22,7 @@ def readme():
2222
keywords="django bootstrap date-picker time-picker datetime-picker "
2323
"date-range-picker",
2424
packages=["bootstrap_datepicker_plus"],
25-
install_requires=["django>=1.8,<2.0",],
25+
install_requires=["django>=1.8",],
2626
python_requires=">=3.6",
2727
package_data={
2828
"bootstrap_datepicker_plus": [

tests/test_context_render.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def test_get_context(self):
1919
self.assertEqual(context["widget"]["name"], "input_name")
2020
self.assertEqual(context["widget"]["value"], "2018-04-12")
2121
self.assertTrue(
22-
context["widget"]["attrs"]["dp_config"] == json_dumps(dp_input.config)
22+
context["widget"]["attrs"]["data-dp-config"] == json_dumps(dp_input.config)
2323
)
2424

2525
def test_date_input_snapshot(self):

0 commit comments

Comments
 (0)