jquery-grid
Version:
jQuery Grid by Gijgo.com is a plug-in for the jQuery Javascript library. It is a very fast and extandable datagrid, and will add advanced interaction controls to any HTML table. This plugin has build-in integration with Bootstrap and Material Design. Free
323 lines (273 loc) • 13.7 kB
JavaScript
/*
* Gijgo DateTimePicker v1.9.13
* http://gijgo.com/datetimepicker
*
* Copyright 2014, 2019 gijgo.com
* Released under the MIT license
*/
/* global window alert jQuery gj */
/**
*/
gj.datetimepicker = {
plugins: {},
messages: {
'en-us': {
}
}
};
gj.datetimepicker.config = {
base: {
/** The datepicker configuration options. Valid only for datepicker specific configuration options.
*/
datepicker: gj.datepicker.config.base,
timepicker: gj.timepicker.config.base,
/** The name of the UI library that is going to be in use.
*/
uiLibrary: 'materialdesign',
/** The initial datetimepicker value.
*/
value: undefined,
/** Specifies the format, which is used to format the value of the DatePicker displayed in the input.
*/
format: 'HH:MM mm/dd/yyyy',
/** The width of the datetimepicker.
*/
width: undefined,
/** If set to true, the datetimepicker will have modal behavior.
*/
modal: false,
/** If set to true, add footer with ok and cancel buttons to the datetimepicker.
*/
footer: false,
/** The size of the datetimepicker input.
*/
size: 'default',
/** The language that needs to be in use.
*/
locale: 'en-us',
icons: {},
style: {
calendar: 'gj-picker gj-picker-md datetimepicker gj-unselectable'
}
},
bootstrap: {
style: {
calendar: 'gj-picker gj-picker-bootstrap datetimepicker gj-unselectable'
},
iconsLibrary: 'glyphicons'
},
bootstrap4: {
style: {
calendar: 'gj-picker gj-picker-bootstrap datetimepicker gj-unselectable'
}
}
};
gj.datetimepicker.methods = {
init: function (jsConfig) {
gj.widget.prototype.init.call(this, jsConfig, 'datetimepicker');
this.attr('data-datetimepicker', 'true');
gj.datetimepicker.methods.initialize(this);
return this;
},
getConfig: function (clientConfig, type) {
var config = gj.widget.prototype.getConfig.call(this, clientConfig, type);
uiLibrary = clientConfig.hasOwnProperty('uiLibrary') ? clientConfig.uiLibrary : config.uiLibrary;
if (gj.datepicker.config[uiLibrary]) {
$.extend(true, config.datepicker, gj.datepicker.config[uiLibrary]);
}
if (gj.timepicker.config[uiLibrary]) {
$.extend(true, config.timepicker, gj.timepicker.config[uiLibrary]);
}
iconsLibrary = clientConfig.hasOwnProperty('iconsLibrary') ? clientConfig.iconsLibrary : config.iconsLibrary;
if (gj.datepicker.config[iconsLibrary]) {
$.extend(true, config.datepicker, gj.datepicker.config[iconsLibrary]);
}
if (gj.timepicker.config[iconsLibrary]) {
$.extend(true, config.timepicker, gj.timepicker.config[iconsLibrary]);
}
return config;
},
initialize: function ($datetimepicker) {
var $picker, $header, $date, $time, date,
$switch, $calendarMode, $clockMode,
data = $datetimepicker.data();
// Init datepicker
data.datepicker.uiLibrary = data.uiLibrary;
data.datepicker.iconsLibrary = data.iconsLibrary;
data.datepicker.width = data.width;
data.datepicker.format = data.format;
data.datepicker.locale = data.locale;
data.datepicker.modal = data.modal;
data.datepicker.footer = data.footer;
data.datepicker.style.calendar = data.style.calendar;
data.datepicker.value = data.value;
data.datepicker.size = data.size;
data.datepicker.autoClose = false;
gj.datepicker.methods.initialize($datetimepicker, data.datepicker);
$datetimepicker.on('select', function (e, type) {
var date, value;
if (type === 'day') {
gj.datetimepicker.methods.createShowHourHandler($datetimepicker, $picker, data)();
} else if (type === 'minute') {
if ($picker.attr('selectedDay') && data.footer !== true) {
selectedDay = $picker.attr('selectedDay').split('-');
date = new Date(selectedDay[0], selectedDay[1], selectedDay[2], $picker.attr('hour') || 0, $picker.attr('minute') || 0);
value = gj.core.formatDate(date, data.format, data.locale);
$datetimepicker.val(value);
gj.datetimepicker.events.change($datetimepicker);
gj.datetimepicker.methods.close($datetimepicker);
}
}
});
$datetimepicker.on('open', function () {
var $header = $picker.children('[role="header"]');
$header.find('[role="calendarMode"]').addClass("selected");
$header.find('[role="clockMode"]').removeClass("selected");
});
$picker = $('body').find('[role="calendar"][guid="' + $datetimepicker.attr('data-guid') + '"]');
date = data.value ? gj.core.parseDate(data.value, data.format, data.locale) : new Date();
$picker.attr('hour', date.getHours());
$picker.attr('minute', date.getMinutes());
// Init timepicker
data.timepicker.uiLibrary = data.uiLibrary;
data.timepicker.iconsLibrary = data.iconsLibrary;
data.timepicker.format = data.format;
data.timepicker.locale = data.locale;
data.timepicker.header = true;
data.timepicker.footer = data.footer;
data.timepicker.size = data.size;
data.timepicker.mode = '24hr';
data.timepicker.autoClose = false;
// Init header
$header = $('<div role="header" />');
$date = $('<div role="date" class="selected" />');
$date.on('click', gj.datetimepicker.methods.createShowDateHandler($datetimepicker, $picker, data));
$date.html(gj.core.formatDate(new Date(), 'ddd, mmm dd', data.locale));
$header.append($date);
$switch = $('<div role="switch"></div>');
$calendarMode = $('<i class="gj-icon selected" role="calendarMode">event</i>');
$calendarMode.on('click', gj.datetimepicker.methods.createShowDateHandler($datetimepicker, $picker, data));
$switch.append($calendarMode);
$time = $('<div role="time" />');
$time.append($('<div role="hour" />').on('click', gj.datetimepicker.methods.createShowHourHandler($datetimepicker, $picker, data)).html(gj.core.formatDate(new Date(), 'HH', data.locale)));
$time.append(':');
$time.append($('<div role="minute" />').on('click', gj.datetimepicker.methods.createShowMinuteHandler($datetimepicker, $picker, data)).html(gj.core.formatDate(new Date(), 'MM', data.locale)));
$switch.append($time);
$clockMode = $('<i class="gj-icon" role="clockMode">clock</i>');
$clockMode.on('click', gj.datetimepicker.methods.createShowHourHandler($datetimepicker, $picker, data));
$switch.append($clockMode);
$header.append($switch);
$picker.prepend($header);
},
createShowDateHandler: function ($datetimepicker, $picker, data) {
return function (e) {
var $header = $picker.children('[role="header"]');
$header.find('[role="calendarMode"]').addClass("selected");
$header.find('[role="date"]').addClass("selected");
$header.find('[role="clockMode"]').removeClass("selected");
$header.find('[role="hour"]').removeClass("selected");
$header.find('[role="minute"]').removeClass("selected");
gj.datepicker.methods.renderMonth($datetimepicker, $picker, data.datepicker);
};
},
createShowHourHandler: function ($datetimepicker, $picker, data) {
return function () {
var $header = $picker.children('[role="header"]');
$header.find('[role="calendarMode"]').removeClass("selected");
$header.find('[role="date"]').removeClass("selected");
$header.find('[role="clockMode"]').addClass("selected");
$header.find('[role="hour"]').addClass("selected");
$header.find('[role="minute"]').removeClass("selected");
gj.timepicker.methods.initMouse($picker.children('[role="body"]'), $datetimepicker, $picker, data.timepicker);
gj.timepicker.methods.renderHours($datetimepicker, $picker, data.timepicker);
};
},
createShowMinuteHandler: function ($datetimepicker, $picker, data) {
return function () {
var $header = $picker.children('[role="header"]');
$header.find('[role="calendarMode"]').removeClass("selected");
$header.find('[role="date"]').removeClass("selected");
$header.find('[role="clockMode"]').addClass("selected");
$header.find('[role="hour"]').removeClass("selected");
$header.find('[role="minute"]').addClass("selected");
gj.timepicker.methods.initMouse($picker.children('[role="body"]'), $datetimepicker, $picker, data.timepicker);
gj.timepicker.methods.renderMinutes($datetimepicker, $picker, data.timepicker);
};
},
close: function ($datetimepicker) {
var $calendar = $('body').find('[role="calendar"][guid="' + $datetimepicker.attr('data-guid') + '"]');
$calendar.hide();
$calendar.closest('div[role="modal"]').hide();
//gj.datepicker.events.close($datepicker);
},
value: function ($datetimepicker, value) {
var $calendar, date, hour, data = $datetimepicker.data();
if (typeof (value) === "undefined") {
return $datetimepicker.val();
} else {
date = gj.core.parseDate(value, data.format, data.locale);
if (date) {
$calendar = $('body').find('[role="calendar"][guid="' + $datetimepicker.attr('data-guid') + '"]');
gj.datepicker.methods.dayClickHandler($datetimepicker, $calendar, data, date)();
// Set Time
hour = date.getHours();
if (data.mode === 'ampm') {
$calendar.attr('mode', hour > 12 ? 'pm' : 'am');
}
$calendar.attr('hour', hour);
$calendar.attr('minute', date.getMinutes());
$datetimepicker.val(value);
} else {
$datetimepicker.val('');
}
return $datetimepicker;
}
},
destroy: function ($datetimepicker) {
var data = $datetimepicker.data(),
$parent = $datetimepicker.parent(),
$picker = $('body').find('[role="calendar"][guid="' + $datetimepicker.attr('data-guid') + '"]');
if (data) {
$datetimepicker.off();
if ($picker.parent('[role="modal"]').length > 0) {
$picker.unwrap();
}
$picker.remove();
$datetimepicker.removeData();
$datetimepicker.removeAttr('data-type').removeAttr('data-guid').removeAttr('data-datetimepicker');
$datetimepicker.removeClass();
$parent.children('[role="right-icon"]').remove();
$datetimepicker.unwrap();
}
return $datetimepicker;
}
};
gj.datetimepicker.events = {
/**
* Fires when the datetimepicker value changes as a result of selecting a new value.
*
*/
change: function ($datetimepicker) {
return $datetimepicker.triggerHandler('change');
}
};
gj.datetimepicker.widget = function ($element, jsConfig) {
var self = this,
methods = gj.datetimepicker.methods;
self.mouseMove = false;
/** Gets or sets the value of the datetimepicker.
*/
self.value = function (value) {
return methods.value(this, value);
};
/** Open the calendar.
*/
self.open = function () {
gj.datepicker.methods.open(this, this.data().datepicker);
};
/** Close the calendar.
*/
self.close = function () {
gj.datepicker.methods.close(this);
};
/** Remove datetimepicker functionality from the element.
*/
self.destroy = function () {
return methods.destroy(this);
};
$.extend($element, self);
if ('true' !== $element.attr('data-datetimepicker')) {
methods.init.call($element, jsConfig);
}
return $element;
};
gj.datetimepicker.widget.prototype = new gj.widget();
gj.datetimepicker.widget.constructor = gj.datetimepicker.widget;
gj.datetimepicker.widget.prototype.getConfig = gj.datetimepicker.methods.getConfig;
(function ($) {
$.fn.datetimepicker = function (method) {
var $widget;
if (this && this.length) {
if (typeof method === 'object' || !method) {
return new gj.datetimepicker.widget(this, method);
} else {
$widget = new gj.datetimepicker.widget(this, null);
if ($widget[method]) {
return $widget[method].apply(this, Array.prototype.slice.call(arguments, 1));
} else {
throw 'Method ' + method + ' does not exist.';
}
}
}
};
})(jQuery);