﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
25857	DateTimeShortcuts.js could try and consume all DATE_INPUT_FORMATS.	Keryn Knight	nobody	"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)."	New feature	new	contrib.admin	dev	Normal		calendar	django@… Ülgen Sarıkavak	Accepted	0	0	0	0	0	0
