diff --git a/wire/modules/Inputfield/InputfieldDatetime/InputfieldDatetime.js b/wire/modules/Inputfield/InputfieldDatetime/InputfieldDatetime.js index 1edf55e0..ca042f4e 100644 --- a/wire/modules/Inputfield/InputfieldDatetime/InputfieldDatetime.js +++ b/wire/modules/Inputfield/InputfieldDatetime/InputfieldDatetime.js @@ -20,7 +20,6 @@ function InputfieldDatetimeDatepicker($t) { if(pickerVisible) { // datepicker always visible (inline) var $datepicker = $("
"); - //$t.parent('p').after($datepicker); $t.after($datepicker); } else { // datepicker doesn't appear till requested @@ -36,9 +35,18 @@ function InputfieldDatetimeDatepicker($t) { dateFormat: dateFormat, gotoCurrent: true, defaultDate: tsDate - // buttonImage: config.urls.admin_images + 'icons/calendar.gif', - // dateFormat: config.date_format }; + + var attrOptions = JSON.parse($t.attr('data-datepicker')); + + var customOptions = {}; + + if(typeof ProcessWire.config.InputfieldDatetimeDatepickerDefaults === 'object') { + options = $.extend({}, ProcessWire.config.InputfieldDatetimeDatepickerDefaults, options); + } + if(typeof ProcessWire.config.InputfieldDatetimeDatepickerOptions === 'object') { + customOptions = ProcessWire.config.InputfieldDatetimeDatepickerOptions; + } if(yearRange && yearRange.length) options.yearRange = yearRange; @@ -51,8 +59,10 @@ function InputfieldDatetimeDatepicker($t) { } if(timeFormat.indexOf('ss') > -1) options.showSecond = true; if(timeFormat.indexOf('m') == -1) options.showMinute = false; + options = $.extend(options, attrOptions, customOptions); $datepicker.datetimepicker(options); } else { + options = $.extend(options, attrOptions, customOptions); $datepicker.datepicker(options); } diff --git a/wire/modules/Inputfield/InputfieldDatetime/InputfieldDatetime.min.js b/wire/modules/Inputfield/InputfieldDatetime/InputfieldDatetime.min.js index 7648a4f0..3cdaf004 100644 --- a/wire/modules/Inputfield/InputfieldDatetime/InputfieldDatetime.min.js +++ b/wire/modules/Inputfield/InputfieldDatetime/InputfieldDatetime.min.js @@ -1 +1 @@ -function InputfieldDatetimeDatepicker($t){var pickerVisible=$t.is(".InputfieldDatetimeDatepicker2");var ts=parseInt($t.attr("data-ts"));var tsDate=null;var dateFormat=$t.attr("data-dateformat");var timeFormat=$t.attr("data-timeformat");var timeSelect=parseInt($t.attr("data-timeselect"));var hasTimePicker=timeFormat.length>0&&!pickerVisible;var showOn=$t.is(".InputfieldDatetimeDatepicker3")?"focus":"button";var ampm=parseInt($t.attr("data-ampm"))>0;var yearRange=$t.attr("data-yearrange");if(ts>1)tsDate=new Date(ts);if(pickerVisible){var $datepicker=$("");$t.after($datepicker)}else{var $datepicker=$t}var options={changeMonth:true,changeYear:true,showOn:showOn,buttonText:">",showAnim:"fadeIn",dateFormat:dateFormat,gotoCurrent:true,defaultDate:tsDate};if(yearRange&&yearRange.length)options.yearRange=yearRange;if(hasTimePicker){options.ampm=ampm;options.timeFormat=timeFormat;if(timeSelect>0){options.controlType="select";options.oneLine=true}if(timeFormat.indexOf("ss")>-1)options.showSecond=true;if(timeFormat.indexOf("m")==-1)options.showMinute=false;$datepicker.datetimepicker(options)}else{$datepicker.datepicker(options)}if(pickerVisible){$datepicker.on("change",function(e){var d=$datepicker.datepicker("getDate");var str=$.datepicker.formatDate(dateFormat,d);$t.val(str)})}if(showOn=="button"){var $button=$t.next("button.ui-datepicker-trigger");if($button.length){var $a=$("");$button.after($a).hide();$a.on("click",function(){$button.trigger("click");return false})}}$t.addClass("initDatepicker")}function InputfieldDatetimeSelect(){function validate($select){var $parent=$select.parent(),$month=$parent.children(".InputfieldDatetimeMonth"),month=parseInt($month.val()),$day=$parent.children(".InputfieldDatetimeDay"),day=parseInt($day.val()),$year=$parent.children(".InputfieldDatetimeYear"),year=parseInt($year.val()),$value=$parent.children(".InputfieldDatetimeValue"),date=month&&day&&year?new Date(year,month-1,day):null,errorClass="InputfieldDatetimeError";if(date&&date.getMonth()+1!=month){day="";$day.val("").addClass(errorClass)}else{$day.removeClass(errorClass)}$value.val(date&&day?year+"-"+month+"-"+day:"")}function yearChange($select){var value=$select.val();if(value!=="-"&&value!=="+")return;var $blankOption=$select.find('option[value=""]'),$option=$select.find('option[value="'+value+'"]'),fromYear=parseInt($select.attr("data-from-year")),toYear=parseInt($select.attr("data-to-year")),numYears=toYear-fromYear,n=0,$o;if(numYears<10)numYears=10;if(value==="-"){toYear=fromYear-1;fromYear=fromYear-numYears;for(n=toYear;n>=fromYear;n--){$o=jQuery("").val(n).text(n);$select.prepend($o)}$option.html("< "+fromYear);$select.prepend($option).prepend($blankOption);$select.val(toYear);$select.attr("data-from-year",fromYear)}else if(value==="+"){fromYear=toYear+1;toYear+=numYears;for(n=fromYear;n<=toYear;n++){$o=$("").val(n).text(n);$select.append($o)}$option.html("> "+toYear);$select.append($option);$select.val(fromYear);$select.attr("data-to-year",toYear)}}jQuery(document).on("change",".InputfieldDatetimeSelect select",function(){var $select=jQuery(this);if($select.hasClass("InputfieldDatetimeYear"))yearChange($select);validate($select)})}jQuery(document).ready(function($){$("input.InputfieldDatetimeDatepicker:not(.InputfieldDatetimeDatepicker3):not(.initDatepicker)").each(function(n){InputfieldDatetimeDatepicker($(this))});$(document).on("focus","input.InputfieldDatetimeDatepicker3:not(.hasDatepicker)",function(){InputfieldDatetimeDatepicker($(this))});InputfieldDatetimeSelect()}); \ No newline at end of file +function InputfieldDatetimeDatepicker($t){var pickerVisible=$t.is(".InputfieldDatetimeDatepicker2");var ts=parseInt($t.attr("data-ts"));var tsDate=null;var dateFormat=$t.attr("data-dateformat");var timeFormat=$t.attr("data-timeformat");var timeSelect=parseInt($t.attr("data-timeselect"));var hasTimePicker=timeFormat.length>0&&!pickerVisible;var showOn=$t.is(".InputfieldDatetimeDatepicker3")?"focus":"button";var ampm=parseInt($t.attr("data-ampm"))>0;var yearRange=$t.attr("data-yearrange");if(ts>1)tsDate=new Date(ts);if(pickerVisible){var $datepicker=$("");$t.after($datepicker)}else{var $datepicker=$t}var options={changeMonth:true,changeYear:true,showOn:showOn,buttonText:">",showAnim:"fadeIn",dateFormat:dateFormat,gotoCurrent:true,defaultDate:tsDate};var attrOptions=JSON.parse($t.attr("data-datepicker"));var customOptions={};if(typeof ProcessWire.config.InputfieldDatetimeDatepickerDefaults==="object"){options=$.extend({},ProcessWire.config.InputfieldDatetimeDatepickerDefaults,options)}if(typeof ProcessWire.config.InputfieldDatetimeDatepickerOptions==="object"){customOptions=ProcessWire.config.InputfieldDatetimeDatepickerOptions}if(yearRange&&yearRange.length)options.yearRange=yearRange;if(hasTimePicker){options.ampm=ampm;options.timeFormat=timeFormat;if(timeSelect>0){options.controlType="select";options.oneLine=true}if(timeFormat.indexOf("ss")>-1)options.showSecond=true;if(timeFormat.indexOf("m")==-1)options.showMinute=false;options=$.extend(options,attrOptions,customOptions);$datepicker.datetimepicker(options)}else{options=$.extend(options,attrOptions,customOptions);$datepicker.datepicker(options)}if(pickerVisible){$datepicker.on("change",function(e){var d=$datepicker.datepicker("getDate");var str=$.datepicker.formatDate(dateFormat,d);$t.val(str)})}if(showOn=="button"){var $button=$t.next("button.ui-datepicker-trigger");if($button.length){var $a=$("");$button.after($a).hide();$a.on("click",function(){$button.trigger("click");return false})}}$t.addClass("initDatepicker")}function InputfieldDatetimeSelect(){function validate($select){var $parent=$select.parent(),$month=$parent.children(".InputfieldDatetimeMonth"),month=parseInt($month.val()),$day=$parent.children(".InputfieldDatetimeDay"),day=parseInt($day.val()),$year=$parent.children(".InputfieldDatetimeYear"),year=parseInt($year.val()),$value=$parent.children(".InputfieldDatetimeValue"),date=month&&day&&year?new Date(year,month-1,day):null,errorClass="InputfieldDatetimeError";if(date&&date.getMonth()+1!=month){day="";$day.val("").addClass(errorClass)}else{$day.removeClass(errorClass)}$value.val(date&&day?year+"-"+month+"-"+day:"")}function yearChange($select){var value=$select.val();if(value!=="-"&&value!=="+")return;var $blankOption=$select.find('option[value=""]'),$option=$select.find('option[value="'+value+'"]'),fromYear=parseInt($select.attr("data-from-year")),toYear=parseInt($select.attr("data-to-year")),numYears=toYear-fromYear,n=0,$o;if(numYears<10)numYears=10;if(value==="-"){toYear=fromYear-1;fromYear=fromYear-numYears;for(n=toYear;n>=fromYear;n--){$o=jQuery("").val(n).text(n);$select.prepend($o)}$option.html("< "+fromYear);$select.prepend($option).prepend($blankOption);$select.val(toYear);$select.attr("data-from-year",fromYear)}else if(value==="+"){fromYear=toYear+1;toYear+=numYears;for(n=fromYear;n<=toYear;n++){$o=$("").val(n).text(n);$select.append($o)}$option.html("> "+toYear);$select.append($option);$select.val(fromYear);$select.attr("data-to-year",toYear)}}jQuery(document).on("change",".InputfieldDatetimeSelect select",function(){var $select=jQuery(this);if($select.hasClass("InputfieldDatetimeYear"))yearChange($select);validate($select)})}jQuery(document).ready(function($){$("input.InputfieldDatetimeDatepicker:not(.InputfieldDatetimeDatepicker3):not(.initDatepicker)").each(function(n){InputfieldDatetimeDatepicker($(this))});$(document).on("focus","input.InputfieldDatetimeDatepicker3:not(.hasDatepicker)",function(){InputfieldDatetimeDatepicker($(this))});InputfieldDatetimeSelect()}); \ No newline at end of file diff --git a/wire/modules/Inputfield/InputfieldDatetime/InputfieldDatetime.module b/wire/modules/Inputfield/InputfieldDatetime/InputfieldDatetime.module index f4c1bfd8..013c2456 100644 --- a/wire/modules/Inputfield/InputfieldDatetime/InputfieldDatetime.module +++ b/wire/modules/Inputfield/InputfieldDatetime/InputfieldDatetime.module @@ -8,7 +8,7 @@ * For documentation about the fields used in this class, please see: * /wire/core/Fieldtype.php * - * ProcessWire 3.x, Copyright 2023 by Ryan Cramer + * ProcessWire 3.x, Copyright 2024 by Ryan Cramer * https://processwire.com * * ~~~~~~ @@ -52,6 +52,13 @@ * @property string $dateInputFormat Date input format to use, see WireDateTime::$dateFormats (default='Y-m-d') * @property string $timeInputFormat Time input format to use, see WireDateTime::$timeFormats (default='') * @property string $placeholder Placeholder attribute text + * @property string $showAnim Animation type (default='fade') + * @property bool|int $changeMonth Show a select dropdown to allow changing month? (default=true) + * @property bool|int $changeYear Show a select dropdown to allow changing year? (default=true) + * @property bool|int $showButtonPanel Show "Today" and "Done" buttons under the calendar? (default=false) + * @property int $numberOfMonths Number of month calendars to show together side-by-sidee (default=1) + * @property bool|int $showMonthAfterYear Show the month after the year? (default=false) + * @property bool|int $showOtherMonths Show dates in other months (non-selectable) at the start or end of the current month? (default=false) * * Properties specific to "html" input type * ======================================== @@ -80,7 +87,7 @@ class InputfieldDatetime extends Inputfield { return array( 'title' => __('Datetime', __FILE__), // Module Title 'summary' => __('Inputfield that accepts date and optionally time', __FILE__), // Module Summary - 'version' => 107, + 'version' => 108, 'permanent' => true, ); } @@ -126,7 +133,14 @@ class InputfieldDatetime extends Inputfield { * */ protected $inputTypes = array(); - + + /** + * jQuery UI custom datepicker options set from datepickerOptions() method + * + * @var array + * + */ + protected $datepickerOptions = array(); /** * Initialize the date/time inputfield @@ -356,6 +370,37 @@ class InputfieldDatetime extends Inputfield { return parent::setAttribute($key, $value); } + /** + * Get or set jQuery UI datepicker options + * + *