Re: [DISCUSSION] LocalDate*Time*TextField modification

2023-09-22 Thread Sven Meier
LocalD*TextField has the purpose to offer some convenience constructors 
and implementing ITextFormatProvider,


If you allow people to use a custom converter, this class loses its purpose.

Sven


On 22.09.23 04:47, Maxim Solodovnik wrote:

On Wed, 13 Sept 2023 at 05:13, Sven Meier  wrote:

Hi Maxim,

it will be hard to make that suitable for different projects with
different requirements:
In Arabic sometimes dates are written in Latin digits, so we can't call
#withDecimalStyle in general.

We could add other constructors with IConverter argument, but then
Local*TextField wouldn't add anything that you can't do with your own
TextField subclass.

Maybe add this?

protected DateTimeFormatter configure(DateTimeFormatter formatter) {
return formatter; }

Just have checked LocalDateTextField and LocalDateTimeTextField both
has method createConverter
Which actually doesn't create converter ...

Maybe I it worth to refactor both to
  - remove final from converter
  - create and set converter in `createConverter` method

This way users can tune converter on creation? :)


Once again, rolling your own component might be simpler.

Regards
Sven


On 12.09.23 03:54, Maxim Solodovnik wrote:

Hello All,

Sorry for the long email

While working on PR for wicket-bootstrap [1] i have test multiple
locales and find out LocalDate*Time*TextField doesn't behave well with
locales like Persian/Arabic (those with custom digits)

All classes `Local*TextField` from datetime package [2]

have `TextFormatConverter converter` as private member
With constructors accepting `String pattern` and `FormatStyle`

With locales uses different numeral systems (like Arabic) this doesn't
work well :(

Here are some examples
All below can be checked with `jshell` (and/or `bootstrap-samples` from [1])

`LocalDate.of(2020, 11,
5).format(DateTimeFormatter.ofPattern("/M/d").withLocale(Locale.forLanguageTag("fa")).withDecimalStyle(DecimalStyle.of(Locale.forLanguageTag("fa"`
  > "۲۰۲۰/۱۱/۵"

Let's parse this one using DateTimeFormatter like it is being created
in current Wicket code:

`DateTimeFormatter.ofPattern("/M/d").withLocale(Locale.forLanguageTag("fa")).parse("۲۰۲۰/۱۱/۵")`
  > Exception java.time.format.DateTimeParseException

Missing `withDecimalStyle` might help but unfortunately
tempus-dominus-v6 [3] produces dates like "2003/۱۱/5" (please note
digits in mixed numeral systems are present)

Surprisingly the above works well with SimpleDateFormat:

`LocalDate.ofInstant(new SimpleDateFormat("/M/d",
Locale.forLanguageTag("fa")).parse("2003/۱۱/5").toInstant(),
ZoneId.systemDefault())`

please NOTE SimpleDateFormat doesn't honor RTL
It will produce wrong date for

`new SimpleDateFormat("d/M/",
Locale.forLanguageTag("fa")).parse("۲۰۲۰/۱۱/۵")`

BUT correct date with

`new SimpleDateFormat("/M/d",
Locale.forLanguageTag("fa")).parse("۲۰۲۰/۱۱/۵")`

So I believe wicket code need to be improved:

- `withDecimalStyle` *might* be added
- internal date/time formatter should be accessible for the user (so
it can be twicked)

WDYT?

[1]https://github.com/l0rdn1kk0n/wicket-bootstrap/pull/1002
[2]https://github.com/apache/wicket/tree/master/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime
[3]https://getdatepicker.com/6/






Re: [DISCUSSION] LocalDate*Time*TextField modification

2023-09-21 Thread Maxim Solodovnik
On Wed, 13 Sept 2023 at 05:13, Sven Meier  wrote:
>
> Hi Maxim,
>
> it will be hard to make that suitable for different projects with
> different requirements:
> In Arabic sometimes dates are written in Latin digits, so we can't call
> #withDecimalStyle in general.
>
> We could add other constructors with IConverter argument, but then
> Local*TextField wouldn't add anything that you can't do with your own
> TextField subclass.
>
> Maybe add this?
>
> protected DateTimeFormatter configure(DateTimeFormatter formatter) {
> return formatter; }

Just have checked LocalDateTextField and LocalDateTimeTextField both
has method createConverter
Which actually doesn't create converter ...

Maybe I it worth to refactor both to
 - remove final from converter
 - create and set converter in `createConverter` method

This way users can tune converter on creation? :)

>
> Once again, rolling your own component might be simpler.
>
> Regards
> Sven
>
>
> On 12.09.23 03:54, Maxim Solodovnik wrote:
> > Hello All,
> >
> > Sorry for the long email
> >
> > While working on PR for wicket-bootstrap [1] i have test multiple
> > locales and find out LocalDate*Time*TextField doesn't behave well with
> > locales like Persian/Arabic (those with custom digits)
> >
> > All classes `Local*TextField` from datetime package [2]
> >
> > have `TextFormatConverter converter` as private member
> > With constructors accepting `String pattern` and `FormatStyle`
> >
> > With locales uses different numeral systems (like Arabic) this doesn't
> > work well :(
> >
> > Here are some examples
> > All below can be checked with `jshell` (and/or `bootstrap-samples` from [1])
> >
> > `LocalDate.of(2020, 11,
> > 5).format(DateTimeFormatter.ofPattern("/M/d").withLocale(Locale.forLanguageTag("fa")).withDecimalStyle(DecimalStyle.of(Locale.forLanguageTag("fa"`
> >  > "۲۰۲۰/۱۱/۵"
> >
> > Let's parse this one using DateTimeFormatter like it is being created
> > in current Wicket code:
> >
> > `DateTimeFormatter.ofPattern("/M/d").withLocale(Locale.forLanguageTag("fa")).parse("۲۰۲۰/۱۱/۵")`
> >  > Exception java.time.format.DateTimeParseException
> >
> > Missing `withDecimalStyle` might help but unfortunately
> > tempus-dominus-v6 [3] produces dates like "2003/۱۱/5" (please note
> > digits in mixed numeral systems are present)
> >
> > Surprisingly the above works well with SimpleDateFormat:
> >
> > `LocalDate.ofInstant(new SimpleDateFormat("/M/d",
> > Locale.forLanguageTag("fa")).parse("2003/۱۱/5").toInstant(),
> > ZoneId.systemDefault())`
> >
> > please NOTE SimpleDateFormat doesn't honor RTL
> > It will produce wrong date for
> >
> > `new SimpleDateFormat("d/M/",
> > Locale.forLanguageTag("fa")).parse("۲۰۲۰/۱۱/۵")`
> >
> > BUT correct date with
> >
> > `new SimpleDateFormat("/M/d",
> > Locale.forLanguageTag("fa")).parse("۲۰۲۰/۱۱/۵")`
> >
> > So I believe wicket code need to be improved:
> >
> > - `withDecimalStyle` *might* be added
> > - internal date/time formatter should be accessible for the user (so
> > it can be twicked)
> >
> > WDYT?
> >
> > [1]https://github.com/l0rdn1kk0n/wicket-bootstrap/pull/1002
> > [2]https://github.com/apache/wicket/tree/master/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime
> > [3]https://getdatepicker.com/6/
> >



-- 
Best regards,
Maxim


Re: [DISCUSSION] LocalDate*Time*TextField modification

2023-09-12 Thread Sven Meier

Hi Maxim,

it will be hard to make that suitable for different projects with 
different requirements:
In Arabic sometimes dates are written in Latin digits, so we can't call 
#withDecimalStyle in general.


We could add other constructors with IConverter argument, but then 
Local*TextField wouldn't add anything that you can't do with your own 
TextField subclass.


Maybe add this?

protected DateTimeFormatter configure(DateTimeFormatter formatter) { 
return formatter; }


Once again, rolling your own component might be simpler.

Regards
Sven


On 12.09.23 03:54, Maxim Solodovnik wrote:

Hello All,

Sorry for the long email

While working on PR for wicket-bootstrap [1] i have test multiple
locales and find out LocalDate*Time*TextField doesn't behave well with
locales like Persian/Arabic (those with custom digits)

All classes `Local*TextField` from datetime package [2]

have `TextFormatConverter converter` as private member
With constructors accepting `String pattern` and `FormatStyle`

With locales uses different numeral systems (like Arabic) this doesn't
work well :(

Here are some examples
All below can be checked with `jshell` (and/or `bootstrap-samples` from [1])

`LocalDate.of(2020, 11,
5).format(DateTimeFormatter.ofPattern("/M/d").withLocale(Locale.forLanguageTag("fa")).withDecimalStyle(DecimalStyle.of(Locale.forLanguageTag("fa"`
 > "۲۰۲۰/۱۱/۵"

Let's parse this one using DateTimeFormatter like it is being created
in current Wicket code:

`DateTimeFormatter.ofPattern("/M/d").withLocale(Locale.forLanguageTag("fa")).parse("۲۰۲۰/۱۱/۵")`
 > Exception java.time.format.DateTimeParseException

Missing `withDecimalStyle` might help but unfortunately
tempus-dominus-v6 [3] produces dates like "2003/۱۱/5" (please note
digits in mixed numeral systems are present)

Surprisingly the above works well with SimpleDateFormat:

`LocalDate.ofInstant(new SimpleDateFormat("/M/d",
Locale.forLanguageTag("fa")).parse("2003/۱۱/5").toInstant(),
ZoneId.systemDefault())`

please NOTE SimpleDateFormat doesn't honor RTL
It will produce wrong date for

`new SimpleDateFormat("d/M/",
Locale.forLanguageTag("fa")).parse("۲۰۲۰/۱۱/۵")`

BUT correct date with

`new SimpleDateFormat("/M/d",
Locale.forLanguageTag("fa")).parse("۲۰۲۰/۱۱/۵")`

So I believe wicket code need to be improved:

- `withDecimalStyle` *might* be added
- internal date/time formatter should be accessible for the user (so
it can be twicked)

WDYT?

[1]https://github.com/l0rdn1kk0n/wicket-bootstrap/pull/1002
[2]https://github.com/apache/wicket/tree/master/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime
[3]https://getdatepicker.com/6/