"use strict"; (function () { 'use strict'; angular.module('customWidgetsModule') .directive('dateWidget', ['customFieldLinkFunction', 'events', 'editTicketDatesService', '$state', 'tabIds', '$rootScope', 'objectValueMapperService', 'expressionEvaluatorService', function (customFieldLinkFunction, events, editTicketDatesService, $state, tabIds, $rootScope, objectValueMapperService, expressionEvaluatorService) { return { restrict: 'E', replace: true, scope: { data: '=', isEditable: '=', isDatesPanel: '=', context: '=', editMode: "=" }, templateUrl: 'views/custom-widgets/dates-widget.html', link: function (scope) { if (scope.isDatesPanel) { if (scope.data.requiredCondition) { scope.data.isRequired = expressionEvaluatorService.evaluate(scope.data.requiredCondition); } if (scope.data.readOnlyCondition) { scope.data.isReadOnly = expressionEvaluatorService.evaluate(scope.data.readOnlyCondition); } } scope.tabIds = tabIds; scope.disabled = false; scope.datePickerOptions = { 'show-weeks': false }; var originaldata = _.cloneDeep(scope.data.value); scope.targetDate = "targetDate"; customFieldLinkFunction(scope); if (scope.context.timing && (scope.context.timing === 'Latent' || (scope.context.timing.name && scope.context.timing.name === 'Latent'))) { if (scope.data.name === 'scheduledDates') { scope.data.isReadOnly = true; } if (scope.data.name === 'actualDates') { scope.data.isRequired = true; } } if (scope.context.earliestStartDate) { scope.earliestStartDate = new Date(scope.context.earliestStartDate); } scope.status = { openedStart: false, openedEnd: false }; scope.openStart = function ($event) { $event.preventDefault(); $event.stopPropagation(); scope.status.openedStart = true; }; scope.openEnd = function ($event) { $event.preventDefault(); $event.stopPropagation(); scope.status.openedEnd = true; }; scope.editDatesView = function () { $state.go('changeEditDates', { id: $state.params.id }); }; scope.validator = function (name) { if (name === 'scheduledStartDate') { return editTicketDatesService.scheduledStartDateDisabled(scope.context, scope.editMode); } else if (name === 'scheduledEndDate') { return editTicketDatesService.scheduledEndDateDisabled(scope.context, scope.editMode); } else if (name === 'actualStartDate') { return editTicketDatesService.actualStartDateDisabled(scope.context, scope.editMode); } else if (name === 'actualEndDate') { return editTicketDatesService.actualEndDateDisabled(scope.context, scope.editMode); } else if (name === 'targetDate') { return scope.context.timing && (scope.context.timing === 'Latent'); } }; scope.onFieldValueChange = function (data, fieldName, identifier) { _.forEach(data.members, function (member) { scope.context[member.name] = data.value[member.name]; }); if (identifier === 'start') { data.initDate = angular.copy(data.value[data.members[0].name]); } updateDateFormValidation(data); //In create screen this is outside layout renderer so we need to broadcast via root scope $rootScope.$broadcast(events.WIDGET_VALUE_CHANGE, { fieldName: data.name, processed: true, memberName: fieldName }); }; function updateDateFormValidation(data) { var type; switch (data.name) { case 'scheduledDates': type = 'scheduled'; break; case 'actualDates': type = 'actual'; break; case 'targetDate': type = 'target'; break; } if (type === 'scheduled' || type === 'actual') { editTicketDatesService.updateDateTime(scope.dateForm, data.value, type); } else if (type === 'target') { if (!scope.dateForm) { return; } editTicketDatesService.updateTargetDateTime(scope.dateForm, scope.context); } } scope.targetDateErrorMessageVisible = function () { return (scope.editMode || scope.context.useTargetDate) && scope.dates && scope.dates.targetDate && scope.dates.targetDate.$invalid; }; var unbindRootScopeListener = $rootScope.$on(events.WIDGET_VALUE_CHANGE, function (event, field) { if (field && field.fieldName === 'status') { scope.showEarliestDate = objectValueMapperService.getValueByFieldName(field.fieldName) === 'Scheduled For Review'; } }); scope.$on('$destroy', function () { unbindRootScopeListener(); }); scope.$on(events.AFTER_SAVED_CHANGES, function () { originaldata = _.cloneDeep(scope.data.value); }); scope.$on(events.DISCARD_CHANGES, function () { scope.data.value = _.cloneDeep(originaldata); _.forEach(scope.data.members, function (member) { scope.context[member.name] = scope.data.value[member.name]; }); }); scope.$on(events.CLEAR_CHANGE_DATES, function (event, targetDateChecked) { if (scope.data.name === 'scheduledDates') { scope.data.value.scheduledEndDate = null; scope.data.value.scheduledStartDate = null; } else if (scope.data.name === 'actualDates') { scope.data.value.actualStartDate = null; scope.data.value.actualEndDate = null; } else if (scope.data.name === 'targetDate') { scope.data.value.targetDate = null; } scope.disabled = targetDateChecked; }); scope.$on(events.UPDATE_SCHEDULE_DATE, function (event, date) { var modelDate, contextDate; modelDate = scope.data.value[date.name] ? scope.data.value[date.name].valueOf() : scope.data.value[date.name]; contextDate = date.value ? date.value.valueOf() : date.value; if (modelDate !== contextDate) { scope.data.value[date.name] = date.value; updateDateFormValidation(scope.data); } }); scope.$watch('data.setValueFlag', function (value) { if (value !== '#$#' && value) { var obj = {}, nonEmptyValuesObj = _.omit(value, function (item) { return _.isEmpty(item) && !_.isNumber(item) || _.isNumber(item) && item < 0; }); _.forEach(nonEmptyValuesObj, function (n, key) { obj[key] = new Date(parseInt(n)); }); scope.data.value = obj; scope.data.setValueFlag = '#$#'; } }); } }; } ]); })();