SmartIT_Extensions/BMC/smart-it-full-helix/scripts/app/change/dates-v2-directive.js

512 lines
32 KiB
JavaScript

"use strict";
(function () {
'use strict';
angular.module('changeModule')
.directive('datesV2', ['events', '$filter', 'editTicketDatesService', 'fieldValidationModel', '$modal', 'tabIds', 'metadataModel',
'collisionModel', 'systemAlertService', 'emailModel', 'ticketModel', 'searchModel', 'screenConfigurationModel', '$rootScope', 'configurationModel', 'expressionEventManager', '$timeout',
function (events, $filter, editTicketDatesService, fieldValidationModel, $modal, tabIds, metadataModel, collisionModel, systemAlertService, emailModel, ticketModel, searchModel, screenConfigurationModel, $rootScope, configurationModel, expressionEventManager, $timeout) {
return {
restrict: 'E',
replace: true,
templateUrl: 'views/change/dates-v2.html',
scope: {
collisions: '=',
context: '=',
editMode: '=',
isNew: '=',
datesCustomFields: '=',
screenLayout: '=',
metadata: '='
},
link: function (scope, $element) {
scope.$on(events.WIDGET_VALUE_CHANGE, function (event, data) {
$rootScope.$broadcast(events.WIDGET_VALUE_CHANGE_FROM_WIZARD, data);
});
scope.$on(events.FIELD_VALUE_CHANGE, function (event, data) {
$rootScope.$broadcast(events.FIELD_VALUE_CHANGE_FROM_WIZARD, data);
});
scope.showMeridian = window.showMeridian;
var loadCollisions = !scope.editMode || scope.isNew;
scope.collisionStates = {
shouldRefreshCollisions: false,
editCollisionStatus: false
};
scope.state = {
loadingCollisions: false
};
scope.changeFlag = false;
scope.asc = false;
scope.validator = editTicketDatesService;
scope.tabIds = tabIds;
scope.disableCollisionManagement = searchModel.disableCollisionManagement;
scope.collisionsSelected = 0;
scope.currentDate = new Date();
scope.autoTriggerChangeCollisionForCIsUpto = configurationModel.autoTriggerChangeCollisionForCIsUpto;
if (!scope.isNew) {
metadataModel.getMetadataByType(EntityVO.TYPE_CHANGE).then(function (metadata) {
scope.collisionStatuses = metadata.collisionStatuses;
});
scope.collisionStates.editCollisionStatus = scope.context.accessMappings.collisionEditAllowed;
}
scope.datePickerOptions = {
startingDay: configurationModel.getWeekStartingDay(),
'show-weeks': false,
minDate: moment().year(1970).month(0).date(2),
maxDate: moment().year(2038).month(0).date(18)
};
scope.$watch('collisions', function () {
scope.collisionsCopy = _.cloneDeep(scope.collisions);
if (scope.collisions && scope.collisions.changeList) {
scope.$emit(events.UPDATE_CHANGE_COLLISION_STATUS, scope.collisions);
scope.$emit(events.CHANGE_COLLISION_STATUS_CHANGED, scope.collisions.changeList);
}
});
scope.$on(events.TOGGLE_CHANGE_CALENDAR, function (event, expanded) {
scope.expanded = expanded;
});
scope.openDatePicker = function (calendar, event) {
calendar.open = true;
if (scope.editMode) {
event.stopPropagation();
}
};
scope.updateDateTime = function (type) {
editTicketDatesService.updateDateTime(scope[scope.tabIds.wizard.dates], scope.context, type);
};
scope.editDatesView = function () {
updateCollisions();
scope.collisionStates.shouldRefreshCollisions = false;
};
scope.$watch('context.targetDate', function () {
scope.updateTargetDateTime();
});
scope.$watch('context.scheduledStartDate', function (newDate, oldDate) {
//Updating schedule start date model when selecting date from calendar
scope.$broadcast(events.UPDATE_SCHEDULE_DATE, { name: 'scheduledStartDate', value: newDate });
newDate = newDate ? newDate.valueOf() : newDate;
oldDate = oldDate ? oldDate.valueOf() : oldDate;
refreshCollisions(newDate, oldDate);
});
scope.$watch('context.scheduledEndDate', function (newDate, oldDate) {
//Updating schedule end date model when selecting date from calendar
scope.$broadcast(events.UPDATE_SCHEDULE_DATE, { name: 'scheduledEndDate', value: newDate });
newDate = newDate ? newDate.valueOf() : newDate;
oldDate = oldDate ? oldDate.valueOf() : oldDate;
refreshCollisions(newDate, oldDate);
});
scope.$watch('context.linkedCIs', function () {
if (!scope.editMode || scope.isNew) {
if (scope.context.linkedCIs && scope.context.linkedCIs.length) {
updateCollisions();
}
else {
scope.collisionsCopy = {};
}
scope.collisionStates.shouldRefreshCollisions = false;
}
});
var cancelRootScopeListener1 = $rootScope.$on(events.AFFECTED_SERVICE_VALUE_CHANGED, function (event, selectedService) {
if (!scope.editMode || scope.isNew) {
scope.context.impactedService = selectedService;
updateCollisions();
}
});
var cancelRootScopeListener2 = $rootScope.$on(events.CHANGE_CLASS_VALUE_CHANGED, function (event, changeClass) {
if (!scope.editMode || scope.isNew) {
scope.context.timing = changeClass;
scope.context.useTargetDate = false;
scope.clearDates();
}
});
scope.$watch(tabIds.wizard.dates + '.$dirty', function (dirty) {
if (typeof dirty !== 'undefined') {
scope.$emit(events.CHANGE_WIZARD_FORM_STATE, {
name: scope.tabIds.wizard.dates,
dirty: dirty
});
}
});
scope.$watch(tabIds.wizard.dates + '.$invalid', function (invalid) {
if (typeof invalid !== 'undefined') {
scope.$emit(events.CHANGE_WIZARD_FORM_STATE, {
name: scope.tabIds.wizard.dates,
invalid: invalid
});
}
});
scope.$on(events.CHANGE_COLLISION_SHOW_WEEKENDS, function (event, data) {
scope.showWeekends = data.showWeekends;
});
function refreshCollisions(newDate, oldDate) {
var linkedCIs = [];
if (scope.context.linkedCIs && scope.context.linkedCIs.length) {
linkedCIs.push.apply(linkedCIs, scope.context.linkedCIs);
}
if (scope.context.impactedService && scope.context.impactedService.reconciliationId) {
if (!_.find(linkedCIs, { id: scope.context.impactedService.reconciliationId })) {
linkedCIs.push({ id: scope.context.impactedService.reconciliationId });
}
}
if (newDate && newDate !== oldDate) {
if (!scope.editMode || scope.isNew) {
if (loadCollisions) {
updateCollisions();
}
else if (scope.context.scheduledStartDate && scope.context.scheduledEndDate) {
if (linkedCIs && linkedCIs.length &&
!isNaN(scope.autoTriggerChangeCollisionForCIsUpto) && !_.isUndefined(scope.autoTriggerChangeCollisionForCIsUpto) &&
linkedCIs.length > scope.autoTriggerChangeCollisionForCIsUpto) {
scope.showRunCollisionDetectionMsg = true;
scope.collisionsCopy = {};
}
else {
scope.collisionStates.shouldRefreshCollisions = true;
}
}
}
else if (scope.editMode) {
scope.collisionStates.saveDatesAndUpdate = (scope.context.scheduledStartDate && scope.context.scheduledEndDate) && (scope.context.scheduledStartDate.getTime() <= scope.context.scheduledEndDate.getTime()) ? scope[scope.tabIds.wizard.dates].dateForm.$valid : false;
scope.collisionStates.editCollisionStatus = false;
checkAutoTriggerCollision(linkedCIs);
}
}
else if (!scope.editMode || scope.isNew) {
scope.collisionStates.shouldRefreshCollisions = false;
scope.collisionsCopy = {};
}
else if (scope.editMode) {
checkAutoTriggerCollision(linkedCIs);
}
}
function updateCollisions() {
var linkedCIs = [];
if (scope.context.impactedService) {
linkedCIs.push({ id: scope.context.impactedService.reconciliationId });
}
if (scope.context.linkedCIs && scope.context.linkedCIs.length) {
linkedCIs.push.apply(linkedCIs, scope.context.linkedCIs);
}
if (scope.context.scheduledStartDate && scope.context.scheduledEndDate && linkedCIs && linkedCIs.length &&
(isNaN(scope.autoTriggerChangeCollisionForCIsUpto) || _.isUndefined(scope.autoTriggerChangeCollisionForCIsUpto) ||
linkedCIs.length <= scope.autoTriggerChangeCollisionForCIsUpto)) {
scope.showRunCollisionDetectionMsg = false;
scope.state.loadingCollisions = true;
if (!scope.context.scheduledStartTime) {
scope.context.scheduledStartTime = scope.context.scheduledStartDate;
}
if (!scope.context.scheduledEndTime) {
scope.context.scheduledEndTime = scope.context.scheduledEndDate;
}
collisionModel.getListOfCollisionsAndCiByDate(scope.context.scheduledStartDate, scope.context.scheduledEndDate, linkedCIs)
.then(function (data, error) {
if (data) {
scope.collisionsCopy = data;
scope.collisionsCopy.changeList.filter(function (item) {
if (item.id === scope.context.id) {
scope.collisionsCopy.changeList.splice(scope.collisionsCopy.changeList.indexOf(item), 1);
}
});
scope.state.loadingCollisions = false;
}
if (error) {
systemAlertService.error({
text: error,
clear: true
});
}
}).finally(function () {
loadCollisions = false;
});
}
else {
scope.collisionsCopy = {};
scope.showRunCollisionDetectionMsg = scope.context.scheduledStartDate && scope.context.scheduledEndDate && linkedCIs &&
!isNaN(configurationModel.autoTriggerChangeCollisionForCIsUpto) && !_.isUndefined(configurationModel.autoTriggerChangeCollisionForCIsUpto) &&
linkedCIs.length && linkedCIs.length > scope.autoTriggerChangeCollisionForCIsUpto ? true : false;
}
}
scope.updateTargetDateTime = function () {
if (!scope[scope.tabIds.wizard.dates]) {
return;
}
editTicketDatesService.updateTargetDateTime(scope[scope.tabIds.wizard.dates], scope.context);
};
scope.toggleUseTargetDate = function () {
scope.context.useTargetDate = !scope.context.useTargetDate;
scope.showRunCollisionDetectionMsg = false;
scope.clearDates();
};
scope.useTargetDateCheckboxVisible = function () {
return !scope.editMode || (scope.isNew && scope.targetDateSection);
};
scope.targetDateErrorMessageVisible = function () {
return (scope.editMode || scope.context.useTargetDate) && scope.dates.targetDate.$invalid;
};
scope.targetDateFieldVisible = function () {
return (scope.isNew && scope.context.useTargetDate) || (!scope.isNew && scope.editMode);
};
scope.clearDates = function () {
if (scope.context.useTargetDate) {
scope.context.scheduledStartDate = null;
scope.context.scheduledEndDate = null;
scope.context.actualStartDate = null;
scope.context.actualEndDate = null;
}
else {
scope.context.targetDate = null;
}
scope.$broadcast(events.CLEAR_CHANGE_DATES, scope.context.useTargetDate);
};
scope.useTargetDateDisabled = function () {
return scope.context.timing
&& scope.context.timing.name === 'Latent';
};
scope.isFieldRequired = function (field) {
var fieldRequired = false;
if (scope.context.timing) {
fieldRequired = fieldValidationModel.isFieldRequired(EntityVO.TYPE_CHANGE, 'Draft', scope.context.timing.name, field);
}
return fieldRequired;
};
scope.isFieldDisabled = function (field) {
var fieldDisabled = false;
if (scope.context.timing) {
fieldDisabled = fieldValidationModel.isFieldDisabled(EntityVO.TYPE_CHANGE, 'Draft', scope.context.timing.name, field);
}
return fieldDisabled;
};
scope.isFieldEditable = function (fieldName) {
var accessMappings = scope.context.accessMappings, accessMapping = accessMappings && accessMappings.fieldMappings
? accessMappings.fieldMappings[fieldName] : null;
if (accessMapping) {
return (accessMapping === 'write');
}
else {
return accessMappings.datesEditAllowed;
}
};
scope.saveDates = function () {
var dateChanges = {
scheduledStartDate: getTimestamp(scope.context.scheduledStartDate),
scheduledEndDate: getTimestamp(scope.context.scheduledEndDate),
actualStartDate: getTimestamp(scope.context.actualStartDate),
actualEndDate: getTimestamp(scope.context.actualEndDate),
targetDate: getTimestamp(scope.context.targetDate)
};
scope.state.loadingCollisions = true;
var updateChangeDatesPromise = ticketModel.update(scope.context.id, scope.context.type, dateChanges);
updateChangeDatesPromise.then(function (response, error) {
if (response) {
_.extend(scope.context, response);
collisionModel.getListOfCollisionsById(scope.context, true)
.then(function (collisionSummary) {
if (collisionSummary.count > 0) {
scope.collisions = collisionSummary;
scope.collisionsCopy = _.cloneDeep(scope.collisions);
}
scope.state.loadingCollisions = false;
});
}
if (error) {
systemAlertService.error({
text: error,
clear: true
});
}
}).finally(function () {
scope.collisionStates.editCollisionStatus = scope.context.accessMappings.collisionEditAllowed;
scope.collisionStates.saveDatesAndUpdate = false;
});
};
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;
}
function checkAutoTriggerCollision(linkedCIs) {
scope.showRunCollisionDetectionMsg = scope.context.scheduledStartDate && scope.context.scheduledEndDate && linkedCIs && linkedCIs.length &&
!isNaN(scope.autoTriggerChangeCollisionForCIsUpto) && !_.isUndefined(scope.autoTriggerChangeCollisionForCIsUpto) &&
linkedCIs.length > scope.autoTriggerChangeCollisionForCIsUpto ? true : false;
}
scope.markStatus = function (status) {
var count = 0, modalInstance = $modal.open({
templateUrl: 'views/change/rationale.html',
windowClass: 'action-blade',
controller: 'RationaleController',
resolve: {
isRationalRequired: function () {
return !!(status.name === 'Resolved' || status.name === 'Ignored');
}
}
});
modalInstance.result.then(function (data) {
scope.collisionsCopy.changeList.filter(function (change) {
for (count = 0; count < change.configurationItems.length; count++) {
if (change.configurationItems[count].selected && change.configurationItems[count].status && change.configurationItems[count].status.name !== status.name) {
if (change.configurationItems[count].status.name === 'Resolved' || change.configurationItems[count].status.name === 'Ignored') {
change.ciCount = change.ciCount + 1;
}
change.configurationItems[count].status = status;
change.configurationItems[count].rationale = data;
if (status.name === 'Resolved' || status.name === 'Ignored') {
change.ciCount = change.ciCount - 1;
}
change.configurationItems[count].modified = true;
}
}
});
scope.collisions.changeList = scope.collisionsCopy.changeList;
scope.changeFlag = false;
scope.selectAllToggle(false);
scope.$emit(events.UPDATE_CHANGE_COLLISION_STATUS, scope.collisions);
scope.$emit(events.CHANGE_COLLISION_STATUS_CHANGED, scope.collisions.changeList);
});
};
/*
* Show/Hide and Checked/Unchecked properties of collisions
*/
scope.selectAllToggle = function (select) {
var cis = 0;
if (!scope.collisionsCopy || !scope.collisionsCopy.changeList) {
return;
}
for (var i = 0; i < scope.collisionsCopy.changeList.length; i++) {
scope.collisionsCopy.changeList[i].selected = select;
cis = cis + scope.collisionsCopy.changeList[i].configurationItems.length;
for (var j = 0; j < scope.collisionsCopy.changeList[i].configurationItems.length; j++) {
scope.collisionsCopy.changeList[i].configurationItems[j].selected = select;
}
}
select ? scope.collisionsSelected = cis : scope.collisionsSelected = 0;
};
scope.selectAllChanges = function (changeFlag) {
scope.changeFlag = !changeFlag;
scope.selectAllToggle(scope.changeFlag);
};
scope.selectChange = function (changeItem) {
changeItem.selected = !changeItem.selected;
changeItem.show = changeItem.selected;
if (!changeItem.selected) {
scope.collisionsSelected = scope.collisionsSelected - changeItem.configurationItems.length;
}
for (var i = 0; i < changeItem.configurationItems.length; i++) {
if (changeItem.selected && !changeItem.configurationItems[i].selected) {
scope.collisionsSelected++;
}
changeItem.configurationItems[i].selected = changeItem.selected;
}
};
scope.selectCIs = function (ci, changeItem) {
ci.selected = !ci.selected;
ci.selected ? scope.collisionsSelected++ : scope.collisionsSelected--;
if (!ci.selected) {
changeItem.selected = ci.selected;
}
};
scope.showEmailForm = function () {
var recipients = [];
_.each(scope.collisionsCopy.changeList, function (change) {
if (change.assignee.id) {
change.assignee.loginId = change.assignee.id;
change.assignee.type = $filter('i18n')('change.detail.emailRecipients.allCollisionManagers');
recipients.push(change.assignee);
}
});
recipients = _.uniqBy(recipients, 'id');
return emailModel.createEmail([scope.context], recipients);
};
var screenPanels;
if (!screenConfigurationModel.screensCacheByName[scope.screenLayout.name]) {
screenConfigurationModel.loadScreenConfigurationByName(scope.screenLayout.name).then(function (screenLayout) {
screenPanels = screenLayout.panels;
scope.scheduledDatesSection = _.find(screenPanels, { name: 'scheduledDatesSection' });
scope.actualDatesSection = _.find(screenPanels, { name: 'actualDatesSection' });
scope.targetDateSection = _.find(screenPanels, { name: 'targetDateSection' });
});
}
else {
screenPanels = scope.screenLayout && screenConfigurationModel.screensCacheByName[scope.screenLayout.name]
? screenConfigurationModel.screensCacheByName[scope.screenLayout.name].panels : [];
scope.scheduledDatesSection = _.find(screenPanels, { name: 'scheduledDatesSection' });
scope.actualDatesSection = _.find(screenPanels, { name: 'actualDatesSection' });
scope.targetDateSection = _.find(screenPanels, { name: 'targetDateSection' });
}
scope.panelChildrenCount = function (screenPanelName) {
if (screenPanelName) {
var screenPanel = _.find(screenPanels, { name: screenPanelName });
var datesFieldName = screenPanelName.replace(/Section/g, "");
var datesFieldInDatesPanel = _.find(screenPanel.fields, { name: datesFieldName });
if (screenPanel && datesFieldInDatesPanel) {
return 1;
}
else {
//check if the dates widget is in any other panel
_.find(screenPanels, function (panel) {
if (panel.fields) {
var datesFieldInOtherPanel = _.find(panel.fields, { name: datesFieldName });
var screenPaneltoUpdate;
//get the fields and add it to the dates panel
if (datesFieldInOtherPanel) {
scope[screenPanelName].fields.push(datesFieldInOtherPanel);
screenPaneltoUpdate = {
screenPanelSection: scope[screenPanelName],
datesField: datesFieldInOtherPanel
};
//revert it from the dates panel on save
scope.$emit(events.REMOVE_CHANGE_DATES_FROM_PANEL, screenPaneltoUpdate);
return 1;
}
}
});
}
}
return 0;
};
if (scope.editMode) {
scope.selectAllToggle(false);
}
scope.$on(events.UPDATE_DATE_LABEL_VISIBILITY, function (e, data) {
switch (data.name) {
case 'scheduledDates':
if (scope.scheduledDatesSection && scope.scheduledDatesSection.fields
&& scope.scheduledDatesSection.fields[0] && scope.scheduledDatesSection.fields[0].hasOwnProperty('isHidden')) {
scope.scheduledDatesSection.fields[0].isHidden = data.isHidden;
}
break;
case 'actualDates':
if (scope.actualDatesSection && scope.actualDatesSection.fields
&& scope.actualDatesSection.fields[0] && scope.actualDatesSection.fields[0].hasOwnProperty('isHidden')) {
scope.actualDatesSection.fields[0].isHidden = data.isHidden;
}
break;
case 'targetDate':
if (scope.targetDateSection && scope.targetDateSection.fields
&& scope.targetDateSection.fields[0] && scope.targetDateSection.fields[0].hasOwnProperty('isHidden')) {
scope.targetDateSection.fields[0].isHidden = data.isHidden;
}
break;
}
});
var noOfFieldAreasAttached = 0, totalFieldArea;
scope.$on(events.FIELD_AREA_ATTACHED, function (e, screenName) {
totalFieldArea = totalFieldArea || $element.find('.panel-field-area').length;
noOfFieldAreasAttached++;
if (totalFieldArea === noOfFieldAreasAttached) {
console.log('All custom-area directives are loaded!');
screenConfigurationModel.allFieldsLoaded.datesTab = true;
if (screenConfigurationModel.allFieldsLoaded.basicTab || scope.screenLayout.name === ScreenConfigurationVO.prototype.CHANGE_VIEW_SCREEN) {
$timeout(function () {
expressionEventManager.handleTicketLoad();
});
}
}
});
scope.$on('$destroy', function () {
cancelRootScopeListener1();
cancelRootScopeListener2();
});
}
};
}
]);
})();