From b8811924c369787e4e17241906ddfc83c7993a23 Mon Sep 17 00:00:00 2001 From: Kevin Papst Date: Mon, 29 Apr 2019 00:24:23 +0200 Subject: [PATCH] reduce config complexity by converting php format to js format (#734) --- config/packages/kimai.yaml | 20 -------- src/Configuration/LanguageFormattings.php | 11 ++++- src/DependencyInjection/Configuration.php | 2 - src/Utils/MomentFormatConverter.php | 49 +++++++++++++++++++ .../Configuration/LanguageFormattingsTest.php | 20 +------- tests/Utils/LocaleSettingsTest.php | 20 +------- tests/Utils/MomentFormatConverterTest.php | 29 +++++++++++ 7 files changed, 89 insertions(+), 62 deletions(-) create mode 100644 src/Utils/MomentFormatConverter.php create mode 100644 tests/Utils/MomentFormatConverterTest.php diff --git a/config/packages/kimai.yaml b/config/packages/kimai.yaml index 568ba759..5c462136 100644 --- a/config/packages/kimai.yaml +++ b/config/packages/kimai.yaml @@ -118,81 +118,61 @@ kimai: languages: de: date_time_type: 'dd.MM.yyyy HH:mm' - date_time_picker: 'DD.MM.YYYY HH:mm' date_type: 'dd.MM.yyyy' - date_picker: 'DD.MM.YYYY' date: 'd.m.Y' date_time: 'd.m. H:i' duration: '%%h:%%m h' en: date_time_type: 'yyyy-MM-dd HH:mm' - date_time_picker: 'YYYY-MM-DD HH:mm' date_type: 'yyyy-MM-dd' - date_picker: 'YYYY-MM-DD' date: 'Y-m-d' date_time: 'm-d H:i' duration: '%%h:%%m h' pt_BR: date_time_type: 'dd-MM-yyyy HH:mm' - date_time_picker: 'DD-MM-YYYY HH:mm' date_type: 'dd-MM-yyyy' - date_picker: 'DD-MM-YYYY' date: 'd-m-Y' date_time: 'd-m H:i' duration: '%%h:%%m h' it: date_time_type: 'dd.MM.yyyy HH:mm' - date_time_picker: 'DD.MM.YYYY HH:mm' date_type: 'dd.MM.yyyy' - date_picker: 'DD.MM.YYYY' date: 'd.m.Y' date_time: 'd.m. H:i' duration: '%%h:%%m h' fr: date_time_type: 'dd/MM/yyyy HH:mm' - date_time_picker: 'DD/MM/YYYY HH:mm' date_type: 'dd/MM/yyyy' - date_picker: 'DD/MM/YYYY' date: 'd/m/Y' date_time: 'd/m H:i' duration: '%%h h %%m' es: date_time_type: 'dd.MM.yyyy HH:mm' - date_time_picker: 'DD.MM.YYYY HH:mm' date_type: 'dd.MM.yyyy' - date_picker: 'DD.MM.YYYY' date: 'd.m.Y' date_time: 'd.m. H:i' duration: '%%h:%%m h' ru: date_time_type: 'dd.MM.yyyy HH:mm' - date_time_picker: 'DD.MM.YYYY HH:mm' date_type: 'dd.MM.yyyy' - date_picker: 'DD.MM.YYYY' date: 'd.m.Y' date_time: 'd.m. H:i' duration: '%%h:%%m h' ar: date_time_type: 'yyyy-MM-dd HH:mm' - date_time_picker: 'YYYY-MM-DD HH:mm' date_type: 'yyyy-MM-dd' - date_picker: 'YYYY-MM-DD' date: 'Y-m-d' date_time: 'm-d H:i' duration: '%%h:%%m h' hu: date_time_type: 'yyyy.MM.dd. HH:mm' - date_time_picker: 'YYYY.MM.DD. HH:mm' date_type: 'yyyy.MM.dd.' - date_picker: 'YYYY.MM.DD.' date: 'Y.m.d.' date_time: 'm.d. H:i' duration: '%%h:%%m h' sv: date_time_type: 'yyyy-MM-dd HH:mm' - date_time_picker: 'YYYY-MM-DD HH:mm' date_type: 'yyyy-MM-dd' - date_picker: 'YYYY-MM-DD' date: 'Y-m-d' date_time: 'm-d H:i' duration: '%%h:%%m tim' diff --git a/src/Configuration/LanguageFormattings.php b/src/Configuration/LanguageFormattings.php index d2e43810..d7122545 100644 --- a/src/Configuration/LanguageFormattings.php +++ b/src/Configuration/LanguageFormattings.php @@ -9,12 +9,18 @@ namespace App\Configuration; +use App\Utils\MomentFormatConverter; + class LanguageFormattings { /** * @var array */ protected $settings; + /** + * @var MomentFormatConverter + */ + protected $momentFormatter; /** * @param array $languageSettings @@ -22,6 +28,7 @@ class LanguageFormattings public function __construct(array $languageSettings) { $this->settings = $languageSettings; + $this->momentFormatter = new MomentFormatConverter(); } /** @@ -53,7 +60,7 @@ class LanguageFormattings */ public function getDatePickerFormat(string $locale): string { - return $this->getConfig('date_picker', $locale); + return $this->momentFormatter->convert($this->getDateTypeFormat($locale)); } /** @@ -75,7 +82,7 @@ class LanguageFormattings */ public function getDateTimePickerFormat(string $locale): string { - return $this->getConfig('date_time_picker', $locale); + return $this->momentFormatter->convert($this->getDateTimeTypeFormat($locale)); } /** diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 166d0fe5..d4ee9225 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -226,9 +226,7 @@ class Configuration implements ConfigurationInterface ->arrayPrototype() ->children() ->scalarNode('date_time_type')->defaultValue('yyyy-MM-dd HH:mm')->end() // for DateTimeType - ->scalarNode('date_time_picker')->defaultValue('YYYY-MM-DD HH:mm')->end() // for DateTimeType JS component ->scalarNode('date_type')->defaultValue('yyyy-MM-dd')->end() // for DateType - ->scalarNode('date_picker')->defaultValue('YYYY-MM-DD')->end() // for DateType JS component ->scalarNode('date')->defaultValue('Y-m-d')->end() // for display via twig ->scalarNode('date_time')->defaultValue('m-d H:i')->end() // for display via twig ->scalarNode('duration')->defaultValue('%%h:%%m h')->end() // for display via twig diff --git a/src/Utils/MomentFormatConverter.php b/src/Utils/MomentFormatConverter.php new file mode 100644 index 00000000..9135ba18 --- /dev/null +++ b/src/Utils/MomentFormatConverter.php @@ -0,0 +1,49 @@ + + */ +class MomentFormatConverter +{ + /** + * This defines the mapping between PHP ICU date format (key) and moment.js date format (value) + * For ICU formats see http://userguide.icu-project.org/formatparse/datetime#TOC-Date-Time-Format-Syntax + * For Moment formats see http://momentjs.com/docs/#/displaying/format/. + * + * @var array + */ + private static $formatConvertRules = [ + // year + 'yyyy' => 'YYYY', 'yy' => 'YY', 'y' => 'YYYY', + // day + 'dd' => 'DD', 'd' => 'D', + // day of week + 'EE' => 'ddd', 'EEEEEE' => 'dd', + // timezone + 'ZZZZZ' => 'Z', 'ZZZ' => 'ZZ', + // letter 'T' + '\'T\'' => 'T', + ]; + + /** + * Returns associated moment.js format. + * + * @param string $format + * @return string + */ + public function convert(string $format): string + { + return strtr($format, self::$formatConvertRules); + } +} diff --git a/tests/Configuration/LanguageFormattingsTest.php b/tests/Configuration/LanguageFormattingsTest.php index a8c2de99..4afba48f 100644 --- a/tests/Configuration/LanguageFormattingsTest.php +++ b/tests/Configuration/LanguageFormattingsTest.php @@ -27,9 +27,7 @@ class LanguageFormattingsTest extends TestCase return [ 'de' => [ 'date_time_type' => 'dd.MM.yyyy HH:mm', - 'date_time_picker' => 'DD.MM.YYYY HH:mm', 'date_type' => 'dd.MM.yyyy', - 'date_picker' => 'DD.MM.YYYY', 'date' => 'd.m.Y', 'date_time' => 'd.m. H:i', 'duration' => '%h:%m h', @@ -38,9 +36,7 @@ class LanguageFormattingsTest extends TestCase ], 'en' => [ 'date_time_type' => 'yyyy-MM-dd HH:mm', - 'date_time_picker' => 'YYYY-MM-DD HH:mm', 'date_type' => 'yyyy-MM-dd', - 'date_picker' => 'YYYY-MM-DD', 'date' => 'Y-m-d', 'date_time' => 'm-d H:i', 'duration' => '%h:%m h', @@ -49,57 +45,43 @@ class LanguageFormattingsTest extends TestCase ], 'pt_BR' => [ 'date_time_type' => 'dd-MM-yyyy HH:mm', - 'date_time_picker' => 'DD-MM-YYYY HH:mm', 'date_type' => 'dd-MM-yyyy', - 'date_picker' => 'DD-MM-YYYY', 'date' => 'd-m-Y', 'duration' => '%h:%m h', ], 'it' => [ 'date_time_type' => 'dd.MM.yyyy HH:mm', - 'date_time_picker' => 'DD.MM.YYYY HH:mm', 'date_type' => 'dd.MM.yyyy', - 'date_picker' => 'DD.MM.YYYY', 'date' => 'd.m.Y', 'duration' => '%h:%m h', ], 'fr' => [ 'date_time_type' => 'dd/MM/yyyy HH:mm', - 'date_time_picker' => 'DD/MM/YYYY HH:mm', 'date_type' => 'dd/MM/yyyy', - 'date_picker' => 'DD/MM/YYYY', 'date' => 'd/m/Y', 'duration' => '%h h %m', ], 'es' => [ 'date_time_type' => 'dd.MM.yyyy HH:mm', - 'date_time_picker' => 'DD.MM.YYYY HH:mm', 'date_type' => 'dd.MM.yyyy', - 'date_picker' => 'DD.MM.YYYY', 'date' => 'd.m.Y', 'duration' => '%h:%m h', ], 'ru' => [ 'date_time_type' => 'dd.MM.yyyy HH:mm', - 'date_time_picker' => 'DD.MM.YYYY HH:mm', 'date_type' => 'dd.MM.yyyy', - 'date_picker' => 'DD.MM.YYYY', 'date' => 'd.m.Y', 'duration' => '%h:%m h', ], 'ar' => [ 'date_time_type' => 'yyyy-MM-dd HH:mm', - 'date_time_picker' => 'YYYY-MM-DD HH:mm', 'date_type' => 'yyyy-MM-dd', - 'date_picker' => 'YYYY-MM-DD', 'date' => 'Y-m-d', 'duration' => '%h:%m h', ], 'hu' => [ 'date_time_type' => 'yyyy.MM.dd HH:mm', - 'date_time_picker' => 'YYYY.MM.DD HH:mm', 'date_type' => 'yyyy.MM.dd', - 'date_picker' => 'YYYY.MM.DD', 'date' => 'Y.m.d.', 'duration' => '%h:%m h', ], @@ -183,7 +165,7 @@ class LanguageFormattingsTest extends TestCase /** * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Unknown setting for locale en: date_time_picker + * @expectedExceptionMessage Unknown setting for locale en: date_time_type */ public function testUnknownSetting() { diff --git a/tests/Utils/LocaleSettingsTest.php b/tests/Utils/LocaleSettingsTest.php index 1521e078..a739982c 100644 --- a/tests/Utils/LocaleSettingsTest.php +++ b/tests/Utils/LocaleSettingsTest.php @@ -41,9 +41,7 @@ class LocaleSettingsTest extends TestCase return [ 'de' => [ 'date_time_type' => 'dd.MM.yyyy HH:mm', - 'date_time_picker' => 'DD.MM.YYYY HH:mm', 'date_type' => 'dd.MM.yyyy', - 'date_picker' => 'DD.MM.YYYY', 'date' => 'd.m.Y', 'date_time' => 'd.m. H:i', 'duration' => '%h:%m h', @@ -52,9 +50,7 @@ class LocaleSettingsTest extends TestCase ], 'en' => [ 'date_time_type' => 'yyyy-MM-dd HH:mm', - 'date_time_picker' => 'YYYY-MM-DD HH:mm', 'date_type' => 'yyyy-MM-dd', - 'date_picker' => 'YYYY-MM-DD', 'date' => 'Y-m-d', 'date_time' => 'm-d H:i', 'duration' => '%h:%m h', @@ -63,57 +59,43 @@ class LocaleSettingsTest extends TestCase ], 'pt_BR' => [ 'date_time_type' => 'dd-MM-yyyy HH:mm', - 'date_time_picker' => 'DD-MM-YYYY HH:mm', 'date_type' => 'dd-MM-yyyy', - 'date_picker' => 'DD-MM-YYYY', 'date' => 'd-m-Y', 'duration' => '%h:%m h', ], 'it' => [ 'date_time_type' => 'dd.MM.yyyy HH:mm', - 'date_time_picker' => 'DD.MM.YYYY HH:mm', 'date_type' => 'dd.MM.yyyy', - 'date_picker' => 'DD.MM.YYYY', 'date' => 'd.m.Y', 'duration' => '%h:%m h', ], 'fr' => [ 'date_time_type' => 'dd/MM/yyyy HH:mm', - 'date_time_picker' => 'DD/MM/YYYY HH:mm', 'date_type' => 'dd/MM/yyyy', - 'date_picker' => 'DD/MM/YYYY', 'date' => 'd/m/Y', 'duration' => '%h h %m', ], 'es' => [ 'date_time_type' => 'dd.MM.yyyy HH:mm', - 'date_time_picker' => 'DD.MM.YYYY HH:mm', 'date_type' => 'dd.MM.yyyy', - 'date_picker' => 'DD.MM.YYYY', 'date' => 'd.m.Y', 'duration' => '%h:%m h', ], 'ru' => [ 'date_time_type' => 'dd.MM.yyyy HH:mm', - 'date_time_picker' => 'DD.MM.YYYY HH:mm', 'date_type' => 'dd.MM.yyyy', - 'date_picker' => 'DD.MM.YYYY', 'date' => 'd.m.Y', 'duration' => '%h:%m h', ], 'ar' => [ 'date_time_type' => 'yyyy-MM-dd HH:mm', - 'date_time_picker' => 'YYYY-MM-DD HH:mm', 'date_type' => 'yyyy-MM-dd', - 'date_picker' => 'YYYY-MM-DD', 'date' => 'Y-m-d', 'duration' => '%h:%m h', ], 'hu' => [ 'date_time_type' => 'yyyy.MM.dd HH:mm', - 'date_time_picker' => 'YYYY.MM.DD HH:mm', 'date_type' => 'yyyy.MM.dd', - 'date_picker' => 'YYYY.MM.DD', 'date' => 'Y.m.d.', 'duration' => '%h:%m h', ], @@ -212,7 +194,7 @@ class LocaleSettingsTest extends TestCase /** * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Unknown setting for locale en: date_time_picker + * @expectedExceptionMessage Unknown setting for locale en: date_time_type */ public function testUnknownSetting() { diff --git a/tests/Utils/MomentFormatConverterTest.php b/tests/Utils/MomentFormatConverterTest.php new file mode 100644 index 00000000..3cdf065e --- /dev/null +++ b/tests/Utils/MomentFormatConverterTest.php @@ -0,0 +1,29 @@ +assertEquals('DD.MM.YYYY HH:mm', $sut->convert('dd.MM.yyyy HH:mm')); + $this->assertEquals('DD-MM-YYYY HH:mm', $sut->convert('dd-MM-yyyy HH:mm')); + $this->assertEquals('DD/MM/YYYY HH:mm', $sut->convert('dd/MM/yyyy HH:mm')); + $this->assertEquals('YYYY-MM-DD HH:mm', $sut->convert('yyyy-MM-dd HH:mm')); + $this->assertEquals('YYYY.MM.DD. HH:mm', $sut->convert('yyyy.MM.dd. HH:mm')); + } +}