Opened 2 years ago

Last modified 2 years 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: master
Severity: Normal Keywords: calendar
Cc: django@… 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:

  • handleCalendarCallback
  • handleCalendarQuickLink
  • openCalendar

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 (1)

comment:1 Changed 2 years ago by Tim Graham

Triage Stage: UnreviewedAccepted

My knowledge of localization is limited, but this seems to make sense. Maybe other experts can offer some advice.

Note: See TracTickets for help on using tickets.
Back to Top