angular / components

Component infrastructure and Material Design components for Angular
https://material.angular.io
MIT License
24.32k stars 6.72k forks source link

bug(MaterialLuxonAdapter): Parsing format for some text inputs fails due to iso check before format check #28703

Open dylandrendel opened 6 months ago

dylandrendel commented 6 months ago

Is this a regression?

The previous version in which this bug was not present was

N/A

Description

In /src/material-luxon-adapter/adapter/luxon-date-adapter.ts#L174 the date is formatted with ISO before the user provided formats.

This leads to a bug where specific text inputs are not parsing correctly according to the user provided formats.

For example, I provide the format MMyyyy to the parse dateInputs array. This gets ignored for certain string inputs. One example is 082001. This gets parsed as yyyyMM by the ISO check before checking my provided formats array and returns incorrectly as 01/0820 instead of the desired 08/2001.

parse(value: any, parseFormat: string | string[]): LuxonDateTime | null {
    const iso8601Date = LuxonDateTime.fromISO(value, options);

    if (this.isValid(iso8601Date)) {
      return iso8601Date;
    }

    const formats = Array.isArray(parseFormat) ? parseFormat : [parseFormat];

    if (!parseFormat.length) {
      throw Error('Formats array must not be empty.');
    }

    for (const format of formats) {
      const fromFormat = LuxonDateTime.fromFormat(value, format, options);

      if (this.isValid(fromFormat)) {
        return fromFormat;
      }
    }

...

Reproduction

StackBlitz link: https://stackblitz.com/edit/ocbei5?file=package.json Steps to reproduce:

  1. provide the format MMyyyy to the parse dateInputs array
  2. type 082001 into the date input with luxon date times and tab off to enter

Expected Behavior

Gets parsed correctly as 08/2001 and displays as 08/2001.

Actual Behavior

Gets parsed incorrectly by ISO check as 01/0820 and displays as 01/0820.

Environment

angelaki commented 4 months ago

Just found this issue comming from the Moment adapter just having switched to Luxon. I expected it to behave about the same - but input totally doesn't!

Using moment the date input was pretty intuitive: Just putting a 15 was parsed to 15th of current month & year. 15.5 (Germany) was parsed to 15th of 5th month and so on. Using the Luxon adapter now always expects me to input a full date, even including the zeros! Or am I mistaken? Is there any possibility to make it behave about the same?

And is the original issue going to be solved, soon? Seems pretty drastical to me.