Opened 10 years ago
Last modified 20 months ago
#25857 new New feature
DateTimeShortcuts.js could try and consume all DATE_INPUT_FORMATS.
| Reported by: | Keryn Knight | Owned by: | nobody |
|---|---|---|---|
| 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 (2)
comment:1 by , 10 years ago
| Triage Stage: | Unreviewed → Accepted |
|---|
comment:2 by , 20 months ago
| Cc: | added |
|---|
My knowledge of localization is limited, but this seems to make sense. Maybe other experts can offer some advice.