SmartIT_Extensions/BMC/smart-it-full/scripts/app/common/edit-activity-dates.js

168 lines
8.0 KiB
JavaScript

"use strict";
(function () {
'use strict';
angular.module('myitsmApp')
.directive('editActivityDates', ['events', 'configurationModel', 'ticketModel', 'fieldValidationModel', 'editTicketDatesService',
function (events, configurationModel, ticketModel, fieldValidationModel, editTicketDatesService) {
return {
restrict: 'E',
templateUrl: 'views/common/edit-activity-dates.html',
replace: true,
scope: {
ticket: '=',
dateForm: '=',
isDraft: '=',
updateIsHandledByParent: '=',
onlyShowRequired: '=',
ignoreAccessMapping: '=',
makeScheduleDatesOptional: '=',
makeActualDatesOptional: '='
},
link: function (scope) {
var datesCopy, parentGuid = scope.ticket ? scope.ticket.parentGuid : '';
if (scope.ticket) {
makeCopy();
}
var state = {
pendingTicketDatesChange: false
};
scope.state = state;
scope.validator = editTicketDatesService;
scope.datePickerOptions = {
startingDay: configurationModel.getWeekStartingDay(),
'show-weeks': false
};
scope.showMeridian = window.showMeridian;
scope.$watch('ticket.timing', function () {
if (scope.ticket && scope.ticket.timing) {
scope.ticket.scheduledStartDate = scope.isFieldDisabled('scheduledStartDate') ? null : scope.ticket.scheduledStartDate;
scope.ticket.scheduledEndDate = scope.isFieldDisabled('scheduledEndDate') ? null : scope.ticket.scheduledEndDate;
}
});
/**
* Collect changes
*
* @return {Object} change set
*/
function collectChanges() {
if (state.pendingTicketDatesChange) {
return {
scheduledStartDate: getTimestamp(scope.ticket.scheduledStartDate),
scheduledEndDate: getTimestamp(scope.ticket.scheduledEndDate),
actualStartDate: getTimestamp(scope.ticket.actualStartDate),
actualEndDate: getTimestamp(scope.ticket.actualEndDate)
};
}
else {
return {};
}
}
function makeCopy() {
datesCopy = _.clone({
scheduledStartDate: scope.ticket.scheduledStartDate,
scheduledEndDate: scope.ticket.scheduledEndDate,
actualStartDate: scope.ticket.actualStartDate,
actualEndDate: scope.ticket.actualEndDate
});
}
/**
* Handle save changes
*/
scope.save = function () {
var changes = collectChanges();
var isDraft = scope.isDraft;
var singleMode = !scope.updateIsHandledByParent;
scope.$emit(events.SAVE_CHANGES_REQUEST, changes, singleMode || isDraft);
if (_.size(changes)) {
if (isDraft) {
closeEditor();
}
else {
if (singleMode) {
updateTicketDates(changes)
.then(function () {
closeEditor();
});
}
}
}
else {
closeEditor();
}
};
scope.cancel = function () {
scope.ticket.scheduledStartDate = datesCopy.scheduledStartDate;
scope.ticket.scheduledEndDate = datesCopy.scheduledEndDate;
scope.ticket.actualStartDate = datesCopy.actualStartDate;
scope.ticket.actualEndDate = datesCopy.actualEndDate;
scope.updateDateTime('actual');
scope.updateDateTime('scheduled');
closeEditor();
};
/**
* Handle user input
*
* @param {String} type - date type
*/
scope.updateDateTime = function (type) {
state.pendingTicketDatesChange = true;
editTicketDatesService.updateDateTime(scope.dateForm, scope.ticket, type);
};
scope.isFieldRequired = function (field) {
return scope.ticket && fieldValidationModel.isFieldRequired(scope.ticket.type, scope.ticket.status.value, scope.ticket.timing, field);
};
scope.isFieldDisabled = function (field) {
return scope.ticket && fieldValidationModel.isFieldDisabled(scope.ticket.type, scope.ticket.status.value, scope.ticket.timing, field);
};
/**
* Update ticket dates
*
* @param {Object} changes
* @returns {*}
*/
function updateTicketDates(changes) {
return ticketModel.update(scope.ticket.id, scope.ticket.type, changes);
}
function closeEditor() {
if (!scope.updateIsHandledByParent || scope.isDraft) {
scope.$emit(events.SAVE_CHANGES_COMPLETE);
}
clearPendingChangeFlag();
}
function clearPendingChangeFlag() {
state.pendingTicketDatesChange = false;
}
/**
* Handle save all changes event
* @param event
* @param eventData
*/
function handleSaveAllChangesComplete() {
if (!scope.ticket.parentGuid) {
scope.ticket.parentGuid = parentGuid;
}
clearPendingChangeFlag();
}
function handleToggleEditMode() {
makeCopy();
}
function handleSaveChanges() {
console.log('handleSaveChanges in editTicketDates directive');
scope.save();
}
function handleDiscardChanges() {
scope.cancel();
}
function getTimestamp(date, time) {
time = time ? moment(time) : moment(date);
return moment(date).set('hours', time.get('hours')).set('minutes', time.get('minutes')).format('X') * 1000;
}
scope.$on(events.SAVE_CHANGES, handleSaveChanges);
scope.$on(events.TOGGLE_EDIT_MODE, handleToggleEditMode);
scope.$on(events.DISCARD_CHANGES, handleDiscardChanges);
scope.$on(events.SAVE_ALL_CHANGES_COMPLETE, handleSaveAllChangesComplete);
}
};
}]);
}());