link: function()

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();
                            }
                    }
                };
            }