SmartIT_Extensions/BMC/smart-it-full-helix/scripts/app/pwa/change-calendar-controller.js

230 lines
14 KiB
JavaScript

'use strict';
(function () {
'use strict';
angular.module('pwa')
.controller('ChangeCalendarController', ['$scope', '$state', '$stateParams', 'metadataModel', 'userModel', 'layoutConfigurationModel', 'screenConfigurationModel', 'searchModel', '$q', '$timeout', 'utilityFunctions', 'collisionModel', 'events', '$rootScope',
function ($scope, $state, $stateParams, metadataModel, userModel, layoutConfigurationModel, screenConfigurationModel, searchModel, $q, $timeout, utilityFunctions, collisionModel, events, $rootScope) {
function init() {
$scope.editMode = true;
$scope.isNew = true;
$scope.changeMetadata = {};
$scope.draftCreated = false;
$scope.context = new ChangeVO({
type: EntityVO.TYPE_CHANGE,
scheduledStartDatePicker: { open: false },
scheduledEndDatePicker: { open: false },
actualStartDatePicker: { open: false },
actualEndDatePicker: { open: false },
targetDatePicker: { open: false },
customFields: {},
needsReloadingRiskQuestions: true,
accessMappings: {}
});
metadataModel.getMetadataByType(EntityVO.TYPE_CHANGE).then(function (metadata) {
$scope.collisionStatuses = metadata.collisionStatuses;
});
$scope.$emit(events.INSIDE_CHANGE_CALENDAR);
// Change Calendar loaded - inform PV
$scope.changeCalendarLoaded();
}
$scope.$watch('model.context', function () {
if ($scope.model.context) {
$scope.loadDefaultData();
}
});
$scope.defaultData = $stateParams.defaultData || '';
$scope.loadDefaultData = function () {
if ($scope.defaultData && $scope.defaultData.split('|').length === 4) {
$scope.model.context.scheduledStartDate = new Date(Number($scope.defaultData.split('|')[1]));
$scope.model.context.scheduledEndDate = new Date(Number($scope.defaultData.split('|')[2]));
$scope.model.context.id = $scope.defaultData.split('|')[0];
$scope.model.context.displayId = $scope.model.context.id;
$scope.model.mode = $scope.defaultData.split('|')[3];
$scope.defaultData = null;
}
};
$scope.changeCalendarLoaded = function () {
var domain = localStorage.getItem('pwaDomain'), iframeContent = window.parent, parcelData;
if (domain && iframeContent) {
parcelData = {
eventType: 'changeCalendarLoaded',
eventData: true
};
utilityFunctions.windowPostMessage(iframeContent, parcelData, domain);
}
};
$scope.selections = {
companies: []
};
$scope.changeMetadata = {};
$scope.handleFilterChange = function () {
if ($scope.model.context.id) {
collisionModel.changeCalendarGet($scope.model.context.id, $scope.model.context.scheduledStartDate, $scope.model.context.scheduledEndDate, buildFilterCriteria(), $scope.model.mode).then(function (data) {
$scope.model.loadingCollisions = false;
$scope.model.collisions = data;
$scope.model.collisions.scheduledStartDate = $scope.model.context.scheduledStartDate;
$scope.model.collisions.scheduledEndDate = $scope.model.context.scheduledEndDate;
});
}
};
$scope.handleShowWeekend = function (flag) {
var domain = localStorage.getItem('pwaDomain'), parcelData, iframeContent = window.parent;
if (domain && iframeContent) {
parcelData = { eventType: 'showWeekends', eventData: flag };
utilityFunctions.windowPostMessage(iframeContent, parcelData, domain);
}
};
$scope.handleDateChangeOnCalendar = function (newValue, oldValue, reference) {
var newDate, oldDate, domain, parcelData, iframeContent;
newDate = newValue ? newValue.valueOf() : newValue;
oldDate = oldValue ? oldValue.valueOf() : oldValue;
if (newDate && oldDate && (newDate !== oldDate)) {
domain = localStorage.getItem('pwaDomain');
iframeContent = window.parent;
if (domain && iframeContent) {
parcelData = {
eventType: 'dateChange',
eventData: 'schedule' + reference.charAt(0).toUpperCase() + reference.slice(1) + 'Date=' + newDate
};
utilityFunctions.windowPostMessage(iframeContent, parcelData, domain);
}
}
};
$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.addressCollisions = function (addressedCollisions) {
$scope.model.addressedCollisions = {};
_.forEach(addressedCollisions, function (collision) {
$scope.model.addressedCollisions[collision.id] = !collision.ciCount;
});
};
window.onmessage = handleMessage;
function handleMessage(e) {
$timeout(function () {
if (typeof e.data === 'string' && utilityFunctions.checkIfJson(e.data)) {
var dataObj = JSON.parse(e.data), scheduleStart, scheduleEnd, changeId, mode, eventData;
if (dataObj) {
switch (dataObj.eventType) {
case 'changeCalendar':
eventData = dataObj.eventData.split(':');
scheduleStart = Number(eventData[0].split('=')[1]) * 1000;
scheduleEnd = Number(eventData[1].split('=')[1]) * 1000;
changeId = eventData[2].split('=')[1];
mode = eventData[3].split('=')[1];
$scope.model.context.scheduledStartDate = new Date(scheduleStart);
$scope.model.context.scheduledEndDate = new Date(scheduleEnd);
$scope.model.context.id = changeId;
$scope.model.context.displayId = changeId;
$scope.model.mode = mode;
$q.all([collisionModel.changeCalendarGet(changeId, new Date(scheduleStart), new Date(scheduleEnd), buildFilterCriteria(), mode),
collisionModel.changeCalendarCollisionGet(new Date(scheduleStart), new Date(scheduleEnd), changeId, mode)]).then(function (response) {
var calendarData = response[0];
var collisionData = response[1];
$scope.model.loadingCollisions = false;
$scope.model.collisions = calendarData;
$scope.model.collisions.scheduledStartDate = $scope.model.context.scheduledStartDate;
$scope.model.collisions.scheduledEndDate = $scope.model.context.scheduledEndDate;
if (collisionData) {
$scope.collisionsCopy = collisionData;
$scope.collisionsCopy.changeList.filter(function (item) {
if (item.id === $scope.model.context.id) {
$scope.collisionsCopy.changeList.splice($scope.collisionsCopy.changeList.indexOf(item), 1);
}
});
$scope.model.collisions.changeList = $scope.collisionsCopy.changeList;
$scope.selectAllToggle(false);
$scope.addressCollisions($scope.model.collisions.changeList);
$rootScope.$emit(events.CHANGE_COLLISION_STATUS_CHANGED, $scope.model.collisions.changeList);
}
});
break;
case 'resolveCollision':
if ($scope.collisionsCopy && $scope.collisionsCopy.changeList.length) {
var splitColon, CiData, chageData, currentStatusesData, newStatus, cis, changeIds, currentStatuses, status;
splitColon = dataObj.eventData.split(':');
CiData = splitColon[0];
chageData = splitColon[1];
currentStatusesData = splitColon[2];
newStatus = splitColon[3];
cis = CiData.split('|');
changeIds = chageData.split('|');
currentStatuses = currentStatusesData.split('|');
status = _.find($scope.collisionStatuses, { name: newStatus });
for (var i = 0; i < cis.length; i++) {
var foundChange = findChangeItem(changeIds[i]);
if (foundChange) {
_.each(foundChange.configurationItems, function (ci) {
if (ci.id === cis[i]) {
ci.selected = true;
ci.status = { name: currentStatuses[i] };
}
});
}
}
$scope.collisionsCopy.changeList.filter(function (change) {
for (var 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 = '';
if (status.name === 'Resolved' || status.name === 'Ignored') {
change.ciCount = change.ciCount - 1;
}
change.configurationItems[count].modified = true;
}
}
});
$scope.model.collisions.changeList = $scope.collisionsCopy.changeList;
$scope.selectAllToggle(false);
$scope.addressCollisions($scope.model.collisions.changeList);
$rootScope.$emit(events.CHANGE_COLLISION_STATUS_CHANGED, $scope.model.collisions.changeList);
}
break;
default:
return;
}
}
}
});
}
function findChangeItem(changeId) {
return _.find($scope.collisionsCopy.changeList, { displayId: changeId });
}
function buildFilterCriteria() {
var filters = angular.copy($scope.filters.selected), filterCriteria = {};
_.forEach(filters, function (filter) {
var criteria = filter.criteria, isMultiSelect = _.isArray(criteria.value), name = criteria.name;
if (filterCriteria[name]) {
if (isMultiSelect) {
filterCriteria[name] = _.union(filterCriteria[name], criteria.value);
}
else {
filters.splice(_.findIndex(filters, { name: filter.name }), 1);
filterCriteria[name] = criteria.value;
}
}
else {
filterCriteria[name] = criteria.value;
}
});
return filterCriteria;
}
init();
}
]);
})();