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 @@
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
+
+
+
+
+
+
-## 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();?>
+ = $widget ?>
+ 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);
+ }
+}