230 lines
14 KiB
JavaScript
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();
|
|
}
|
|
]);
|
|
})();
|