in public/components/date-time-picker/date-time-picker.js [136:254]
link: function (scope, elem, attrs, ngModel) {
var updateOn = scope.updateOn || 'default';
function formatText(input) {
return wfFormatDateTimeFilter(wfLocaliseDateTimeFilter(input), 'D MMM YYYY HH:mm');
}
function commitUpdate() {
scope.$apply(function () {
ngModel.$setViewValue(elem.val());
scope.onUpdate(ngModel.$modelValue);
});
}
function cancelUpdate() {
scope.$apply(function () {
if (hasChanged()) { // reset to model value
ngModel.$setViewValue(formatText(ngModel.$modelValue));
ngModel.$render();
}
scope.onCancel();
});
}
function parseDate(input) {
if (!input || input === '') {
return null;
}
try {
return wfDateParser.parseDate(input);
}
catch (err) {
// ignore parse errors - these are handled by angular (ng-invalid-parse)
if (err.message.substr(0,20) !== 'Could not parse date') {
throw err;
}
}
}
function hasChanged() {
return !moment(ngModel.$modelValue).isSame(parseDate(elem.val()));
}
// Setup input handlers
// Slightly hacky, but it works..
angular.element(elem[0].form).on('submit', commitUpdate);
// Set event handlers on the input element
elem.off('input keydown change'); // reset default angular input event handlers
elem.on('input keydown change blur', function (ev) {
var key = ev.keyCode,
type = ev.type;
if (type === 'keydown') {
// ignore the following keys on input
if ((key === KEYCODE_COMMAND) || isModifierKey(key) || isArrowKey(key)) {
return;
}
$browser.defer(commitUpdate);
if (updateOn === 'enter' && key === KEYCODE_ENTER) {
scope.updateOnEnter();
}
}
if (type === 'blur' && scope.cancelOn === 'blur') {
cancelUpdate();
}
// cancel via escape
if (type === 'keydown' && key === KEYCODE_ESCAPE) {
cancelUpdate();
}
});
ngModel.$render = function () {
elem.val(ngModel.$viewValue || '');
};
ngModel.$parsers.push(parseDate);
ngModel.$formatters.push(formatText);
// Watch for changes to timezone
scope.$on('location:change', function () {
ngModel.$setViewValue(formatText(ngModel.$modelValue));
ngModel.$render();
});
scope.updateOnEnter = function () {
switch (ngModel.$modelValue) {
// If an empty value is submitted, clear the field
case null:
scope.onSubmit();
break;
// If date is invalid, revert date in text box to previous value (and don't update database)
case undefined:
scope.onCancel();
break;
// If the date is valid, parse it to a string and update the database
default:
var parsedDate, parsedDateAsString;
parsedDate = moment(ngModel.$modelValue);
if (parsedDate.isValid()) {
parsedDateAsString = parsedDate.toISOString();
ngModel.$modelValue = parsedDateAsString;
scope.onSubmit();
}
}
};
}