const yearPickerVersion = "1.0.0"; const yearPickerAppName = "YearPicker"; var defaults = { // Auto Hide autoHide: true, // The Initial Date year: null, // Start Date startYear: null, // End Date endYear: null, // A element tag items itemTag: "li", //css class selected date item selectedClass: "selected", // css class disabled disabledClass: "disabled", hideClass: "hide", highlightedClass: "highlighted", template: `
SelectedYear
`, // Event shortcuts show: null, hide: null, pick: null }; var window = typeof window !== "undefained" ? window : {}; var event_click = "click."; var event_focus = "focus."; var event_keyup = "keyup."; var event_selected = "selected."; var event_show = "show."; var event_hide = "hide."; var methods = { // Show datepicker showView: function showView() { if (!this.build) { this.init(); } if (this.show) { return; } if (this.trigger(event_show).isDefaultPrevented()) { return; } this.show = true; var $template = this.$template, options = this.options; $template .removeClass(options.hideClass) .on(event_click, $.proxy(this.click, this)); $(document).on( event_click, (this.onGlobalClick = proxy(this.globalClick, this)) ); this.place(); }, // Hide the datepicker hideView: function hideView() { if (!this.show) { return; } if (this.trigger(event_hide).isDefaultPrevented()) { return; } var $template = this.$template, options = this.options; $template.addClass(options.hideClass).off(event_click, this.click); $(document).off(event_click, this.onGlobalClick); this.show = false; }, // toggle show and hide toggle: function toggle() { if (this.show) { this.hideView(); } else { this.show(); } }, setStartYear: function setStartYear(year) { this.startYear = year; if (this.build) { this.render(); } }, setEndYear: function setEndYear(year) { this.endYear = year; if (this.build) { this.render(); } } }; var handlers = { click: function click(e) { var $target = $(e.target); var options = this.options; var viewYear = this.viewYear; if ($target.hasClass("disabled")) { return; } var view = $target.data("view"); switch (view) { case "yearpicker-prev": var year = viewYear - 12; this.viewYear = year; this.renderYear(); break; case "yearpicker-next": var year = viewYear + 12; this.viewYear = year; this.renderYear(); break; case "yearpicker-items": this.year = parseInt($target.html()); this.renderYear(); this.hideView(); break; default: break; } }, globalClick: function globalClick(_ref) { var target = _ref.target; var element = this.element; var hidden = true; if (target !== document) { while ( target === element || $(target).closest(".yearpicker-header").length === 1 ) { hidden = false; break; } target = target.parentNode; } if (hidden) { this.hideView(); } } }; var render = { renderYear: function renderYear() { var options = this.options, startYear = options.startYear, endYear = options.endYear; var disabledClass = options.disabledClass; // viewed year in the calenter var viewYear = this.viewYear; // selected year var selectedYear = this.year; var now = new Date(); // current year var thisYear = now.getFullYear(); var start = -5; var end = 6; var items = []; var prevDisabled = false; var nextDisabled = false; var i = void 0; for (i = start; i <= end; i++) { var year = viewYear + i; var disabled = false; if (startYear) { disabled = year < startYear; if (i === start) { prevDisabled = disabled; } } if (!disabled && endYear) { disabled = year > endYear; if (i === end) { nextDisabled = disabled; } } // check for this is a selected year var isSelectedYear = year === selectedYear; var view = isSelectedYear ? "yearpicker-items" : "yearpicker-items"; items.push( this.createItem({ selected: isSelectedYear, disabled: disabled, text: viewYear + i, //view: disabled ? "yearpicker disabled" : view, view: disabled ? "yearpicker-items disabled" : view, highlighted: year === thisYear }) ); } this.yearsPrev.toggleClass(disabledClass, prevDisabled); this.yearsNext.toggleClass(disabledClass, nextDisabled); this.yearsCurrent.html(selectedYear); this.yearsBody.html(items.join(" ")); this.setValue(); } }; function isString(value) { return typeof value === "string"; } function isNumber(value) { return typeof value === "number" && value !== "NaN"; } function isUndefained(value) { return typeof value === "undefined"; } function proxy(fn, context) { for ( var len = arguments.length, args = Array(len > 2 ? len - 2 : 0), key = 2; key < len; key++ ) { args[key - 2] = arguments[key]; } return function() { for ( var len2 = arguments.length, args2 = Array(len2), key2 = 0; key2 < len2; key2++ ) { args2[key2] = arguments[key2]; } return fn.apply(context, args.concat(args2)); }; } ("use strict"); var _setupError = "YearPicker Error"; if (isUndefained(jQuery)) { alert(`${yearPickerAppName} ${yearPickerVersion} requires jQuery`); } var classCheck = function(instance, constractor) { if (!(instance instanceof constractor)) { alert("cannot call a class as instance of function!!!"); } }; var class_top_left = yearPickerAppName + "-top-left"; var class_top_right = yearPickerAppName + "-top-right"; var class_bottom_left = yearPickerAppName + "-bottom-left"; var class_bottom_right = yearPickerAppName + "-bottom-right"; var class_placements = [ class_top_left, class_top_right, class_bottom_left, class_bottom_right ].join(" "); var Yearpicker = (function() { function Yearpicker(element) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; classCheck(this, Yearpicker); this.$element = $(element); this.element = element; this.options = $.extend({}, defaults, options); this.build = false; this.show = false; this.startYear = null; this.endYear = null; this.create(); } // yearpicker Yearpicker.prototype = { create: function() { var $this = this.$element, options = this.options; var startYear = options.startYear, endYear = options.endYear, year = options.year; //this.trigger = $(options.trigger); this.isInput = $this.is("input") || $this.is("textarea"); initialValue = this.getValue(); this.initialValue = initialValue; this.oldValue = initialValue; year = year || initialValue || new Date().getFullYear(); if (startYear) { if (year < startYear) { year = startYear; } this.startYear = startYear; } if (endYear) { if (year > endYear) { year = endYear; } this.endYear = endYear; } this.year = year; this.viewYear = year; this.initialYear = year; this.bind(); this.init(); }, init: function() { if (this.build) { return; } this.build = true; var $this = this.$element, options = this.options; var $template = $(options.template); this.$template = $template; this.yearsPrev = $template.find(".yearpicker-prev"); this.yearsCurrent = $template.find(".yearpicker-current"); this.yearsNext = $template.find(".yearpicker-next"); this.yearsBody = $template.find(".yearpicker-year"); $template.addClass(options.hideClass); $(document.body).append( $template.addClass(yearPickerAppName + "-dropdown") ); this.renderYear(); }, unbuild: function() { if (!this.build) { return; } this.build = false; this.$template.remove(); }, // assign a events bind: function() { var $this = this.$element, options = this.options; if ($.isFunction(options.show)) { $this.on(event_show, options.show); } if ($.isFunction(options.hide)) { $this.on(event_hide, options.hide); } if ($.isFunction(options.click)) { $this.on(event_click, options.click); } if (this.isInput) { $this.on(event_focus, $.proxy(this.showView, this)); } else { $this.on(event_click, $.proxy(this.showView, this)); } }, getValue: function() { var $this = this.$element; var value = this.isInput ? $this.val() : $this.text(); value = parseInt(value); return this.isInput ? parseInt($this.val()) : $this.text(); }, setValue: function() { var $this = this.$element; var value = this.year; if (this.isInput) { $this.val(value); } else { $this.html(value); } }, trigger: function(type, data) { var e = $.Event(type, data); this.$element.trigger(e); return e; }, place: function() { var $this = this.$element, options = this.options, $template = this.$template; var containerWidth = $(document).outerWidth(), containerHeight = $(document).outerHeight(), elementWidth = $this.outerWidth(), elementHeight = $this.outerHeight(), width = $template.width(), height = $template.height(); var elementOffset = $this.offset(), top = elementOffset.top, left = elementOffset.left; var offset = parseFloat(options.offset); var placements = class_top_left; offset = isNaN(offset) ? 10 : offset; // positioning the y axis if (top > height && top + elementHeight + height > containerHeight) { top -= height + offset; placements = class_bottom_left; } else { top += elementHeight + offset; } // positioning the x axis if (left + width > containerWidth) { left += elementWidth - width; placements = placements.replace("left", "right"); } $template .removeClass(class_placements) .addClass(placements) .css({ top: top, left: left, zIndex: parseInt(this.zIndex, 10) }); }, createItem: function(data) { var options = this.options; var itemTag = options.itemTag; var items = { text: "", view: "", selected: false, disabled: false, highlighted: false }; var classes = []; $.extend(items, data); if (items.selected) { classes.push(options.selectedClass); } if (items.disabled) { classes.push(options.disabledClass); } if (items.highlighted) { classes.push(options.highlightedClass); } return `<${itemTag} class="${items.view} ${classes.join( " " )}" data-view="${items.view}">${items.text}`; } }; return Yearpicker; })(); if ($.extend) { $.extend(Yearpicker.prototype, methods, render, handlers); } if ($.fn) { $.fn.yearpicker = function jQueryYearpicker(option) { for ( var len = arguments.length, args = Array(len > 1 ? len - 1 : 0), key = 1; key < len; key++ ) { args[key - 1] = arguments[key]; } var result = void 0; this.each(function(i, element) { var $element = $(element); var isDestory = option === "destroy"; var yearpicker = $element.data(yearPickerAppName); if (!yearpicker) { if (isDestory) { return; } var options = $.extend( {}, $element.data(), $.isPlainObject(option) && option ); yearpicker = new Yearpicker(element, options); $element.data(yearPickerAppName, yearpicker); } if (isString(option)) { var fn = yearpicker[option]; if ($.isFunction(fn)) { result = fn.apply(yearpicker, args); if (isDestory) { $element.removeData(yearPickerAppName); } } } }); return !isUndefained(result) ? result : this; }; $.fn.yearpicker.constractor = Yearpicker; }