'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(); } ]); })();