summaryrefslogtreecommitdiff
path: root/framework/Web/UI/JuiControls
diff options
context:
space:
mode:
authorJens Klaer <kj.landwehr.software@gmail.com>2015-10-14 14:12:18 +0200
committerJens Klaer <kj.landwehr.software@gmail.com>2015-10-14 14:12:18 +0200
commit3a90a37ca45f91d9f314eaa1f7e86c056e56e7bb (patch)
tree61c56713ac69fa0a1f00f879fcb73a4bc2d78f6e /framework/Web/UI/JuiControls
parent7ec5cb6a6ef106c9662905988697045dcd0f378a (diff)
Added TJuiDatePicker
an alternative datepicker control using the datepicker widget from jqueryui
Diffstat (limited to 'framework/Web/UI/JuiControls')
-rw-r--r--framework/Web/UI/JuiControls/TJuiDatePicker.php286
1 files changed, 286 insertions, 0 deletions
diff --git a/framework/Web/UI/JuiControls/TJuiDatePicker.php b/framework/Web/UI/JuiControls/TJuiDatePicker.php
new file mode 100644
index 00000000..d894e07d
--- /dev/null
+++ b/framework/Web/UI/JuiControls/TJuiDatePicker.php
@@ -0,0 +1,286 @@
+<?php
+/**
+ * TJuiDatePicker class file.
+ *
+ * @author LANDWEHR Computer und Software GmbH <programmierung@landwehr-software.de>
+ * @link http://www.landwehr-software.de/
+ * @copyright Copyright &copy; 2015 LANDWEHR Computer und Software GmbH
+ * @license http://www.pradosoft.com/license/
+ * @package System.Web.UI.ActiveControls
+ */
+
+/**
+ * Load active text box.
+ */
+Prado::using('System.Web.UI.ActiveControls.TActiveTextBox');
+Prado::using('System.Web.UI.ActiveControls.TCallbackEventParameter');
+Prado::using('System.Web.UI.JuiControls.TJuiControlAdapter');
+/**
+ * TJuiDatePicker class.
+ *
+ * TJuiDatePicker is a textbox that provides a date input. When the text box receives focus,
+ * a calendar will pop up and users can pick up from it a date that will be automatically
+ * entered into the text box. TJuiDatePicker is an extension to {@link TActivePanel} based on
+ * jQuery-UI's {@link http://jqueryui.com/dialog/ Dialog} widget.
+ *
+ * <code>
+ * <com:TJuiDatePicker ID="datepicker1" />
+ * </code>
+ *
+ * @author LANDWEHR Computer und Software GmbH <programmierung@landwehr-software.de>
+ * @package System.Web.UI.JuiControls
+ * @since 3.3
+ */
+class TJuiDatePicker extends TActiveTextBox implements INamingContainer, IJuiOptions
+{
+
+ /**
+ * The static variable is used to determine if this is the first instance of TJuiDatePicker. If true,
+ * it will register an additional clientscript to set the language specific global default settings.
+ * @var boolean true, if this is the first instance of TJuiDatePicker, false otherwise
+ */
+ private static $_first = true;
+
+ /**
+ * Creates a new callback control, sets the adapter to
+ * TActiveControlAdapter. If you override this class, be sure to set the
+ * adapter appropriately by, for example, by calling this constructor.
+ */
+ public function __construct()
+ {
+ parent::__construct();
+ $this->setAdapter(new TJuiControlAdapter($this));
+ }
+
+ /**
+ * @return string the name of the jQueryUI widget method
+ */
+ public function getWidget()
+ {
+ return 'datepicker';
+ }
+
+ /**
+ * @return string the clientid of the jQueryUI widget element
+ */
+ public function getWidgetID()
+ {
+ return $this->getClientID();
+ }
+
+ /**
+ * Object containing defined javascript options
+ * @return TJuiControlOptions
+ */
+ public function getOptions()
+ {
+ if (($options=$this->getViewState('JuiOptions'))===null)
+ {
+ $options=new TJuiControlOptions($this);
+ $this->setViewState('JuiOptions', $options);
+ }
+ return $options;
+ }
+
+ /**
+ * Array containing valid javascript options
+ * @return array()
+ */
+ public function getValidOptions()
+ {
+ return array('altField', 'altFormat', 'appendText', 'autoSize', 'buttonImage', 'buttonImageOnly', 'buttonText', 'calculateWeek',
+ 'changeMonth', 'changeYear', 'closeText', 'constrainInput', 'currentText', 'dateFormat', 'dayNames', 'dayNamesMin',
+ 'dayNamesShort', 'defaultDate', 'duration', 'firstDay', 'gotoCurrent', 'hideIfNoPrevNext', 'isRTL', 'maxDate',
+ 'minDate', 'monthNames', 'monthNamesShort', 'navigationAsDateFormat', 'nextText', 'numberOfMonths', 'prevText',
+ 'selectOtherMonths', 'shortYearCutoff', 'showAnim', 'showButtonPanel', 'showCurrentAtPos', 'showMonthAfterYear',
+ 'showOn', 'showOptions', 'showOtherMonths', 'showWeek', 'stepMonths', 'weekHeader', 'yearRange', 'yearSuffix');
+ }
+
+ /**
+ * Array containing valid javascript events
+ * @return array()
+ */
+ public function getValidEvents()
+ {
+ return array('beforeShow', 'beforeShowDay', 'onChangeMonthYear', 'onClose', 'onSelect');
+ }
+
+ /**
+ * Ensure that the ID attribute is rendered and registers the javascript code
+ * for initializing the active control. Also registers language specific global
+ * settings for the first used date picker.
+ */
+ protected function addAttributesToRender($writer)
+ {
+ $cs=$this->getPage()->getClientScript();
+ if(self::$_first)
+ {
+ $code="jQuery(document).ready(function(){jQuery.datepicker.setDefaults(jQuery.datepicker.regional['{$this->getCurrentCulture()}']);});";
+ $cs->registerEndScript(sprintf('%08X', crc32($code)), $code);
+ self::$_first=false;
+ }
+ parent::addAttributesToRender($writer);
+ $options=TJavascript::encode($this->getOptions()->toArray());
+ $code="jQuery('#".$this->getWidgetID()."').".$this->getWidget()."(".$options.");";
+ $cs->registerEndScript(sprintf('%08X', crc32($code)), $code);
+ }
+
+ /**
+ * @return TTextBoxMode the behavior mode of the underlying {@link TTextBox} component.
+ * Fixed to TTextBoxMode::SingleLine for the TJuiDatePicker.
+ */
+ public function getTextMode()
+ {
+ return TTextBoxMode::SingleLine;
+ }
+
+ /**
+ * Setting the behavior mode of the underlying TTextBox component is NOT supported.
+ * @param TTextBoxMode the text mode
+ * @throws TNotSupportedException not supported, fixed to TTextBoxMode::SingleLine.
+ */
+ public function setTextMode($value)
+ {
+ throw new TNotSupportedException('juidatepicker_settextmode_unsupported');
+ }
+
+ /**
+ * Gets the current culture.
+ * @return string current culture, e.g. en_AU.
+ */
+ public function getCulture()
+ {
+ return $this->getViewState('Culture', '');
+ }
+
+ /**
+ * Sets the culture/language for the date picker.
+ * @param string a culture string, e.g. en_AU.
+ */
+ public function setCulture($value)
+ {
+ $this->setViewState('Culture', $value, '');
+ }
+
+ /**
+ * @return string the current culture, falls back to application if culture is not set.
+ */
+ protected function getCurrentCulture()
+ {
+ $app = $this->getApplication()->getGlobalization(false);
+ return $this->getCulture() == '' ?
+ ($app ? $app->getCulture() : 'en') : $this->getCulture();
+ }
+
+ /**
+ * @return string the format of the date string
+ */
+ public function getDateFormat()
+ {
+ return $this->getViewState('DateFormat','dd-MM-yyyy');
+ }
+
+ /**
+ * Sets the format of the date string.
+ * @param string the format of the date string
+ */
+ public function setDateFormat($value)
+ {
+ $this->setViewState('DateFormat',$value,'dd-MM-yyyy');
+ }
+
+ /**
+ * Returns the timestamp selected by the user.
+ * This method is required by {@link IDataRenderer}.
+ * It is the same as {@link getTimeStamp()}.
+ * @return integer the timestamp of the TDatePicker control.
+ * @see getTimeStamp
+ * @since 3.1.2
+ */
+ public function getData()
+ {
+ return $this->getTimeStamp();
+ }
+
+ /**
+ * Sets the timestamp represented by this control.
+ * This method is required by {@link IDataRenderer}.
+ * It is the same as {@link setTimeStamp()}.
+ * @param integer the timestamp of the TDatePicker control.
+ * @see setTimeStamp
+ * @since 3.1.2
+ */
+ public function setData($value)
+ {
+ $this->setTimeStamp($value);
+ }
+
+ /**
+ * @return string the date string.
+ */
+ public function getDate()
+ {
+ return $this->getText();
+ }
+
+ /**
+ * @param string date string
+ */
+ public function setDate($value)
+ {
+ $this->setText($value);
+ }
+
+ /**
+ * @return integer current selected date from the date picker as timestamp, NULL if timestamp is not set previously.
+ */
+ public function getTimeStamp()
+ {
+ if(trim($this->getText())==='')
+ return null;
+ else
+ return $this->getTimeStampFromText();
+ }
+
+ /**
+ * Sets the date for the date picker using timestamp.
+ * @param float time stamp for the date picker
+ */
+ public function setTimeStamp($value)
+ {
+ if($value===null || (is_string($value) && trim($value)===''))
+ $this->setText('');
+ else
+ {
+ $date = TPropertyValue::ensureFloat($value);
+ $formatter = Prado::createComponent('System.Util.TSimpleDateFormatter',$this->getDateFormat());
+ $this->setText($formatter->format($date));
+ }
+ }
+
+ /**
+ * Gets the date from the text input using TSimpleDateFormatter
+ * @return integer current selected date timestamp
+ */
+ protected function getTimeStampFromText()
+ {
+ $pattern = $this->getDateFormat();
+ $pattern = str_replace(array('MMMM', 'MMM'), array('MM','MM'), $pattern);
+ $formatter = Prado::createComponent('System.Util.TSimpleDateFormatter',$pattern);
+ return $formatter->parse($this->getText());
+ }
+
+ /**
+ * Returns the value to be validated.
+ * This methid is required by IValidatable interface.
+ * @return integer the interger timestamp if valid, otherwise the original text.
+ */
+ public function getValidationPropertyValue()
+ {
+ if(($text = $this->getText()) === '')
+ return '';
+ $date = $this->getTimeStamp();
+ return $date == null ? $text : $date;
+ }
+
+} \ No newline at end of file