Opened 11 years ago
Last modified 11 hours ago
#25857 assigned New feature
DateTimeShortcuts.js could try and consume all DATE_INPUT_FORMATS.
| Reported by: | Keryn Knight | Owned by: | Vaibhav Pant |
|---|---|---|---|
| Component: | contrib.admin | Version: | dev |
| Severity: | Normal | Keywords: | calendar |
| Cc: | django@…, Ülgen Sarıkavak | Triage Stage: | Accepted |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Relates to: #25856, #25024, #23049
Currently, there are 3 uses of DATE_INPUT_FORMATS in the DateTimeShortcuts part of the JS calendar widget.
Their use is always get_format('DATE_INPUT_FORMATS')[0] which means if your first DATE_INPUT_FORMAT is not JS compatible (see, eg: #25856, #23049) the string written back to the input will include undefined
Here's a proposed proof-of-concept solution to get a first compatible match which would pass on both JS and Python sides.
The slightly complexity lies in the fact that rather than an exception, new Date('undefined') actually just yields a string of Invalid Date when used. However, even when given valid a date without a time portion, getTime should always yield either NaN or an integer.
DateTimeShortcuts.tryFormats = function(date) {
var dateFormats = get_format('DATE_INPUT_FORMATS');
for (var i=0; i < dateFormats.length; i++) {
var currentFormat = dateFormats[i];
var dateStr = date.strftime(currentFormat);
var madeDate = new Date(dateStr);
if (isNaN(madeDate.getTime()) === false) {
return {format: currentFormat, value: dateStr};
}
}
return {format: void(0), value: void(0)};
DateTimeShortcuts.bestDateFormat = DateTimeShortcuts.tryFormats(new Date())['format'];
(NB: bestDateFormat would perhaps be better served by being set in DateTimeShortcuts.init but whatever)
and then usages of get_format('DATE_INPUT_FORMATS')[0] could be replaced with DateTimeShortcuts.bestDateFormat in:
handleCalendarCallbackhandleCalendarQuickLinkopenCalendar
Not sure what would be best in the case where there are no valid formats (format would be undefined)
So, given the following:
"DATE_INPUT_FORMATS": [ "%B %d, %Y", "%d/%m/%Y", "%m/%d/%Y" ]
the best match would be "%d/%m/%Y" because %B is unsupported (#25856).
Change History (4)
comment:1 by , 11 years ago
| Triage Stage: | Unreviewed → Accepted |
|---|
comment:2 by , 3 years ago
| Cc: | added |
|---|
comment:3 by , 5 weeks ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
comment:4 by , 11 hours ago
Hi, I've claimed this ticket and plan to work on it.
#25856 and #23049 added %B, %a and %A to the JS strftime, but formats using %j, %U or %W still aren't supported. If the first DATE_INPUT_FORMATS entry uses one of those, the picker still writes "undefined" into the input.
My plan:
- Add a helper that returns the first DATE_INPUT_FORMATS entry the JS strftime fully supports, checking the format string rather than parsing with new Date().
- Use it where get_format('DATE_INPUT_FORMATS')[0] is used now.
- Fall back to %Y-%m-%d if none are supported.
- Add QUnit tests.
Is %Y-%m-%d an acceptable fallback? Happy to adjust if the code has changed since the ticket was opened.
My knowledge of localization is limited, but this seems to make sense. Maybe other experts can offer some advice.