153 lines
5.4 KiB
PHP
153 lines
5.4 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @copyright Copyright © Kartik Visweswaran, Krajee.com, 2014 - 2021
|
|
* @package yii2-widgets
|
|
* @subpackage timepicker
|
|
* @version 1.0.5
|
|
*/
|
|
|
|
//namespace kartik\time;
|
|
namespace backend\components\timepicker\src;
|
|
|
|
use yii\base\InvalidConfigException;
|
|
use yii\helpers\ArrayHelper;
|
|
use yii\helpers\Html;
|
|
use kartik\base\InputWidget;
|
|
|
|
/**
|
|
* The TimePicker widget allows you to easily select a time for a text input using your mouse or keyboards arrow keys.
|
|
* Thus widget is a wrapper enhancement over the TimePicker JQuery plugin by rendom forked from the plugin by jdewit.
|
|
* Additional enhancements have been done to this input widget and plugin by Krajee to fix various bugs, and also
|
|
* provide compatibility with Bootstrap 3.
|
|
*
|
|
* @author Kartik Visweswaran <kartikv2@gmail.com>
|
|
* @since 1.0
|
|
* @see https://github.com/rendom/bootstrap-3-timepicker
|
|
* @see https://github.com/jdewit/bootstrap-timepicker
|
|
*/
|
|
class TimePicker extends InputWidget
|
|
{
|
|
/**
|
|
* @var string the size of the input - 'lg', 'md', 'sm', 'xs'
|
|
*/
|
|
public $size;
|
|
|
|
/**
|
|
* @var string|boolean the addon content
|
|
*/
|
|
public $addon;
|
|
|
|
/**
|
|
* @var array HTML attributes for the addon container. The following special options are recognized:
|
|
* - `asButton`: _boolean_, if the addon is to be displayed as a button.
|
|
* - `buttonOptions`: _array_, HTML attributes if the addon is to be displayed like a button. If [[asButton]] is
|
|
* `true`, this will default to :
|
|
* - `['class' => 'btn btn-default']` for [[bsVersion]] = '3.x' or .
|
|
* - `['class' => 'btn btn-secondary']` for [[bsVersion]] = '4.x' and '5.x'
|
|
*/
|
|
public $addonOptions = [];
|
|
|
|
/**
|
|
* @var array HTML attributes for the input group container
|
|
*/
|
|
public $containerOptions = [];
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
public $pluginName = 'timepicker';
|
|
|
|
/**
|
|
* @inheritdoc
|
|
* @throws InvalidConfigException
|
|
*/
|
|
public function run()
|
|
{
|
|
$this->initIcon('up');
|
|
$this->initIcon('down');
|
|
$this->registerAssets();
|
|
echo Html::tag('div', $this->renderInput(), $this->containerOptions);
|
|
}
|
|
|
|
/**
|
|
* Initializes icon for time units up and down buttons
|
|
* @param string $type whether 'up' or 'down'
|
|
* @throws InvalidConfigException|\Exception
|
|
*/
|
|
protected function initIcon($type)
|
|
{
|
|
$prop = $type . 'ArrowStyle';
|
|
if (!isset($this->pluginOptions[$prop])) {
|
|
$prefix = !$this->isBs(3) ? 'fas fa-' : 'glyphicon glyphicon-';
|
|
$this->pluginOptions[$prop] = $prefix . 'chevron-' . $type;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Renders the input
|
|
*
|
|
* @return string
|
|
* @throws InvalidConfigException|\Exception
|
|
*/
|
|
protected function renderInput()
|
|
{
|
|
$notBs3 = !$this->isBs(3);
|
|
$isBs5 = $this->isBs(5);
|
|
if (!isset($this->addon)) {
|
|
$this->addon = $notBs3 ? '<i class="far fa-clock"></i>' : '<i class="glyphicon glyphicon-time"></i>';
|
|
}
|
|
Html::addCssClass($this->options, 'form-control');
|
|
if (!empty($this->options['disabled'])) {
|
|
Html::addCssClass($this->addonOptions, 'disabled-addon');
|
|
}
|
|
if (ArrayHelper::getValue($this->pluginOptions, 'template', true) === false) {
|
|
$css = $notBs3 ? 'bootstrap-timepicker4' : 'bootstrap-timepicker3';
|
|
Html::addCssClass($this->containerOptions, ['bootstrap-timepicker', $css]);
|
|
if (isset($this->size)) {
|
|
Html::addCssClass($this->options, ($notBs3 ? 'form-control-' : 'input-') . $this->size);
|
|
Html::addCssClass($this->addonOptions, 'inline-addon inline-addon-' . $this->size);
|
|
} else {
|
|
Html::addCssClass($this->addonOptions, 'inline-addon');
|
|
}
|
|
return $this->getInput('textInput') . Html::tag('span', $this->addon, $this->addonOptions);
|
|
}
|
|
Html::addCssClass($this->containerOptions, 'bootstrap-timepicker input-group');
|
|
$asButton = ArrayHelper::remove($this->addonOptions, 'asButton', false);
|
|
$buttonOptions = ArrayHelper::remove($this->addonOptions, 'buttonOptions', []);
|
|
|
|
if ($asButton) {
|
|
$css = $notBs3 ? 'input-group-append' : 'input-group-btn';
|
|
$tag = $notBs3 ? 'div' : 'span';
|
|
Html::addCssClass($this->addonOptions, [$css, 'picker']);
|
|
$buttonOptions['type'] = 'button';
|
|
if (empty($buttonOptions['class'])) {
|
|
Html::addCssClass($buttonOptions, 'btn btn-default');
|
|
}
|
|
$button = Html::button($this->addon, $buttonOptions);
|
|
$addon = $isBs5 ? $button : Html::tag($tag, $button, $this->addonOptions);
|
|
} else {
|
|
$css = $notBs3 ? 'input-group-text' : 'input-group-addon';
|
|
Html::addCssClass($this->addonOptions, [$css, 'picker']);
|
|
$addon = Html::tag('span', $this->addon, $this->addonOptions);
|
|
if ($notBs3 && !$isBs5) {
|
|
$addon = Html::tag('div', $addon, ['class' => 'input-group-append']);
|
|
}
|
|
}
|
|
if (isset($this->size)) {
|
|
Html::addCssClass($this->containerOptions, 'input-group-' . $this->size);
|
|
}
|
|
return $this->getInput('textInput') . $addon;
|
|
}
|
|
|
|
/**
|
|
* Registers the client assets for [[Timepicker]] widget
|
|
*/
|
|
public function registerAssets()
|
|
{
|
|
$view = $this->getView();
|
|
TimePickerAsset::register($view);
|
|
$this->registerPlugin($this->pluginName);
|
|
}
|
|
}
|