From 57bfe36497e7f7b869c76fbaf94075048a613c1f Mon Sep 17 00:00:00 2001 From: enured <enis.nuredini@uzh.ch> Date: Fri, 16 Sep 2022 19:50:51 +0200 Subject: [PATCH] F12630: min/max was only for europe date format implemented. Now the international format is accepted too. Global config for international date format will be converted automatically from yyyy-mm-dd to YYYY-MM-DD, which results to this example date: 2022-08-12. Ref #14737, #14303, #14245, #13767, #14736 WIP: #14619, c)not reproducable problem --- Documentation/Installation.rst | 39 +++++- extension/Classes/Core/AbstractBuildForm.php | 120 ++++++++++++++---- extension/Classes/Core/Constants.php | 10 ++ extension/Classes/Core/Helper/Support.php | 6 +- extension/Classes/Core/Save.php | 10 ++ .../Classes/Core/Store/FillStoreForm.php | 30 ++++- extension/ext_conf_template.txt | 3 + javascript/src/Form.js | 42 ++++++ javascript/src/Main.js | 14 +- 9 files changed, 239 insertions(+), 35 deletions(-) diff --git a/Documentation/Installation.rst b/Documentation/Installation.rst index f22923c53..0c14cec7a 100644 --- a/Documentation/Installation.rst +++ b/Documentation/Installation.rst @@ -288,9 +288,19 @@ Setup CSS & JS .. _datetimepicker: Datetimepicker ----------- -Include the JS and CSS Files to get datetimepicker work: -Following scripts are needed: +-------------- +There are three types of datetimepicker available which can be set over QFQ-Configuration, Form.parameter and FormElement.parameter.:: + + dateTimePickerType = qfq + dateTimePickerType = browser + dateTimePickerType = no + +qfq +^^^ + +Is set as default and gives best experience. For this type following steps are needed to do at first time: + +Include these JS and CSS Files to get datetimepicker work: * bootstrap-datetimepicker.min.css * bootstrap-datetimepicker.min.js @@ -301,17 +311,34 @@ Second option is to use the UZH CD template. Following configurations can be set over FormElement.parameter: -dateFormat = *DD.MM.YYYY HH:mm:ss* | *MM-DD-YYYY HH:mm* | *dddd DD.MM.YYYY HH:mm* -> DD:day of month,MM:month value,YYYY:year value,HH:24h,hh:12h AM-PM,mm:minutes,ss:seconds,dddd:written day of week +dateFormat = *DD.MM.YYYY* | *MM-DD-YYYY* -> DD:day of month,MM:month value,YYYY:year value dateDaysOfWeekEnabled = *0,1,6* -> 0:sunday,1:monday,2:tuesday,3:wednesday,4:thursday,5:friday,6:saturday dateLocale = *en* | *de* -> Set language -min = *03.05.2022* -> minDate that can be selected -max = *23.07.2022* -> maxDate that can be selected +min = *03.05.2022* | *03.05.2022 14:00:00* -> minDate that can be set for date or datetime +max = *23.07.2022* | *23.07.2022 13:00:00* -> maxDate that can be set for date or datetime dateViewModeDefault = *days* | *months* | *years* clearMe = *0* | *1* -> show clear button dateShowCalendarWeeks = *false* | *true* dateUseCurrentDatetime = *false* | *true* datetimeSideBySide = *false* | *true* -> Show time right to date +browser +^^^^^^^ + +For this datetimepicker most options are given from browser and there only can be set max and min date as own parameters. +Date format can not be changed, means dateFormat settings and parameters dont have impact on this type of datetimepicker. +It will be used for datetime, date and time. + +no +^^ + +This option deactivates the datetimepicker and allows a normal user input. Input still will be checked for correct format and following parameters are available too: + +* dateFormat +* min +* max +* clearMe + .. _form-editor: FormEditor diff --git a/extension/Classes/Core/AbstractBuildForm.php b/extension/Classes/Core/AbstractBuildForm.php index b10da3d81..bd58a02e5 100644 --- a/extension/Classes/Core/AbstractBuildForm.php +++ b/extension/Classes/Core/AbstractBuildForm.php @@ -3138,9 +3138,33 @@ abstract class AbstractBuildForm { "maxDate" ); + // Set needed datetimepicker type + $dateTimePickerType = $this->store::getVar(SYSTEM_DATE_TIME_PICKER_TYPE,STORE_SYSTEM); + $dateTimePickerTypeForm = $this->formSpec[F_DATE_TIME_PICKER_TYPE]; + $dateTimePickerTypeFe = $formElement[FE_DATE_TIME_PICKER_TYPE]; + + if(isset($dateTimePickerTypeForm) && $dateTimePickerTypeForm !== '') { + $dateTimePickerType = $dateTimePickerTypeForm; + } + + if(isset($dateTimePickerTypeFe) && $dateTimePickerTypeFe !== '') { + $dateTimePickerType = $dateTimePickerTypeFe; + } + + $datePickerClassName = ''; + if($dateTimePickerType === DATE_TIME_PICKER_QFQ) { + $datePickerClassName = 'qfq-datepicker'; + } elseif (isset($formElement[FE_INPUT_CLEAR_ME]) && $formElement[FE_INPUT_CLEAR_ME] != '0' && $dateTimePickerType === DATE_TIME_PICKER_NO) { + if (($this->formSpec[F_MULTI_MODE] ?? '') == 'vertical') { + $datePickerClassName = ' qfq-clear-me-multiform'; + } else { + $datePickerClassName = ' qfq-clear-me'; + } + } + $attribute .= Support::doAttribute('id', $formElement[FE_HTML_ID]); $attribute .= Support::doAttribute('name', $htmlFormElementName); - $attribute .= Support::doAttribute('class', 'form-control qfq-datepicker'); + $attribute .= Support::doAttribute('class', 'form-control '.$datePickerClassName); $attribute .= Support::doAttribute(ATTRIBUTE_DATA_REFERENCE, $formElement[FE_DATA_REFERENCE]); $showTime = ($formElement[FE_TYPE] == FE_TYPE_TIME || $formElement[FE_TYPE] == FE_TYPE_DATETIME) ? 1 : 0; @@ -3149,6 +3173,16 @@ abstract class AbstractBuildForm { } $value = Support::convertDateTime($value, $formElement[FE_DATE_FORMAT], $formElement[FE_SHOW_ZERO], $showTime, $formElement[FE_SHOW_SECONDS]); + // Browser needs own format to show date + if($dateTimePickerType === DATE_TIME_PICKER_BROWSER && $value !== '') { + $dateOldFormat = date_create($value); + if($formElement[FE_TYPE] === FE_TYPE_DATE) { + $value = date_format($dateOldFormat, "Y-m-d"); + } elseif($formElement[FE_TYPE] === FE_TYPE_DATETIME) { + $value = date_format($dateOldFormat, "Y-m-d H:i"); + } + } + $tmpPattern = $formElement[FE_CHECK_PATTERN]; // If bootstrap datetimepicker (date and datetime FE Type) is used, check pattern is not needed. Keep pattern for FE Type time. if ($formElement[FE_TYPE] != FE_TYPE_DATETIME && $formElement[FE_TYPE] != FE_TYPE_DATE && $formElement[FE_TYPE] != FE_TYPE_TIME) { @@ -3168,47 +3202,71 @@ abstract class AbstractBuildForm { throw new \UserFormException("Checktype not applicable for date/time: '" . $formElement[FE_CHECK_TYPE] . "'", ERROR_NOT_APPLICABLE); } + $tableColumnTypes = $this->store->getStore(STORE_TABLE_COLUMN_TYPES); // truncate if necessary if ($value != '' && $formElement[FE_MAX_LENGTH] > 0) { - $value = substr($value, 0, $formElement[FE_MAX_LENGTH]); + if($formElement[FE_TYPE] === FE_TYPE_TIME && $tableColumnTypes[$formElement[FE_NAME]] === DB_COLUMN_TYPE_DATETIME) { + $value = explode(' ', $value)[1]; + } else { + $value = substr($value, 0, $formElement[FE_MAX_LENGTH]); + } } - // See: https://project.math.uzh.ch/issues/3536 -// $type = $formElement[FE_TYPE]; -// if ($type === 'datetime') { -// $type = 'datetime-local'; -// } - $type = 'text'; // date|time|datetime|datetime-local are not appropriate - only I18n representation possible. + if($dateTimePickerType === DATE_TIME_PICKER_BROWSER) { + if($formElement[FE_TYPE] == FE_TYPE_DATE) { + $type = 'date'; + } elseif ($formElement[FE_TYPE] == FE_TYPE_TIME) { + $type = 'time'; + } else { + $type = 'datetime-local'; + } + } else { + // date|time|datetime|datetime-local are not appropriate - only I18n representation possible. + $type = 'text'; + } $attribute .= Support::doAttribute('type', $type); //Examples of accepted dateFormats: dd.MM.YYYY , DD.MM.YYYY, HH:mm(24h), hh:mm(12h AM PM) // Get dateformat default from T3 config and adjust it for datetimepicker because config default (dd.mm.yyyy) is not the default of bootstrap datetimepicker. $defaultDateFormat = $formElement[FE_DATE_FORMAT]; - if ($defaultDateFormat === 'dd.mm.yyyy' || $defaultDateFormat === 'yyyy-mm-dd') { - if ($formElement[FE_TYPE] == FE_TYPE_DATETIME) { - $defaultDateFormat = strtoupper($defaultDateFormat); - $defaultDateFormat .= ' HH:mm'; - } else { - $defaultDateFormat = strtoupper($defaultDateFormat); + if($dateTimePickerType === DATE_TIME_PICKER_QFQ) { + switch ($defaultDateFormat) { + case FORMAT_DATE_INTERNATIONAL: + case FORMAT_DATE_INTERNATIONAL_QFQ: + case FORMAT_DATE_GERMAN: + case FORMAT_DATE_GERMAN_QFQ: + if ($formElement[FE_TYPE] == FE_TYPE_DATETIME) { + $defaultDateFormat = strtoupper($defaultDateFormat); + $defaultDateFormat .= ' HH:mm'; + } else { + $defaultDateFormat = strtoupper($defaultDateFormat); + } + break; } + } elseif ($formElement[FE_TYPE] == FE_TYPE_DATETIME) { + $defaultDateFormat .= ' hh:mm'; } // if FE type datetime and showSeconds is set, corrected format is needed - if ($formElement[FE_TYPE] === FE_TYPE_DATETIME && $formElement[FE_SHOW_SECONDS] == 1 && $defaultDateFormat === 'DD.MM.YYYY HH:mm') { + if ($formElement[FE_TYPE] === FE_TYPE_DATETIME && $formElement[FE_SHOW_SECONDS] == 1) { $defaultDateFormat .= ':ss'; } // if FE type 'time' is used, overwrite defaultDateFormat if ($formElement[FE_TYPE] === FE_TYPE_TIME) { - if ($formElement[FE_DATE_FORMAT] === 'hh:mm' || $formElement[FE_DATE_FORMAT] === 'hh:mm:ss' || $formElement[FE_SHOW_SECONDS] == 1) { - if ($formElement[FE_DATE_FORMAT] === 'HH:mm:ss' || $formElement[FE_SHOW_SECONDS] == 1) { + if ($dateTimePickerType === DATE_TIME_PICKER_QFQ) { + if($formElement[FE_DATE_FORMAT] === 'HH:mm:ss' || $formElement[FE_SHOW_SECONDS] == 1) { $defaultDateFormat = 'HH:mm:ss'; } else { - $defaultDateFormat = 'hh:mm'; + $defaultDateFormat = 'HH:mm'; } } else { - $defaultDateFormat = 'HH:mm'; + if($formElement[FE_DATE_FORMAT] === 'hh:mm:ss' || $formElement[FE_SHOW_SECONDS] == 1) { + $defaultDateFormat = 'hh:mm:ss'; + } else { + $defaultDateFormat = 'hh:mm'; + } } } @@ -3217,7 +3275,6 @@ abstract class AbstractBuildForm { // convert enabled days from datetimepicker user input daysOfWeekEnabled to disabled days $enabledDays = explode(',', $formElement[FE_DATE_DAYS_OF_WEEK_ENABLED]); $disabledDays = ''; - $flagDayPoint = false; for ($i = 0; $i <= 6; $i++) { $flagDayPoint = false; @@ -3242,8 +3299,9 @@ abstract class AbstractBuildForm { $formElement[FE_DATE_DAYS_OF_WEEK_ENABLED] = '[' . $disabledDays . ']'; } - // convert 0|1 to false|true temporaerely, datetimepicker-bootstrap.js accepts only boolean. - $formElement[FE_INPUT_CLEAR_ME] = empty($formElement[FE_INPUT_CLEAR_ME]) ? 'false' : 'true'; + if($dateTimePickerType === DATE_TIME_PICKER_QFQ) { + $formElement[FE_INPUT_CLEAR_ME] = empty($formElement[FE_INPUT_CLEAR_ME]) ? 'false' : 'true'; + } // Add datepicker attributes $keyCount = 0; @@ -3294,6 +3352,24 @@ abstract class AbstractBuildForm { } // min and max works with input type: number, range, date, datetime-local, month, time and week + if($dateTimePickerType !== DATE_TIME_PICKER_QFQ) { + if($formElement[FE_TYPE] == FE_TYPE_DATE) { + $dateMinMaxFormat = "Y-m-d"; + } else { + $dateMinMaxFormat = "Y-m-d H:i"; + } + + if(isset($formElement[FE_MIN]) && $formElement[FE_MIN] !== '') { + $dateMin = date_create($formElement[FE_MIN]); + $formElement[FE_MIN] = date_format($dateMin, $dateMinMaxFormat); + } + + if(isset($formElement[FE_MAX]) && $formElement[FE_MAX] !== '') { + $dateMax = date_create($formElement[FE_MAX]); + $formElement[FE_MAX] = date_format($dateMax, $dateMinMaxFormat); + } + } + $attribute .= HelperFormElement::getAttributeList($formElement, [FE_MIN, FE_MAX]); $json = $this->getFormElementForJson($htmlFormElementName, $value, $formElement); diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index 03b6bc0e0..6de810957 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -552,6 +552,7 @@ const FORM_SUBMIT_LOG_MODE_ALL = 'all'; const FORM_SUBMIT_LOG_MODE_NONE = 'none'; const SYSTEM_DATE_FORMAT = 'dateFormat'; +const SYSTEM_DATE_TIME_PICKER_TYPE = 'dateTimePickerType'; const SYSTEM_REDIRECT_ALL_MAIL_TO = 'redirectAllMailTo'; const SYSTEM_THROW_GENERAL_ERROR = 'throwExceptionGeneralError'; @@ -1140,6 +1141,8 @@ const F_REST_TOKEN = 'restToken'; const CLIENT_REST_ID = '_id'; const CLIENT_REST_FORM = '_form'; +const F_DATE_TIME_PICKER_TYPE = SYSTEM_DATE_TIME_PICKER_TYPE; + const F_REMEMBER_LAST_PILL = SYSTEM_REMEMBER_LAST_PILL; // Form Columns: Only in form file @@ -1234,6 +1237,10 @@ const FE_DATE_VIEWMODE_DEFAULT = "dateViewModeDefault"; const FE_DATE_SHOW_CALENDAR_WEEKS = "dateShowCalendarWeeks"; const FE_DATE_CURRENT_DATETIME = "dateUseCurrentDatetime"; const FE_DATE_DATETIME_SIDE_SIDE_BY_SIDE = "datetimeSideBySide"; +const FE_DATE_TIME_PICKER_TYPE = F_DATE_TIME_PICKER_TYPE; +const DATE_TIME_PICKER_QFQ = 'qfq'; +const DATE_TIME_PICKER_BROWSER = 'browser'; +const DATE_TIME_PICKER_NO = 'no'; // FormElement Columns: Only in form file const FE_FILE_CONTAINER_NAME = 'containerName_ff'; // key for referencing container FormElements by name in form file @@ -1497,7 +1504,9 @@ const QUERY_TYPE_FAILED = 'type: query failed'; // Date/ DateTime formats const FORMAT_DATE_INTERNATIONAL = 'yyyy-mm-dd'; +const FORMAT_DATE_INTERNATIONAL_QFQ = 'YYYY-MM-DD'; const FORMAT_DATE_GERMAN = 'dd.mm.yyyy'; +const FORMAT_DATE_GERMAN_QFQ = 'DD.MM.YYYY'; // Upload const UPLOAD_MODE_UNCHANGED = 'unchanged'; @@ -1991,6 +2000,7 @@ const ENCRYPTION_IV = 'iv'; const ENCRYPTION_CIPHER_METHOD = 'cipherMethod'; const ENCRYPTION_CIPHERTEXT = 'ciphertext'; const DB_COLUMN_TYPE = 'type'; +const DB_COLUMN_TYPE_DATETIME = 'datetime'; const DB_COLUMN_LENGTH = 'length'; const DB_COLUMN_NAME = 'name'; const ENCRYPTION_CIPHER_METHOD_COLUMN_NAME = 'cipherMethodColumnName'; diff --git a/extension/Classes/Core/Helper/Support.php b/extension/Classes/Core/Helper/Support.php index b61fdcf9e..709a5b136 100644 --- a/extension/Classes/Core/Helper/Support.php +++ b/extension/Classes/Core/Helper/Support.php @@ -471,8 +471,8 @@ class Support { */ public static function dateTimeRegexp($type, $format, $timeIsOptional = '0') { - if ($format === FORMAT_DATE_GERMAN) { - // yyyy-mm-dd | 0000-00-00 + if (strtolower($format) == FORMAT_DATE_GERMAN) { + // dd.mm.yyyy | 00.00.0000 $date = '(([1-9]|0[1-9]|1[0-9]|2[0-9]|3[01])\.([1-9]|0[1-9]|1[012])\.([0-9]{4}|[0-9]{2})|00\.00\.(00){1,2})'; } else { // FORMAT_DATE_INTERNATIONAL: [d]d.[m]m.[yy]yy | 00.00.0000 @@ -569,9 +569,11 @@ class Support { switch ($dateFormat) { case FORMAT_DATE_INTERNATIONAL: + case FORMAT_DATE_INTERNATIONAL_QFQ: $newDate = sprintf("%04d-%02d-%02d", $arr[0], $arr[1], $arr[2]); break; case FORMAT_DATE_GERMAN: + case FORMAT_DATE_GERMAN_QFQ: $newDate = sprintf("%02d.%02d.%04d", $arr[2], $arr[1], $arr[0]); default: } diff --git a/extension/Classes/Core/Save.php b/extension/Classes/Core/Save.php index 8a12aa515..ae2290ef4 100644 --- a/extension/Classes/Core/Save.php +++ b/extension/Classes/Core/Save.php @@ -401,9 +401,14 @@ class Save { $newValues = array(); $tableColumns = array_keys($this->store->getStore(STORE_TABLE_COLUMN_TYPES)); + $tableColumnTypes = $this->store->getStore(STORE_TABLE_COLUMN_TYPES); $formValues = $this->store->getStore(STORE_FORM); $formValues = $this->createEmptyTemplateGroupElements($formValues); + $feColumnnTypes = array(); + foreach($this->feSpecNative as $fe) { + $feColumnnTypes[$fe['name']] = $fe['type']; + } // Iterate over all table.columns. Built an assoc array $newValues. foreach ($tableColumns as $column) { @@ -433,6 +438,11 @@ class Save { $this->store->setVar(SYSTEM_FORM_ELEMENT, "Column: $column", STORE_SYSTEM); + // Convert time to datetime if mysql column is datetime + if($tableColumnTypes[$column] === "datetime" && $feColumnnTypes[$column] === "time") { + $formValues[$column] = '0000-00-00 ' . $formValues[$column]; + } + // Check if an empty string has to be converted to null. if (isset($formValues[$column]) && $formValues[$column] == '' && $this->isSetEmptyMeansNull($column)) { $formValues[$column] = null; diff --git a/extension/Classes/Core/Store/FillStoreForm.php b/extension/Classes/Core/Store/FillStoreForm.php index 247708a82..bf083ca28 100644 --- a/extension/Classes/Core/Store/FillStoreForm.php +++ b/extension/Classes/Core/Store/FillStoreForm.php @@ -350,7 +350,7 @@ class FillStoreForm { if ($value !== '') { // do not check empty values $value = $this->doDateTime($formElement, $value); } - break; + break; default: if ($formElement[FE_TYPE] == FE_TYPE_EDITOR) { @@ -448,9 +448,35 @@ class FillStoreForm { */ public function doDateTime(array &$formElement, $value) { + // check for browser dateTimePickerType and adjust value + $typeBrowser = false; + $formName = $this->store::getVar(FORM_NAME_FORM, STORE_SIP); + $dbForm = new Database(); + $formArray = $dbForm->selectFormByName($formName); + HelperFormElement::explodeParameter($formArray, FE_PARAMETER); + + $dateTimePickerType = $this->store::getVar(SYSTEM_DATE_TIME_PICKER_TYPE, STORE_SYSTEM); + $dateTimePickerTypeForm = $formArray[F_DATE_TIME_PICKER_TYPE]; + $dateTimePickerTypeFe = $formElement[FE_DATE_TIME_PICKER_TYPE]; + + if(isset($dateTimePickerTypeForm) && $dateTimePickerTypeForm !== '') { + $dateTimePickerType = $dateTimePickerTypeForm; + } + + if(isset($dateTimePickerTypeFe) && $dateTimePickerTypeFe !== '') { + $dateTimePickerType = $dateTimePickerTypeFe; + } + if($dateTimePickerType === DATE_TIME_PICKER_BROWSER) { + $typeBrowser = true; + $datetimeArray = explode("T",$value,2); + if(preg_match("/^(?:2[0-3]|[01][0-9]):[0-5][0-9]$/", $datetimeArray[1])) { + $value = $datetimeArray[0]." ".$datetimeArray[1]; + } + } + $regexp = Support::dateTimeRegexp($formElement[FE_TYPE], $formElement[FE_DATE_FORMAT], $formElement[FE_TIME_IS_OPTIONAL] ?? ""); - if (1 !== preg_match('/' . $regexp . '/', $value, $matches)) { + if (1 !== preg_match('/' . $regexp . '/', $value, $matches) && !$typeBrowser) { $placeholder = Support::getDateTimePlaceholder($formElement); throw new \UserFormException("DateTime format not recognized: $placeholder / $value ", ERROR_DATE_TIME_FORMAT_NOT_RECOGNISED); } diff --git a/extension/ext_conf_template.txt b/extension/ext_conf_template.txt index 91b67fd00..6b4b605df 100644 --- a/extension/ext_conf_template.txt +++ b/extension/ext_conf_template.txt @@ -13,6 +13,9 @@ baseUrl = # cat=config/date; type=string; label=Date format:Default is 'dd.mm.yyyy'. Possible options: 'yyyy-mm-dd', 'dd.mm.yyyy' dateFormat = dd.mm.yyyy +# cat=config/date; type=string; label=Datetimepicker type:Default is 'qfq'. Possible options: 'no', 'browser', 'qfq' +dateTimePickerType = qfq + # cat=config/config; type=string; label=Thumbnail directory 'secure':Default is 'fileadmin/protected/qfqThumbnail'. Important: secure the directory (recursive) against direct access. Will be used by a special columnname '_thumbnail'. thumbnailDirSecure = fileadmin/protected/qfqThumbnail diff --git a/javascript/src/Form.js b/javascript/src/Form.js index faa08faa1..3b283a16f 100644 --- a/javascript/src/Form.js +++ b/javascript/src/Form.js @@ -52,6 +52,48 @@ var QfqNS = QfqNS || {}; // immediately, not only after loosing focus. Same goes for <textarea> this.$form.find("input, textarea").on("input paste", this.inputAndPasteHandler.bind(this)); + // Fire handler while using dateTimePickerType qfq + function getDatetimePickerChanges() { + $('div tbody').on('click', 'td.day:not(.disabled)', formObject.inputAndPasteHandler.bind(formObject)); + var timepickerElements = 'td a.btn[data-action="incrementHours"], td a.btn[data-action="incrementMinutes"], td a.btn[data-action="decrementHours"], td a.btn[data-action="decrementMinutes"]'; + $('div table').on('click', 'td.hour, td.minute, td a[data-action="clear"], '+timepickerElements, formObject.inputAndPasteHandler.bind(formObject)); + } + + // Function to trigger onfocus event again while element is already focused + function triggerFocus(element) { + var eventType = "onfocusin" in element ? "focusin" : "focus", + bubbles = "onfocusin" in element, + event; + + if ("createEvent" in document) { + event = document.createEvent("Event"); + event.initEvent(eventType, bubbles, true); + } + else if ("Event" in window) { + event = new Event(eventType, { bubbles: bubbles, cancelable: true }); + } + + element.focus(); + element.dispatchEvent(event); + } + + var formObject = this; + this.$form.find(".qfq-datepicker").on("click", function(e){ + triggerFocus(this); + getDatetimePickerChanges(); + }); + + // Fire handler while using dateTimePickerType browser + this.$form.find("input[type=datetime-local]").on("click", this.inputAndPasteHandler.bind(this)); + + // Use ctrl+z for saving form + document.addEventListener('keydown', function(event) { + if (event.ctrlKey && event.key === 'z') { + console.log("submit"); + $("#save-button:not([disabled=disabled])").click(); + } + }); + this.$form.on('submit', function (event) { event.preventDefault(); }); diff --git a/javascript/src/Main.js b/javascript/src/Main.js index 0a1907cc0..7ebe16c81 100644 --- a/javascript/src/Main.js +++ b/javascript/src/Main.js @@ -136,6 +136,7 @@ $(document).ready( function () { var dateArray = {}; var datesToFormat = ["minDate", "maxDate"]; var correctAttributeNames = ["mindate", "maxdate"]; + var onlyTime = false; for(var i = 0; i < datesToFormat.length; i++) { var date = false; if($(this).data(correctAttributeNames[i])) { @@ -144,13 +145,20 @@ $(document).ready( function () { if(cleanDate.includes('.')) { dateArray = cleanDate.split("."); date = dateArray[1] + "/" + dateArray[0] + "/" + dateArray[2]; - } else { + } else if(cleanDate.includes('-')){ dateArray = cleanDate.split("-"); date = dateArray[1] + "/" + dateArray[2] + "/" + dateArray[0]; + } else { + var today = new Date(); + var dd = String(today.getDate()).padStart(2, '0'); + var mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0! + var yyyy = today.getFullYear(); + date = mm + "/" + dd + "/" + yyyy + " " + cleanDate; + onlyTime = true; } if(cleanTime !== '' && cleanTime !== undefined) { date = date + " " + cleanTime; - } else if(correctAttributeNames[i] === "maxdate") { + } else if(correctAttributeNames[i] === "maxdate" && !onlyTime) { date = date + " 23:59:59"; } } @@ -167,7 +175,7 @@ $(document).ready( function () { showClear: ($(this).data("show-clear-button") !== undefined) ? $(this).data("show-clear-button") : true, calendarWeeks: ($(this).data("show-calendar-weeks") !== undefined) ? $(this).data("show-calendar-weeks") : false, useCurrent: ($(this).data("use-current-datetime") !== undefined) ? $(this).data("use-current-datetime") : false, - sideBySide: ($(this).data("datetime-side-by-side") !== undefined) ? $(this).data("datetime-side-by-side") : false, + sideBySide: ($(this).data("datetime-side-by-side") !== undefined) ? $(this).data("datetime-side-by-side") : true, }; var currentDatePicker = $(this).datetimepicker(options); -- GitLab