"use strict"; (function () { 'use strict'; angular.module('createTicketModule') .controller('CreateTaskV2Controller', ['$scope', '$modalInstance', '$modal', '$state', 'configurationModel', 'createTicketModel', 'ticketModel', 'userModel', 'i18nService', 'systemAlertService', 'screenConfigurationModel', '$q', 'metadataModel', 'ticketActionService', 'categoriesService', '$filter', 'events', 'layoutConfigurationModel', 'fieldValidationModel', 'objectValueMapperService', 'editTicketDatesService', function ($scope, $modalInstance, $modal, $state, configurationModel, createTicketModel, ticketModel, userModel, i18nService, systemAlertService, screenConfigurationModel, $q, metadataModel, ticketActionService, categoriesService, $filter, events, layoutConfigurationModel, fieldValidationModel, objectValueMapperService, editTicketDatesService) { var parent, fields, task = { today: new Date(), type: EntityVO.TYPE_TASK, autoAssign: true, customFields: {}, showDates: false, scheduledStartDatePicker: { open: false }, actualStartDatePicker: { open: false }, scheduledEndDatePicker: { open: false }, actualEndDatePicker: { open: false }, categorizations: [ { name: "operational", tiers: {} }, { name: "product", tiers: {} } ] }, taskMetadata = {}; function init() { $scope.showMeridian = window.showMeridian; $scope.state = { showSpinner: true, dataIsLoading: true }; $scope.editMode = true; $scope.isNew = true; $scope.formContainsInvalidFields = createTicketModel.formContainsInvalidFields; createTicketModel.currentTicket = task; $scope.task = task; $scope.taskMetadata = taskMetadata; $scope.loggedInUserId = userModel.userId; parent = ticketModel.taskParent; if (parent) { task.parentName = parent.type; task.parentId = parent.id; task.parentDisplayId = parent.displayId; if (parent.type === EntityVO.TYPE_ACTIVITY) { if (ticketModel.activityParent) { task.parentReleaseDisplayId = ticketModel.activityParent.displayId; } else { task.parentReleaseDisplayId = parent.parentId; } } if (parent.type !== EntityVO.TYPE_PROBLEM && parent.type !== EntityVO.TYPE_KNOWNERROR) { task.customer = parent.customer; task.locationCompany = !_.isEmpty(parent.locationCompany) ? parent.locationCompany : parent.company.name; } else { task.customer = { company: parent.company }; } task.company = (parent.company ? parent.company : parent.customer.company); if (parent.type === EntityVO.TYPE_CHANGE) { task.company.site = parent.location ? parent.location : { siteId: "", region: "", name: "", siteGroup: "" }; if (parent.scheduledStartDate) { task.scheduledStartDate = parent.scheduledStartDate; } } } else { $state.go('dashboard'); } $scope.datePickerOptions = { startingDay: configurationModel.getWeekStartingDay(), 'show-weeks': false, minDate: moment().year(1970).month(0).date(2), maxDate: moment().year(2038).month(0).date(18) }; objectValueMapperService.clearMap(task.type); initAlertForDirtyForm(); var metadataPromise = metadataModel.getMetadataByType(EntityVO.TYPE_TASK).then(function (metadata) { angular.extend(taskMetadata, metadata); var status = _.head(taskMetadata.statuses); task.status = { value: status.name }; if (!_.isEmpty(status.statusReasons) && $scope.isFieldRequired('statusReason')) { task.status.statusReason = _.head(status.statusReasons).name; } //default to lowest task.priority = _.last(taskMetadata.priorities).name; }); var basicDataPromise = ticketModel.getDraft(EntityVO.TYPE_TASK).then(function (data) { $scope.state.showSpinner = false; task.id = data.id; task.displayId = data.displayId; task.accessMappings = data.accessMappings; }); var screen = ScreenConfigurationVO.prototype.CREATE_TASK_SCREEN; var layoutConfigurationPromise = layoutConfigurationModel.loadScreenLayout(screen); var screenConfigurationPromise = screenConfigurationModel .loadScreenConfigurationAndCustomFieldLabels(screen, EntityVO.TYPE_TASK); var allPromisesArray = [metadataPromise, basicDataPromise, layoutConfigurationPromise, screenConfigurationPromise]; if (parent.taskPhaseId) { task.showPhaseSelector = true; var phasesPromise = ticketModel.getFutureTaskPhases(parent.company.name, parent.taskPhaseId); allPromisesArray.push(phasesPromise); } $q.all(allPromisesArray).then(function (resp) { task.allCategories = categoriesService.populateCategories(task.categorizations, taskMetadata); $scope.screenLayout = resp[2]; fields = screenConfigurationModel.getEditableFieldsForScreen(screen); $scope.customFields = angular.copy(fields); if (resp[4]) { task.taskPhases = resp[4]; _.each(task.taskPhases, function (item) { if (item.guid === parent.taskPhaseId) { task.selectedPhase = item; } }); } $scope.state.dataIsLoading = false; $scope.state.showSpinner = false; }); $scope.clearSelectedGroup(); } $scope.getList = function (type, term) { return createTicketModel.getList(type, term); }; $scope.clearSelectedGroup = function () { task.selectedGroup = {}; $scope.clearSelectedAssignee(); task.autoAssign = true; }; $scope.clearSelectedAssignee = function () { task.selectedAssignee = {}; }; $scope.createTask = function () { $scope.state.showSpinner = true; var taskData = createTicketModel.collectTicketChanges(taskMetadata); if (taskData.summary) { taskData.summary = taskData.summary.replace(/\u00a0/g, ' '); } var isBrowseTemplate = false; if (angular.isDefined($scope.task.selectedTemplate)) { isBrowseTemplate = true; } createTicketModel.createTaskV2(taskData, $scope.task.selectedTemplate, isBrowseTemplate).then(function (response) { $modalInstance.close(parent); if (response && (typeof response === 'string')) { $scope.state.showSpinner = false; systemAlertService.error({ text: response, clear: false }); } }).catch(function (error) { $scope.state.showSpinner = false; systemAlertService.error({ text: error.errorCode ? $filter('i18n')('error.unknown') : error.data.error, clear: false }); }); }; $scope.cancel = function () { $modalInstance.dismiss(); }; $scope.isFieldRequired = function (field) { return fieldValidationModel.isFieldRequired(task.type, task.status.value, "", field); }; var isFormDirty = function () { return ($scope.createTaskForm && $scope.createTaskForm.$dirty) || !_.isEmpty(task.attachments); }; function initAlertForDirtyForm() { $scope.$on('$stateChangeStart', function (event, toState, toParams) { if (isFormDirty() && toState.name !== parent.type) { event.preventDefault(); var modalInstance = systemAlertService.modal({ title: i18nService.getLocalizedString('common.notification.dirty.title'), text: i18nService.getLocalizedString('common.notification.dirty.message'), buttons: [ { text: i18nService.getLocalizedString('common.labels.yes'), data: { stateName: toState.name, stateParams: toParams } }, { text: i18nService.getLocalizedString('common.labels.no') } ] }); modalInstance.result.then(function (data) { if (!_.isEmpty(data)) { createTicketModel.currentTicket = task = {}; $scope.createTaskForm.$setPristine(); $scope.cancel(); $state.transitionTo(data.stateName, data.stateParams); } }); } else { $scope.cancel(); } }); } function handleShownAssignmentBlade($event, data) { var isAssignToMeAction = false, originalEvent = data.originalEvent, doNotSaveSelection = !data.saveSelection; if (data) { var assigneeRole = 'ticketassignee'; isAssignToMeAction = !!data.assignToMe; if (isAssignToMeAction) { ticketActionService.assignToMe(originalEvent, assigneeRole, doNotSaveSelection, $scope.task, $scope); } else { ticketActionService.assign(originalEvent, doNotSaveSelection, $scope.task, $scope, assigneeRole); } } else { $log.warn('Could not open assignment blade. Required Event data is missing. '); return; } } init(); $scope.$on(events.SHOW_ASSIGN_TICKET_BLADE, handleShownAssignmentBlade); $scope.$on(events.CUSTOM_FIELD_VALUE_CHANGE, function () { $scope.$broadcast(events.REFRESH_FIELD_VALUES); }); $scope.$on(events.CHANGE_DATES_VALUE_CHANGED, function (event, data) { if (data.type === 'scheduled' || data.type === 'actual') { editTicketDatesService.updateDateTime($scope.createTaskForm, $scope.task, data.type); } }); } ]); })();