kahuna/public/js/components/gu-date-range/gu-date-range.js (150 lines of code) (raw):
import angular from 'angular';
import moment from 'moment';
import Pikaday from 'pikaday';
import 'pikaday/css/pikaday.css';
import template from './gu-date-range.html';
import './gu-date-range.css';
import './pikaday-override.css';
export var guDateRange = angular.module('gu-dateRange', []);
guDateRange.controller('GuDateRangeCtrl', [function () {
function getDateISOString (val) {
return angular.isDefined(val) ? moment(val).toISOString() : undefined;
}
const ctrl = this;
ctrl.$onInit = () => {
ctrl.trackingName = 'Date Picker';
ctrl.setDateRangeForDisplay = function () {
ctrl.guDisplayStartDate = angular.isDefined(ctrl.guStartDate) ?
moment(ctrl.guStartDate).format(ctrl.guDateFormat) :
ctrl.guAnyTimeText;
ctrl.guDisplayEndDate = angular.isDefined(ctrl.guEndDate) ?
moment(ctrl.guEndDate).format(ctrl.guDateFormat) :
undefined;
ctrl.guDisplayField = ctrl.guSelectedField;
};
ctrl.setDateRange = function (start, end) {
ctrl.guStartDate = getDateISOString(start);
ctrl.guEndDate = getDateISOString(end);
ctrl.guSelectedField = ctrl.guDisplayField;
};
ctrl.closeOverlay = () => {
ctrl.showOverlay = false;
};
ctrl.save = function (start, end) {
ctrl.setDateRange(start, end);
ctrl.setDateRangeForDisplay();
ctrl.closeOverlay();
};
};
}]);
guDateRange.directive('guDateRange', [function () {
return {
template: template,
replace: true,
scope: {
guStartDate: '=',
guEndDate: '=',
guPresetDates: '=',
guSelectedField: '=',
guFields: '=',
guDateFormat: '=?',
guAnyTimeText: '=?',
guFirstDay: '=?',
guShowExtras: '='
},
controller: 'GuDateRangeCtrl',
controllerAs: 'ctrl',
bindToController: true,
link: function ($scope, el, attrs, ctrl) {
ctrl.guDateFormat = ctrl.guDateFormat || 'DD-MMM-YYYY';
ctrl.guAnyTimeText = ctrl.guAnyTimeText || 'anytime';
ctrl.guFirstDay = ctrl.guFirstDay || 0;
const originalEl = el[0];
var startInput = originalEl
.querySelectorAll('.gu-date-range__input__start--hidden')[0];
var startContainer = originalEl
.querySelectorAll('.gu-date-range__overlay__pikaday--start')[0];
var endInput = originalEl
.querySelectorAll('.gu-date-range__input__end--hidden')[0];
var endContainer = originalEl
.querySelectorAll('.gu-date-range__overlay__pikaday--end')[0];
const tenYearsInMilliseconds = (10 * 365 * 24 * 60 * 60 * 1000);
const tenYearsFromNow = new Date(Date.now() + tenYearsInMilliseconds);
var pikaStart = new Pikaday({
field: startInput,
container: startContainer,
bound: false,
maxDate: tenYearsFromNow,
yearRange: 100,
firstDay: parseInt(ctrl.guFirstDay),
format: ctrl.guDateFormat,
keyboardInput: false
});
var pikaEnd = new Pikaday({
field: endInput,
container: endContainer,
bound: false,
maxDate: tenYearsFromNow,
firstDay: parseInt(ctrl.guFirstDay),
format: ctrl.guDateFormat,
yearRange: 100,
keyboardInput: false
});
$scope.$watch('pikaStartValue', function (pikaStartValue) {
var date = (pikaStartValue && new Date(pikaStartValue)) || new Date();
pikaEnd.setMinDate(date);
pikaEnd.hide();
pikaEnd.show();
});
$scope.$watch('pikaEndValue', function () {
pikaStart.hide();
pikaStart.show();
});
$scope.$watch('ctrl.guEndDate', resetView);
$scope.$on('$destroy', function() {
pikaStart.destroy();
pikaEnd.destroy();
});
function resetView() {
ctrl.setDateRangeForDisplay();
pikaStart.setDate();
pikaEnd.setDate();
pikaStart.setDate(ctrl.guStartDate);
pikaEnd.setDate(ctrl.guEndDate);
ctrl.closeOverlay();
}
function getStartValue () {
var start = pikaStart.getDate();
return start ? moment(start).startOf('day').toDate() : undefined;
}
function getEndValue () {
var end = pikaEnd.getDate();
return end ? moment(end).endOf('day').toDate() : undefined;
}
function setPresetDate (preset) {
ctrl.save(preset);
resetView();
}
function setCustomRange () {
var start = getStartValue();
var end = getEndValue();
ctrl.save(start, end);
resetView();
}
function clearStart () {
pikaStart.setDate();
pikaStart.gotoToday();
}
function clearEnd () {
pikaEnd.setDate();
pikaEnd.gotoToday();
}
$scope.cancel = resetView;
$scope.save = setCustomRange;
$scope.setPresetDate = setPresetDate;
$scope.clearStart = clearStart;
$scope.clearEnd = clearEnd;
resetView();
}
};
}]);