From d0f8b0ebfbde1121653aee5d328c35f4b6cb2c10 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Fri, 24 Nov 2023 19:04:45 -0300 Subject: [PATCH] Initital commit. --- README.md | 130 +++++- composer.json | 41 +- config/extension.php | 18 + config/messages.php | 66 +++ config/params.php | 9 + phpunit.xml.dist | 4 +- psalm.xml | 20 + .../de/yii2.extensions.datetime.picker.php | 50 +++ .../es/yii2.extensions.datetime.picker.php | 50 +++ .../fr/yii2.extensions.datetime.picker.php | 50 +++ .../pt/yii2.extensions.datetime.picker.php | 50 +++ .../ru/yii2.extensions.datetime.picker.php | 50 +++ .../zh/yii2.extensions.datetime.picker.php | 50 +++ src/Asset/DateTimePickerAsset.php | 43 ++ src/Asset/DateTimePickerCdnAsset.php | 39 ++ src/DateTimePicker.php | 166 +++++++ src/Example.php | 13 - tests/AssetTest.php | 97 +++++ tests/DateTimePickerTest.php | 407 ++++++++++++++++++ tests/ExampleTest.php | 18 - tests/ExceptionTest.php | 19 + tests/Support/DateTimePickerModel.php | 10 + tests/Support/bootstrap.php | 22 + tests/Support/main.php | 15 + tests/Support/runtime/.gitkeep | 0 tests/TestCase.php | 77 ++++ 26 files changed, 1453 insertions(+), 61 deletions(-) create mode 100644 config/extension.php create mode 100644 config/messages.php create mode 100644 config/params.php create mode 100644 psalm.xml create mode 100644 resource/message/de/yii2.extensions.datetime.picker.php create mode 100644 resource/message/es/yii2.extensions.datetime.picker.php create mode 100644 resource/message/fr/yii2.extensions.datetime.picker.php create mode 100644 resource/message/pt/yii2.extensions.datetime.picker.php create mode 100644 resource/message/ru/yii2.extensions.datetime.picker.php create mode 100644 resource/message/zh/yii2.extensions.datetime.picker.php create mode 100644 src/Asset/DateTimePickerAsset.php create mode 100644 src/Asset/DateTimePickerCdnAsset.php create mode 100644 src/DateTimePicker.php delete mode 100644 src/Example.php create mode 100644 tests/AssetTest.php create mode 100644 tests/DateTimePickerTest.php delete mode 100644 tests/ExampleTest.php create mode 100644 tests/ExceptionTest.php create mode 100644 tests/Support/DateTimePickerModel.php create mode 100644 tests/Support/bootstrap.php create mode 100644 tests/Support/main.php create mode 100644 tests/Support/runtime/.gitkeep create mode 100644 tests/TestCase.php diff --git a/README.md b/README.md index 7fc0a59..77779a3 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@

- + -

Yii2-Template.

+

Tempus Dominus Date/Time Picker.


@@ -10,35 +10,121 @@ php-version - - yii2-version + + PHPUnit - - PHPUnit - - - Codecov - - - PHPStan - - - PHPStan level + + PHPUnit - - Code style - + + Codecov + + + Infection +

-## Requirements +## Installation + +The preferred way to install this extension is through [composer](https://getcomposer.org/download/). + +Either run + +``` +composer require --dev --prefer-dist yii2-extensions/datetime-picker +``` -The minimun version of `PHP` required by this package is `PHP 8.1`. +or add -For install this package, you need [composer](https://getcomposer.org/). +``` +"yii2-extensions/datetime-picker": "dev-main" +``` + +to the require-dev section of your `composer.json` file. ## Usage -[Check the documentation docs](/docs/README.md) to learn about usage. +### Name + +```php +use Yii2\Extensions\DateTimePicker\DateTimePicker; + +echo DateTimePicker::widget(['name' => 'datetime-picker']); +``` + +### Active Field + +```php +use Yii2\Extensions\DateTimePicker\DateTimePicker; + +echo $form + ->field($formModel, 'date') + ->widget( + DateTimePicker::class, + [ + 'icon' => Icon::renderIcon('solid', 'calendar', ['class' => 'me-2 fa-solid']) + ] + ); +``` + +### Active Field Floating Label + +```php +use Yii2\Extensions\DateTimePicker\DateTimePicker; + +echo $form + ->field($formModel, 'date', ['options' => ['class' => 'mt-3']]) + ->label(false) + ->widget( + DateTimePicker::class, + [ + 'floatingLabel' => true, + 'icon' => Icon::renderIcon('solid', 'calendar', ['class' => 'me-2 fa-solid']) + ] + ) +``` + +### Properties of the widget + +| Property | Type | Description | Default | +|------------------|---------------|------------------------------------|-----------------------------| +| `config` | `array` | The configuration of the widget. | `[]` | +| `containerClass` | `string` | The class of the container. | `input-group` | +| `cdn` | `boolean` | Whether to use the CDN. | `true` | +| `floatingLabel` | `boolean` | Whether to use the floating label. | `false` | +| `formatMonth` | `string` | The format of the month. | `long` | +| `formatYear` | `string` | The format of the year. | `numeric` | +| `icon` | `string` | The icon of the widget. | `''` | +| `id` | `string` | The ID of the widget. | `datetimepicker1` | +| `labelClass` | `string` | The class of the label. | `form-label` | +| `labelContent` | `string` | The content of the label. | `''` | +| `spanClass` | `string` | The class of the span. | `input-group-text` | +| `startOfTheWeek` | `integer` | The start of the week. | `1` | +| `template` | `string` | The template of the widget. `'{label}\n{input}\n{span}'` | + +### Translation support + +The extension supports translation. You can translate the extension into your language, +for default the extension supports the following languages: + +- Chinese +- English +- French +- German +- Portuguese +- Russian +- Spanish + +## Quality code + +[![static-analysis](https://github.com/yii2-extensions/datetime-picker/actions/workflows/static.yml/badge.svg)](https://github.com/yii2-extensions/datetime-picker/actions/workflows/static.yml) +[![phpstan-level](https://img.shields.io/badge/PHPStan%20level-7-blue)](https://github.com/yii2-extensions/datetime-picker/actions/workflows/static.yml) +[![StyleCI](https://github.styleci.io/repos/722487175/shield?branch=main)](https://github.styleci.io/repos/722487175?branch=main) + +## Support versions Yii2 + +[![Yii20](https://img.shields.io/badge/Yii2%20version-2.0-blue)](https://github.com/yiisoft/yii2/tree/2.0.49.3) +[![Yii22](https://img.shields.io/badge/Yii2%20version-2.2-blue)](https://github.com/yiisoft/yii2/tree/2.2) ## Testing diff --git a/composer.json b/composer.json index cd5155d..ab11a1e 100644 --- a/composer.json +++ b/composer.json @@ -1,41 +1,70 @@ { - "name": "yii2/template", + "name": "yii2-extensions/datetime-picker", "type": "library", - "description": "_____", + "description": "Date and time picker for Yii Framework.", "keywords": [ - "_____" + "yii2", + "date", + "time", + "picker" ], "license": "mit", "minimum-stability": "dev", "prefer-stable": true, "require": { "php": ">=8.1", + "npm-asset/eonasdan--tempus-dominus": "^6.7", + "oomphinc/composer-installers-extender": "^2.0", + "php-forge/html": "dev-main", + "yii2-extensions/asset-popper": "dev-main", "yiisoft/yii2": "^2.2" }, "require-dev": { "maglnet/composer-require-checker": "^4.6", + "php-forge/support": "dev-main", "phpunit/phpunit": "^10.2", + "roave/infection-static-analysis-plugin": "^1.32", "yii2-extensions/phpstan": "dev-main" }, "autoload": { "psr-4": { - "yii\\template\\": "src" + "Yii2\\Extensions\\DateTimePicker\\": "src" } }, "autoload-dev": { "psr-4": { - "yii\\template\\tests\\": "tests" + "Yii2\\Extensions\\DateTimePicker\\Tests\\": "tests" } }, "extra": { "branch-alias": { "dev-main": "1.0.x-dev" + }, + "config-plugin": { + "params": "params.php", + "yii2-datetime-picker": "extension.php" + }, + "config-plugin-options": { + "source-directory": "config" + }, + "installer-types": [ + "bower-asset", + "npm-asset" + ], + "installer-paths": { + "./node_modules/{$name}": [ + "type:bower-asset", + "type:npm-asset" + ] } }, "config": { "sort-packages": true, "allow-plugins": { - "yiisoft/yii2-composer": true + "yiisoft/yii2-composer": true, + "composer/installers": true, + "oomphinc/composer-installers-extender": true, + "infection/extension-installer": true } }, "scripts": { diff --git a/config/extension.php b/config/extension.php new file mode 100644 index 0000000..92f9518 --- /dev/null +++ b/config/extension.php @@ -0,0 +1,18 @@ + [ + 'i18n' => [ + 'translations' => [ + 'yii2.extensions.datetime.picker' => [ + 'class' => PhpMessageSource::class, + 'basePath' => '@yii2-extension-datetime-picker/resource/message', + ], + ], + ], + ], +]; diff --git a/config/messages.php b/config/messages.php new file mode 100644 index 0000000..60eb54b --- /dev/null +++ b/config/messages.php @@ -0,0 +1,66 @@ + dirname(__DIR__) . '/src', + // array, required, list of language codes that the extracted messages + // should be translated to. For example, ['zh-CN', 'de']. + 'languages' => ['de', 'es', 'fr', 'pt', 'ru', 'zh'], + // string, the name of the function for translating messages. + // Defaults to 'Yii::t'. This is used as a mark to find the messages to be + // translated. You may use a string for single function name or an array for + // multiple function names. + 'translator' => ['Yii::t'], + // boolean, whether to sort messages by keys when merging new messages + // with the existing ones. Defaults to false, which means the new (untranslated) + // messages will be separated from the old (translated) ones. + 'sort' => true, + // boolean, whether to remove messages that no longer appear in the source code. + // Defaults to false, which means each of these messages will be enclosed with a pair of '@@' marks. + 'removeUnused' => false, + // array, list of patterns that specify which files (not directories) should be processed. + // If empty or not set, all files will be processed. + // Please refer to "except" for details about the patterns. + 'only' => ['*.php'], + // array, list of patterns that specify which files/directories should NOT be processed. + // If empty or not set, all files/directories will be processed. + // A path matches a pattern if it contains the pattern string at its end. For example, + // '/a/b' will match all files and directories ending with '/a/b'; + // the '*.svn' will match all files and directories whose name ends with '.svn'. + // and the '.svn' will match all files and directories named exactly '.svn'. + // Note, the '/' characters in a pattern matches both '/' and '\'. + // See helpers/FileHelper::findFiles() description for more details on pattern matching rules. + // If a file/directory matches both a pattern in "only" and "except", it will NOT be processed. + 'except' => [ + '.svn', + '.git', + '.gitignore', + '.gitkeep', + '.hg', + '.hgignore', + '.hgkeep', + '/messages', + '/migrations', + ], + // 'php' output format is for saving messages to php files. + 'format' => 'php', + // Root directory containing message translations. + 'messagePath' => dirname(__DIR__) . '/resource/message', + // boolean, whether the message file should be overwritten with the merged messages + 'overwrite' => true, + // Message categories to ignore + 'ignoreCategories' => [ + 'yii', + ], +]; diff --git a/config/params.php b/config/params.php new file mode 100644 index 0000000..abcf2cb --- /dev/null +++ b/config/params.php @@ -0,0 +1,9 @@ + [ + '@yii2-extension-datetime-picker' => '@vendor/yii2-extensions/datetime-picker', + ], +]; diff --git a/phpunit.xml.dist b/phpunit.xml.dist index f29a28d..4245edd 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -2,7 +2,7 @@ - + tests diff --git a/psalm.xml b/psalm.xml new file mode 100644 index 0000000..cefdd03 --- /dev/null +++ b/psalm.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/resource/message/de/yii2.extensions.datetime.picker.php b/resource/message/de/yii2.extensions.datetime.picker.php new file mode 100644 index 0000000..d6aa7f9 --- /dev/null +++ b/resource/message/de/yii2.extensions.datetime.picker.php @@ -0,0 +1,50 @@ + 'Auswahl löschen', + 'Close picker' => 'Picker schließen', + 'Date' => 'Datum', + 'Decrement hour' => 'Stunde verringern', + 'Decrement minute' => 'Minute verringern', + 'Decrement second' => 'Sekunde verringern', + 'Go to today' => 'Gehe zu heute', + 'Increment hour' => 'Stunde erhöhen', + 'Increment minute' => 'Minute erhöhen', + 'Increment second' => 'Sekunde erhöhen', + 'Next century' => 'Nächstes Jahrhundert', + 'Next decade' => 'Nächstes Jahrzehnt', + 'Next month' => 'Nächster Monat', + 'Next year' => 'Nächstes Jahr', + 'Pick hour' => 'Stunde auswählen', + 'Pick minute' => 'Minute auswählen', + 'Pick second' => 'Sekunde auswählen', + 'Previous century' => 'Vorheriges Jahrhundert', + 'Previous decade' => 'Vorheriges Jahrzehnt', + 'Previous month' => 'Vorheriger Monat', + 'Previous year' => 'Vorheriges Jahr', + 'Select date' => 'Datum auswählen', + 'Select decade' => 'Jahrzehnt auswählen', + 'Select month' => 'Monat auswählen', + 'Select time' => 'Zeit auswählen', + 'Select year' => 'Jahr auswählen', + 'Toggle meridiem' => 'Meridian umschalten', +]; diff --git a/resource/message/es/yii2.extensions.datetime.picker.php b/resource/message/es/yii2.extensions.datetime.picker.php new file mode 100644 index 0000000..0da3123 --- /dev/null +++ b/resource/message/es/yii2.extensions.datetime.picker.php @@ -0,0 +1,50 @@ + 'Borrar selección', + 'Close picker' => 'Cerrar selector', + 'Date' => 'Fecha', + 'Decrement hour' => 'Reducir hora', + 'Decrement minute' => 'Reducir minuto', + 'Decrement second' => 'Reducir segundo', + 'Go to today' => 'Ir a hoy', + 'Increment hour' => 'Incrementar hora', + 'Increment minute' => 'Incrementar minuto', + 'Increment second' => 'Incrementar segundo', + 'Next century' => 'Próximo siglo', + 'Next decade' => 'Próxima década', + 'Next month' => 'Próximo mes', + 'Next year' => 'Próximo año', + 'Pick hour' => 'Seleccionar hora', + 'Pick minute' => 'Seleccionar minuto', + 'Pick second' => 'Seleccionar segundo', + 'Previous century' => 'Siglo anterior', + 'Previous decade' => 'Década anterior', + 'Previous month' => 'Mes anterior', + 'Previous year' => 'Año anterior', + 'Select date' => 'Seleccionar fecha', + 'Select decade' => 'Seleccionar década', + 'Select month' => 'Seleccionar mes', + 'Select time' => 'Seleccionar hora', + 'Select year' => 'Seleccionar año', + 'Toggle meridiem' => 'Alternar meridiano', +]; diff --git a/resource/message/fr/yii2.extensions.datetime.picker.php b/resource/message/fr/yii2.extensions.datetime.picker.php new file mode 100644 index 0000000..345f9ea --- /dev/null +++ b/resource/message/fr/yii2.extensions.datetime.picker.php @@ -0,0 +1,50 @@ + 'Effacer la sélection', + 'Close picker' => 'Fermer le sélecteur', + 'Date' => 'Date', + 'Decrement hour' => 'Décrémenter l\'heure', + 'Decrement minute' => 'Décrémenter la minute', + 'Decrement second' => 'Décrémenter la seconde', + 'Go to today' => 'Aller à aujourd\'hui', + 'Increment hour' => 'Incrémenter l\'heure', + 'Increment minute' => 'Incrémenter la minute', + 'Increment second' => 'Incrémenter la seconde', + 'Next century' => 'Siècle suivant', + 'Next decade' => 'Décennie suivante', + 'Next month' => 'Mois suivant', + 'Next year' => 'Année suivante', + 'Pick hour' => 'Sélectionner l\'heure', + 'Pick minute' => 'Sélectionner la minute', + 'Pick second' => 'Sélectionner la seconde', + 'Previous century' => 'Siècle précédent', + 'Previous decade' => 'Décennie précédente', + 'Previous month' => 'Mois précédent', + 'Previous year' => 'Année précédente', + 'Select date' => 'Sélectionner la date', + 'Select decade' => 'Sélectionner la décennie', + 'Select month' => 'Sélectionner le mois', + 'Select time' => 'Sélectionner l\'heure', + 'Select year' => 'Sélectionner l\'année', + 'Toggle meridiem' => 'Basculer le méridien', +]; diff --git a/resource/message/pt/yii2.extensions.datetime.picker.php b/resource/message/pt/yii2.extensions.datetime.picker.php new file mode 100644 index 0000000..0c2e8f3 --- /dev/null +++ b/resource/message/pt/yii2.extensions.datetime.picker.php @@ -0,0 +1,50 @@ + 'Limpar seleção', + 'Close picker' => 'Fechar seletor', + 'Date' => 'Data', + 'Decrement hour' => 'Diminuir hora', + 'Decrement minute' => 'Diminuir minuto', + 'Decrement second' => 'Diminuir segundo', + 'Go to today' => 'Ir para hoje', + 'Increment hour' => 'Aumentar hora', + 'Increment minute' => 'Aumentar minuto', + 'Increment second' => 'Aumentar segundo', + 'Next century' => 'Próximo século', + 'Next decade' => 'Próxima década', + 'Next month' => 'Próximo mês', + 'Next year' => 'Próximo ano', + 'Pick hour' => 'Selecionar hora', + 'Pick minute' => 'Selecionar minuto', + 'Pick second' => 'Selecionar segundo', + 'Previous century' => 'Século anterior', + 'Previous decade' => 'Década anterior', + 'Previous month' => 'Mês anterior', + 'Previous year' => 'Ano anterior', + 'Select date' => 'Selecionar data', + 'Select decade' => 'Selecionar década', + 'Select month' => 'Selecionar mês', + 'Select time' => 'Selecionar hora', + 'Select year' => 'Selecionar ano', + 'Toggle meridiem' => 'Alternar período', +]; diff --git a/resource/message/ru/yii2.extensions.datetime.picker.php b/resource/message/ru/yii2.extensions.datetime.picker.php new file mode 100644 index 0000000..438f235 --- /dev/null +++ b/resource/message/ru/yii2.extensions.datetime.picker.php @@ -0,0 +1,50 @@ + 'Сбросить выбор', + 'Close picker' => 'Закрыть выбор', + 'Date' => 'Дата', + 'Decrement hour' => 'Уменьшить час', + 'Decrement minute' => 'Уменьшить минуту', + 'Decrement second' => 'Уменьшить секунду', + 'Go to today' => 'Перейти на сегодня', + 'Increment hour' => 'Увеличить час', + 'Increment minute' => 'Увеличить минуту', + 'Increment second' => 'Увеличить секунду', + 'Next century' => 'Следующий век', + 'Next decade' => 'Следующее десятилетие', + 'Next month' => 'Следующий месяц', + 'Next year' => 'Следующий год', + 'Pick hour' => 'Выбрать час', + 'Pick minute' => 'Выбрать минуту', + 'Pick second' => 'Выбрать секунду', + 'Previous century' => 'Предыдущий век', + 'Previous decade' => 'Предыдущее десятилетие', + 'Previous month' => 'Предыдущий месяц', + 'Previous year' => 'Предыдущий год', + 'Select date' => 'Выбрать дату', + 'Select decade' => 'Выбрать десятилетие', + 'Select month' => 'Выбрать месяц', + 'Select time' => 'Выбрать время', + 'Select year' => 'Выбрать год', + 'Toggle meridiem' => 'Переключить период', +]; diff --git a/resource/message/zh/yii2.extensions.datetime.picker.php b/resource/message/zh/yii2.extensions.datetime.picker.php new file mode 100644 index 0000000..a796207 --- /dev/null +++ b/resource/message/zh/yii2.extensions.datetime.picker.php @@ -0,0 +1,50 @@ + '清除选择', + 'Close picker' => '关闭选择器', + 'Date' => '日期', + 'Decrement hour' => '减少小时', + 'Decrement minute' => '减少分钟', + 'Decrement second' => '减少秒数', + 'Go to today' => '转到今天', + 'Increment hour' => '增加小时', + 'Increment minute' => '增加分钟', + 'Increment second' => '增加秒数', + 'Next century' => '下个世纪', + 'Next decade' => '下个十年', + 'Next month' => '下个月', + 'Next year' => '明年', + 'Pick hour' => '选择小时', + 'Pick minute' => '选择分钟', + 'Pick second' => '选择秒数', + 'Previous century' => '上个世纪', + 'Previous decade' => '上个十年', + 'Previous month' => '上个月', + 'Previous year' => '去年', + 'Select date' => '选择日期', + 'Select decade' => '选择十年', + 'Select month' => '选择月份', + 'Select time' => '选择时间', + 'Select year' => '选择年份', + 'Toggle meridiem' => '切换时段', +]; diff --git a/src/Asset/DateTimePickerAsset.php b/src/Asset/DateTimePickerAsset.php new file mode 100644 index 0000000..b00b107 --- /dev/null +++ b/src/Asset/DateTimePickerAsset.php @@ -0,0 +1,43 @@ + + */ + public $depends = [ + PopperAsset::class, + ]; + + public function init(): void + { + parent::init(); + + $this->css = YII_ENV === 'prod' ? ['css/tempus-dominus.min.css'] : ['css/tempus-dominus.css']; + $this->js = YII_ENV === 'prod' + ? ['js/tempus-dominus.min.js', 'js/jQuery-provider.min.js'] : ['js/tempus-dominus.js', 'js/jQuery-provider.js']; + + $this->publishOptions['only'] = array_merge( + $this->css, + YII_ENV === 'prod' ? [] : ['css/bootstrap.js.map', 'js/bootstrap.js.map'], + $this->js, + ); + } +} diff --git a/src/Asset/DateTimePickerCdnAsset.php b/src/Asset/DateTimePickerCdnAsset.php new file mode 100644 index 0000000..b7f230d --- /dev/null +++ b/src/Asset/DateTimePickerCdnAsset.php @@ -0,0 +1,39 @@ + + */ + public $depends = [ + PopperCdnAsset::class, + ]; + + public function init(): void + { + parent::init(); + + $this->css = ['https://cdn.jsdelivr.net/npm/@eonasdan/tempus-dominus@6.7.19/dist/css/tempus-dominus.min.css']; + $this->cssOptions = [ + 'crossorigin' => 'anonymous', + 'rel' => 'stylesheet', + ]; + $this->js = ['https://cdn.jsdelivr.net/npm/@eonasdan/tempus-dominus@6.7.19/dist/js/tempus-dominus.min.js']; + $this->jsOptions = [ + 'crossorigin' => 'anonymous', + 'rel' => 'stylesheet', + ]; + } +} diff --git a/src/DateTimePicker.php b/src/DateTimePicker.php new file mode 100644 index 0000000..4fb5945 --- /dev/null +++ b/src/DateTimePicker.php @@ -0,0 +1,166 @@ + + */ + public array $config = []; + public string $containerClass = 'input-group'; + public bool $floatingLabel = false; + public string $formatMonth = 'long'; + public string $formatYear = 'numeric'; + public string $icon = ''; + public string $id = 'datetimepicker1'; + public string $labelClass = 'form-label'; + public string $labelContent = 'Date'; + public string $spanClass = 'input-group-text'; + public int $startOfTheWeek = 1; + public string $template = "{label}\n{input}\n{span}"; + + + public function init(): void + { + parent::init(); + + $translation = [ + 'localization' => [ + 'today' => Yii::t('yii2.extensions.datetime.picker', 'Go to today'), + 'clear' => Yii::t('yii2.extensions.datetime.picker', 'Clear selection'), + 'close' => Yii::t('yii2.extensions.datetime.picker', 'Close picker'), + 'selectMonth' => Yii::t('yii2.extensions.datetime.picker', 'Select month'), + 'previousMonth' => Yii::t('yii2.extensions.datetime.picker', 'Previous month'), + 'nextMonth' => Yii::t('yii2.extensions.datetime.picker', 'Next month'), + 'selectYear' => Yii::t('yii2.extensions.datetime.picker', 'Select year'), + 'previousYear' => Yii::t('yii2.extensions.datetime.picker', 'Previous year'), + 'nextYear' => Yii::t('yii2.extensions.datetime.picker', 'Next year'), + 'selectDecade' => Yii::t('yii2.extensions.datetime.picker', 'Select decade'), + 'previousDecade' => Yii::t('yii2.extensions.datetime.picker', 'Previous decade'), + 'nextDecade' => Yii::t('yii2.extensions.datetime.picker', 'Next decade'), + 'previousCentury' => Yii::t('yii2.extensions.datetime.picker', 'Previous century'), + 'nextCentury' => Yii::t('yii2.extensions.datetime.picker', 'Next century'), + 'pickHour' => Yii::t('yii2.extensions.datetime.picker', 'Pick hour'), + 'incrementHour' => Yii::t('yii2.extensions.datetime.picker', 'Increment hour'), + 'decrementHour' => Yii::t('yii2.extensions.datetime.picker', 'Decrement hour'), + 'pickMinute' => Yii::t('yii2.extensions.datetime.picker', 'Pick minute'), + 'incrementMinute' => Yii::t('yii2.extensions.datetime.picker', 'Increment minute'), + 'decrementMinute' => Yii::t('yii2.extensions.datetime.picker', 'Decrement minute'), + 'pickSecond' => Yii::t('yii2.extensions.datetime.picker', 'Pick second'), + 'incrementSecond' => Yii::t('yii2.extensions.datetime.picker', 'Increment second'), + 'decrementSecond' => Yii::t('yii2.extensions.datetime.picker', 'Decrement second'), + 'toggleMeridiem' => Yii::t('yii2.extensions.datetime.picker', 'Toggle meridiem'), + 'selectTime' => Yii::t('yii2.extensions.datetime.picker', 'Select time'), + 'selectDate' => Yii::t('yii2.extensions.datetime.picker', 'Select date'), + 'dayViewHeaderFormat' => [ + 'month' => $this->formatMonth, + 'year' => $this->formatYear, + ], + 'locale' => Yii::$app->language, + 'startOfTheWeek' => $this->startOfTheWeek, + ], + ]; + + $this->config = array_merge($this->config, $translation); + } + + /** + * @inheritdoc + */ + public function run(): string + { + if ($this->model === null && $this->name === null) { + new InvalidConfigException('Either "name" or "model" and "attribute" properties must be specified.'); + } + + $this->registerClientScript(); + + return $this->renderDateTimePicker(); + } + + private function getScript(): string + { + $config = json_encode($this->config); + + return <<id").tempusDominus({$config}); + JS; + } + + private function renderDateTimePicker(): string + { + $containerOptions = []; + $label = ''; + $template = $this->floatingLabel ? "{input}\n{span}\n{label}" : "{input}\n{span}"; + + CssClass::add($containerOptions, $this->floatingLabel ? 'form-floating' : ''); + CssClass::add($containerOptions, $this->containerClass); + + $label = Label::widget() + ->class($this->labelClass) + ->content(Yii::t('yii2.extensions.datetime.picker', $this->labelContent)); + $span = Span::widget() + ->dataAttributes(['td-target' => "#$this->id", 'td-toggle' => 'datetimepicker']) + ->class($this->spanClass) + ->content($this->icon); + $input = Input::widget() + ->attributes($this->options) + ->dataAttributes(['td-target' => "#$this->id"]) + ->type('text'); + + $input = match ($this->hasModel()) { + true => $input + ->id(Html::getInputId($this->model, $this->attribute)) + ->name(Html::getInputName($this->model, $this->attribute)) + ->value($this->model->{$this->attribute}), + default => $input->id($this->id)->name($this->name)->value($this->value), + }; + + $content = strtr( + $template, + [ + '{label}' => $label, + '{input}' => $input, + '{span}' => $span, + ], + ); + + $div = Div::widget() + ->attributes($containerOptions) + ->content($content) + ->dataAttributes(['td-target-input' => 'nearest', 'td-target-toggle' => 'nearest']) + ->id($this->id) + ->render(); + + return match ($this->floatingLabel) { + true => $div, + default => $this->hasModel() ? $div : $label . PHP_EOL . $div, + }; + } + + private function registerClientScript(): void + { + $view = $this->getView(); + + match ($this->cdn) { + true => Asset\DateTimePickerCdnAsset::register($view), + default => Asset\DateTimePickerAsset::register($view), + }; + + $view->registerJs($this->getScript()); + } +} diff --git a/src/Example.php b/src/Example.php deleted file mode 100644 index 067eeb8..0000000 --- a/src/Example.php +++ /dev/null @@ -1,13 +0,0 @@ -mockApplication(); + + DateTimePicker::$counter = 0; + + $this->view = Yii::$app->getView(); + } + + public function testDateTimePickerAssetSimpleDependency(): void + { + $this->assertEmpty($this->view->assetBundles); + + DateTimePickerAsset::register($this->view); + + $this->assertCount(2, $this->view->assetBundles); + + $this->assertInstanceOf(AssetBundle::class, $this->view->assetBundles[DateTimePickerAsset::class]); + $this->assertInstanceOf(AssetBundle::class, $this->view->assetBundles[PopperAsset::class]); + } + + public function testDateTimePickerAssetRegister(): void + { + $this->assertEmpty($this->view->assetBundles); + + DateTimePickerAsset::register($this->view); + + $this->assertCount(2, $this->view->assetBundles); + + $result = $this->view->renderFile( + __DIR__ . '/Support/main.php', + ['widget' => DateTimePicker::widget(['name' => 'tags', 'id' => 'tests-id'])], + ); + + $this->assertStringContainsString('css/tempus-dominus.css', $result); + $this->assertStringContainsString('js/tempus-dominus.js', $result); + $this->assertStringContainsString('js/jQuery-provider.js', $result); + $this->assertStringContainsString('jquery.js', $result); + } + + public function testDateTimePickerCdnAssetSimpleDependency(): void + { + $this->assertEmpty($this->view->assetBundles); + + DateTimePickerCdnAsset::register($this->view); + + $this->assertCount(2, $this->view->assetBundles); + + $this->assertInstanceOf(AssetBundle::class, $this->view->assetBundles[DateTimePickerCdnAsset::class]); + $this->assertInstanceOf(AssetBundle::class, $this->view->assetBundles[PopperCdnAsset::class]); + } + + public function testDateTimePickerCdnAssetRegister(): void + { + $this->assertEmpty($this->view->assetBundles); + + DateTimePickerCdnAsset::register($this->view); + + $this->assertCount(2, $this->view->assetBundles); + + $result = $this->view->renderFile( + __DIR__ . '/Support/main.php', + ['widget' => DateTimePicker::widget(['cdn' => true, 'id' => 'tests-id', 'name' => 'tags'])], + ); + + $this->assertStringContainsString( + << + HTML, + $result, + ); + $this->assertStringContainsString( + << + HTML, + $result, + ); + $this->assertStringContainsString('jquery.js', $result); + } +} diff --git a/tests/DateTimePickerTest.php b/tests/DateTimePickerTest.php new file mode 100644 index 0000000..8fc6288 --- /dev/null +++ b/tests/DateTimePickerTest.php @@ -0,0 +1,407 @@ +mockApplication(); + + DateTimePicker::$counter = 0; + + $this->view = Yii::$app->getView(); + } + + public function testContainerClass(): void + { + $dateTimePicker = DateTimePicker::widget( + [ + 'attribute' => 'date', + 'containerClass' => 'input-group test-class', + 'model' => new DateTimePickerModel(), + ], + ); + + $render = $this->view->renderFile(__DIR__ . '/Support/main.php', ['widget' => $dateTimePicker]); + + Assert::equalsWithoutLE( + << + + + + HTML, + $dateTimePicker, + ); + + $this->assertStringContainsString( + <<jQuery(function ($) { + $("#datetimepicker1").tempusDominus({"localization":{"today":"Go to today","clear":"Clear selection","close":"Close picker","selectMonth":"Select month","previousMonth":"Previous month","nextMonth":"Next month","selectYear":"Select year","previousYear":"Previous year","nextYear":"Next year","selectDecade":"Select decade","previousDecade":"Previous decade","nextDecade":"Next decade","previousCentury":"Previous century","nextCentury":"Next century","pickHour":"Pick hour","incrementHour":"Increment hour","decrementHour":"Decrement hour","pickMinute":"Pick minute","incrementMinute":"Increment minute","decrementMinute":"Decrement minute","pickSecond":"Pick second","incrementSecond":"Increment second","decrementSecond":"Decrement second","toggleMeridiem":"Toggle meridiem","selectTime":"Select time","selectDate":"Select date","dayViewHeaderFormat":{"month":"long","year":"numeric"},"locale":"en-US","startOfTheWeek":1}}); + }); + JS, + $render, + ); + } + + public function testFloatingLabel(): void + { + $dateTimePicker = DateTimePicker::widget( + [ + 'attribute' => 'date', + 'floatingLabel' => true, + 'model' => new DateTimePickerModel(), + ], + ); + + $render = $this->view->renderFile(__DIR__ . '/Support/main.php', ['widget' => $dateTimePicker]); + + Assert::equalsWithoutLE( + << + + + + + HTML, + $dateTimePicker, + ); + + $this->assertStringContainsString( + <<jQuery(function ($) { + $("#datetimepicker1").tempusDominus({"localization":{"today":"Go to today","clear":"Clear selection","close":"Close picker","selectMonth":"Select month","previousMonth":"Previous month","nextMonth":"Next month","selectYear":"Select year","previousYear":"Previous year","nextYear":"Next year","selectDecade":"Select decade","previousDecade":"Previous decade","nextDecade":"Next decade","previousCentury":"Previous century","nextCentury":"Next century","pickHour":"Pick hour","incrementHour":"Increment hour","decrementHour":"Decrement hour","pickMinute":"Pick minute","incrementMinute":"Increment minute","decrementMinute":"Decrement minute","pickSecond":"Pick second","incrementSecond":"Increment second","decrementSecond":"Decrement second","toggleMeridiem":"Toggle meridiem","selectTime":"Select time","selectDate":"Select date","dayViewHeaderFormat":{"month":"long","year":"numeric"},"locale":"en-US","startOfTheWeek":1}}); + }); + JS, + $render, + ); + } + + public function testFormatMonth(): void + { + $dateTimePicker = DateTimePicker::widget( + [ + 'attribute' => 'date', + 'formatMonth' => 'short', + 'model' => new DateTimePickerModel(), + ], + ); + + $render = $this->view->renderFile(__DIR__ . '/Support/main.php', ['widget' => $dateTimePicker]); + + Assert::equalsWithoutLE( + << + + + + HTML, + $dateTimePicker, + ); + + $this->assertStringContainsString( + <<jQuery(function ($) { + $("#datetimepicker1").tempusDominus({"localization":{"today":"Go to today","clear":"Clear selection","close":"Close picker","selectMonth":"Select month","previousMonth":"Previous month","nextMonth":"Next month","selectYear":"Select year","previousYear":"Previous year","nextYear":"Next year","selectDecade":"Select decade","previousDecade":"Previous decade","nextDecade":"Next decade","previousCentury":"Previous century","nextCentury":"Next century","pickHour":"Pick hour","incrementHour":"Increment hour","decrementHour":"Decrement hour","pickMinute":"Pick minute","incrementMinute":"Increment minute","decrementMinute":"Decrement minute","pickSecond":"Pick second","incrementSecond":"Increment second","decrementSecond":"Decrement second","toggleMeridiem":"Toggle meridiem","selectTime":"Select time","selectDate":"Select date","dayViewHeaderFormat":{"month":"short","year":"numeric"},"locale":"en-US","startOfTheWeek":1}}); + }); + JS, + $render, + ); + } + + public function testFormatYear(): void + { + $dateTimePicker = DateTimePicker::widget( + [ + 'attribute' => 'date', + 'formatYear' => '2-digit', + 'model' => new DateTimePickerModel(), + ], + ); + + $render = $this->view->renderFile(__DIR__ . '/Support/main.php', ['widget' => $dateTimePicker]); + + Assert::equalsWithoutLE( + << + + + + HTML, + $dateTimePicker, + ); + + $this->assertStringContainsString( + <<jQuery(function ($) { + $("#datetimepicker1").tempusDominus({"localization":{"today":"Go to today","clear":"Clear selection","close":"Close picker","selectMonth":"Select month","previousMonth":"Previous month","nextMonth":"Next month","selectYear":"Select year","previousYear":"Previous year","nextYear":"Next year","selectDecade":"Select decade","previousDecade":"Previous decade","nextDecade":"Next decade","previousCentury":"Previous century","nextCentury":"Next century","pickHour":"Pick hour","incrementHour":"Increment hour","decrementHour":"Decrement hour","pickMinute":"Pick minute","incrementMinute":"Increment minute","decrementMinute":"Decrement minute","pickSecond":"Pick second","incrementSecond":"Increment second","decrementSecond":"Decrement second","toggleMeridiem":"Toggle meridiem","selectTime":"Select time","selectDate":"Select date","dayViewHeaderFormat":{"month":"long","year":"2-digit"},"locale":"en-US","startOfTheWeek":1}}); + }); + JS, + $render, + ); + } + + public function testIcon(): void + { + $dateTimePicker = DateTimePicker::widget( + [ + 'attribute' => 'date', + 'icon' => I::widget()->class('fa fa-calendar'), + 'model' => new DateTimePickerModel(), + ], + ); + + $render = $this->view->renderFile(__DIR__ . '/Support/main.php', ['widget' => $dateTimePicker]); + + Assert::equalsWithoutLE( + << + + + + HTML, + $dateTimePicker, + ); + + $this->assertStringContainsString( + <<jQuery(function ($) { + $("#datetimepicker1").tempusDominus({"localization":{"today":"Go to today","clear":"Clear selection","close":"Close picker","selectMonth":"Select month","previousMonth":"Previous month","nextMonth":"Next month","selectYear":"Select year","previousYear":"Previous year","nextYear":"Next year","selectDecade":"Select decade","previousDecade":"Previous decade","nextDecade":"Next decade","previousCentury":"Previous century","nextCentury":"Next century","pickHour":"Pick hour","incrementHour":"Increment hour","decrementHour":"Decrement hour","pickMinute":"Pick minute","incrementMinute":"Increment minute","decrementMinute":"Decrement minute","pickSecond":"Pick second","incrementSecond":"Increment second","decrementSecond":"Decrement second","toggleMeridiem":"Toggle meridiem","selectTime":"Select time","selectDate":"Select date","dayViewHeaderFormat":{"month":"long","year":"numeric"},"locale":"en-US","startOfTheWeek":1}}); + }); + JS, + $render, + ); + } + + public function testId(): void + { + $dateTimePicker = DateTimePicker::widget( + [ + 'attribute' => 'date', + 'id' => 'datetimepicker2', + 'model' => new DateTimePickerModel(), + ], + ); + + $render = $this->view->renderFile(__DIR__ . '/Support/main.php', ['widget' => $dateTimePicker]); + + Assert::equalsWithoutLE( + << + + + + HTML, + $dateTimePicker, + ); + + $this->assertStringContainsString( + <<jQuery(function ($) { + $("#datetimepicker2").tempusDominus({"localization":{"today":"Go to today","clear":"Clear selection","close":"Close picker","selectMonth":"Select month","previousMonth":"Previous month","nextMonth":"Next month","selectYear":"Select year","previousYear":"Previous year","nextYear":"Next year","selectDecade":"Select decade","previousDecade":"Previous decade","nextDecade":"Next decade","previousCentury":"Previous century","nextCentury":"Next century","pickHour":"Pick hour","incrementHour":"Increment hour","decrementHour":"Decrement hour","pickMinute":"Pick minute","incrementMinute":"Increment minute","decrementMinute":"Decrement minute","pickSecond":"Pick second","incrementSecond":"Increment second","decrementSecond":"Decrement second","toggleMeridiem":"Toggle meridiem","selectTime":"Select time","selectDate":"Select date","dayViewHeaderFormat":{"month":"long","year":"numeric"},"locale":"en-US","startOfTheWeek":1}}); + }); + JS, + $render, + ); + } + + public function testLabelClass(): void + { + $dateTimePicker = DateTimePicker::widget( + [ + 'name' => 'datetime-picker', + 'labelClass' => 'test-class', + ], + ); + + $render = $this->view->renderFile(__DIR__ . '/Support/main.php', ['widget' => $dateTimePicker]); + + Assert::equalsWithoutLE( + <<Date +
+ + +
+ HTML, + $dateTimePicker, + ); + + $this->assertStringContainsString( + <<jQuery(function ($) { + $("#datetimepicker1").tempusDominus({"localization":{"today":"Go to today","clear":"Clear selection","close":"Close picker","selectMonth":"Select month","previousMonth":"Previous month","nextMonth":"Next month","selectYear":"Select year","previousYear":"Previous year","nextYear":"Next year","selectDecade":"Select decade","previousDecade":"Previous decade","nextDecade":"Next decade","previousCentury":"Previous century","nextCentury":"Next century","pickHour":"Pick hour","incrementHour":"Increment hour","decrementHour":"Decrement hour","pickMinute":"Pick minute","incrementMinute":"Increment minute","decrementMinute":"Decrement minute","pickSecond":"Pick second","incrementSecond":"Increment second","decrementSecond":"Decrement second","toggleMeridiem":"Toggle meridiem","selectTime":"Select time","selectDate":"Select date","dayViewHeaderFormat":{"month":"long","year":"numeric"},"locale":"en-US","startOfTheWeek":1}}); + }); + JS, + $render, + ); + } + + public function testLabelContent(): void + { + $dateTimePicker = DateTimePicker::widget( + [ + 'name' => 'datetime-picker', + 'labelContent' => 'DateTime', + ], + ); + + $render = $this->view->renderFile(__DIR__ . '/Support/main.php', ['widget' => $dateTimePicker]); + + Assert::equalsWithoutLE( + <<DateTime +
+ + +
+ HTML, + $dateTimePicker, + ); + + $this->assertStringContainsString( + <<jQuery(function ($) { + $("#datetimepicker1").tempusDominus({"localization":{"today":"Go to today","clear":"Clear selection","close":"Close picker","selectMonth":"Select month","previousMonth":"Previous month","nextMonth":"Next month","selectYear":"Select year","previousYear":"Previous year","nextYear":"Next year","selectDecade":"Select decade","previousDecade":"Previous decade","nextDecade":"Next decade","previousCentury":"Previous century","nextCentury":"Next century","pickHour":"Pick hour","incrementHour":"Increment hour","decrementHour":"Decrement hour","pickMinute":"Pick minute","incrementMinute":"Increment minute","decrementMinute":"Decrement minute","pickSecond":"Pick second","incrementSecond":"Increment second","decrementSecond":"Decrement second","toggleMeridiem":"Toggle meridiem","selectTime":"Select time","selectDate":"Select date","dayViewHeaderFormat":{"month":"long","year":"numeric"},"locale":"en-US","startOfTheWeek":1}}); + }); + JS, + $render, + ); + } + + public function testName(): void + { + $dateTimePicker = DateTimePicker::widget( + [ + 'name' => 'datetime-picker', + ], + ); + + $render = $this->view->renderFile(__DIR__ . '/Support/main.php', ['widget' => $dateTimePicker]); + + Assert::equalsWithoutLE( + <<Date +
+ + +
+ HTML, + $dateTimePicker, + ); + + $this->assertStringContainsString( + <<jQuery(function ($) { + $("#datetimepicker1").tempusDominus({"localization":{"today":"Go to today","clear":"Clear selection","close":"Close picker","selectMonth":"Select month","previousMonth":"Previous month","nextMonth":"Next month","selectYear":"Select year","previousYear":"Previous year","nextYear":"Next year","selectDecade":"Select decade","previousDecade":"Previous decade","nextDecade":"Next decade","previousCentury":"Previous century","nextCentury":"Next century","pickHour":"Pick hour","incrementHour":"Increment hour","decrementHour":"Decrement hour","pickMinute":"Pick minute","incrementMinute":"Increment minute","decrementMinute":"Decrement minute","pickSecond":"Pick second","incrementSecond":"Increment second","decrementSecond":"Decrement second","toggleMeridiem":"Toggle meridiem","selectTime":"Select time","selectDate":"Select date","dayViewHeaderFormat":{"month":"long","year":"numeric"},"locale":"en-US","startOfTheWeek":1}}); + }); + JS, + $render, + ); + } + + public function testSpanClass(): void + { + $dateTimePicker = DateTimePicker::widget( + [ + 'attribute' => 'date', + 'model' => new DateTimePickerModel(), + 'spanClass' => 'input-group-text test-class', + ], + ); + + $render = $this->view->renderFile(__DIR__ . '/Support/main.php', ['widget' => $dateTimePicker]); + + Assert::equalsWithoutLE( + << + + + + HTML, + $dateTimePicker, + ); + + $this->assertStringContainsString( + <<jQuery(function ($) { + $("#datetimepicker1").tempusDominus({"localization":{"today":"Go to today","clear":"Clear selection","close":"Close picker","selectMonth":"Select month","previousMonth":"Previous month","nextMonth":"Next month","selectYear":"Select year","previousYear":"Previous year","nextYear":"Next year","selectDecade":"Select decade","previousDecade":"Previous decade","nextDecade":"Next decade","previousCentury":"Previous century","nextCentury":"Next century","pickHour":"Pick hour","incrementHour":"Increment hour","decrementHour":"Decrement hour","pickMinute":"Pick minute","incrementMinute":"Increment minute","decrementMinute":"Decrement minute","pickSecond":"Pick second","incrementSecond":"Increment second","decrementSecond":"Decrement second","toggleMeridiem":"Toggle meridiem","selectTime":"Select time","selectDate":"Select date","dayViewHeaderFormat":{"month":"long","year":"numeric"},"locale":"en-US","startOfTheWeek":1}}); + }); + JS, + $render, + ); + } + + public function testStarOfTheWeek(): void + { + $dateTimePicker = DateTimePicker::widget( + [ + 'attribute' => 'date', + 'model' => new DateTimePickerModel(), + 'startOfTheWeek' => 0, + ], + ); + + $render = $this->view->renderFile(__DIR__ . '/Support/main.php', ['widget' => $dateTimePicker]); + + Assert::equalsWithoutLE( + << + + + + HTML, + $dateTimePicker, + ); + + $this->assertStringContainsString( + <<jQuery(function ($) { + $("#datetimepicker1").tempusDominus({"localization":{"today":"Go to today","clear":"Clear selection","close":"Close picker","selectMonth":"Select month","previousMonth":"Previous month","nextMonth":"Next month","selectYear":"Select year","previousYear":"Previous year","nextYear":"Next year","selectDecade":"Select decade","previousDecade":"Previous decade","nextDecade":"Next decade","previousCentury":"Previous century","nextCentury":"Next century","pickHour":"Pick hour","incrementHour":"Increment hour","decrementHour":"Decrement hour","pickMinute":"Pick minute","incrementMinute":"Increment minute","decrementMinute":"Decrement minute","pickSecond":"Pick second","incrementSecond":"Increment second","decrementSecond":"Decrement second","toggleMeridiem":"Toggle meridiem","selectTime":"Select time","selectDate":"Select date","dayViewHeaderFormat":{"month":"long","year":"numeric"},"locale":"en-US","startOfTheWeek":0}}); + }); + JS, + $render, + ); + } + + public function testRender(): void + { + $dateTimePicker = DateTimePicker::widget( + [ + 'attribute' => 'date', + 'model' => new DateTimePickerModel(), + ], + ); + + $render = $this->view->renderFile(__DIR__ . '/Support/main.php', ['widget' => $dateTimePicker]); + + Assert::equalsWithoutLE( + << + + + + HTML, + $dateTimePicker, + ); + + $this->assertStringContainsString( + <<jQuery(function ($) { + $("#datetimepicker1").tempusDominus({"localization":{"today":"Go to today","clear":"Clear selection","close":"Close picker","selectMonth":"Select month","previousMonth":"Previous month","nextMonth":"Next month","selectYear":"Select year","previousYear":"Previous year","nextYear":"Next year","selectDecade":"Select decade","previousDecade":"Previous decade","nextDecade":"Next decade","previousCentury":"Previous century","nextCentury":"Next century","pickHour":"Pick hour","incrementHour":"Increment hour","decrementHour":"Decrement hour","pickMinute":"Pick minute","incrementMinute":"Increment minute","decrementMinute":"Decrement minute","pickSecond":"Pick second","incrementSecond":"Increment second","decrementSecond":"Decrement second","toggleMeridiem":"Toggle meridiem","selectTime":"Select time","selectDate":"Select date","dayViewHeaderFormat":{"month":"long","year":"numeric"},"locale":"en-US","startOfTheWeek":1}}); + }); + JS, + $render, + ); + } +} diff --git a/tests/ExampleTest.php b/tests/ExampleTest.php deleted file mode 100644 index 2825a4e..0000000 --- a/tests/ExampleTest.php +++ /dev/null @@ -1,18 +0,0 @@ -assertTrue($example->getExample()); - } -} diff --git a/tests/ExceptionTest.php b/tests/ExceptionTest.php new file mode 100644 index 0000000..0d42871 --- /dev/null +++ b/tests/ExceptionTest.php @@ -0,0 +1,19 @@ +expectException(InvalidConfigException::class); + $this->expectExceptionMessage("Either 'name', or 'model' and 'attribute' properties must be specified."); + + DateTimePicker::widget(); + } +} diff --git a/tests/Support/DateTimePickerModel.php b/tests/Support/DateTimePickerModel.php new file mode 100644 index 0000000..9a081d1 --- /dev/null +++ b/tests/Support/DateTimePickerModel.php @@ -0,0 +1,10 @@ + +beginPage();?> + head();?> + beginBody();?> + + endBody();?> +endPage(); diff --git a/tests/Support/runtime/.gitkeep b/tests/Support/runtime/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..3df79fa --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,77 @@ +destroyApplication(); + } + + protected function mockApplication(): void + { + new Application( + [ + 'id' => 'testapp', + 'aliases' => [ + '@root' => dirname(__DIR__), + '@bower' => '@root/node_modules', + '@npm' => '@root/node_modules', + ], + 'basePath' => dirname(__DIR__), + 'components' => [ + 'assetManager' => [ + 'appendTimestamp' => false, + 'basePath' => __DIR__ . '/Support/runtime', + 'baseUrl' => '/', + ], + 'i18n' => [ + 'translations' => [ + 'yii2.extensions.datetime.picker' => [ + 'class' => PhpMessageSource::class, + 'basePath' => dirname(__DIR__) . '/resource/message', + ], + ], + ], + 'request' => [ + 'cookieValidationKey' => 'wefJDF8sfdsfSDefwqdxj9oq', + 'scriptFile' => __DIR__ . '/index.php', + 'scriptUrl' => '/index.php', + ], + ], + ], + ); + } + + /** + * Destroys application in Yii::$app by setting it to null. + */ + protected function destroyApplication() + { + Yii::$app = null; + Yii::$container = new Container(); + Assert::removeFilesFromDirectory(__DIR__ . '/Support/runtime'); + + unset($this->view); + } +}