1
0
mirror of https://github.com/ansible/awx.git synced 2024-10-31 23:51:09 +03:00

Present a single date picker for host-to-host

This commit is contained in:
Joe Fiorini 2015-06-17 15:20:20 -04:00
parent 0d81d4a62b
commit 6edee0a864
8 changed files with 114 additions and 108 deletions

View File

@ -0,0 +1,36 @@
export default
function dedupeVersions(nonEmptyResults) {
if (_.any(nonEmptyResults, 'versions.length', 0)) {
return _.pluck(nonEmptyResults, 'versions[0]');
}
var firstTimestamp = nonEmptyResults[0].versions[0].timestamp;
var hostIdsWithDupes =
_(nonEmptyResults)
.pluck('versions[0]')
.filter('timestamp', firstTimestamp)
.map(function(version, index) {
return nonEmptyResults[index].hostId;
})
.value();
if (hostIdsWithDupes.length === 1) {
return _.pluck(nonEmptyResults, 'versions[0]');
}
var bestScanResults = _.max(nonEmptyResults, "versions.length");
return nonEmptyResults.map(function(scan, index) {
var hasDupe =
_.include(hostIdsWithDupes, scan.hostId);
if (hasDupe && index === 1) {
return bestScanResults.versions[0];
} else {
return bestScanResults.versions[1];
}
});
}

View File

@ -51,7 +51,8 @@ function (Rest, GetBasePath, ProcessErrors, _) {
Rest.setUrl(url);
promise = Rest.get();
return promise.then(function(response) {
return response.data.results;
versionParams.versions = response.data.results;
return versionParams;
}).catch(function (response) {
ProcessErrors(null, response.data, response.status, null, {
hdr: 'Error!',

View File

@ -4,15 +4,20 @@
* All Rights Reserved
*************************************************/
import dedupeVersions from './dedupe-versions';
export default
[ 'factScanDataService',
'getModuleOptions',
'resolveVersions',
'resolveEmptyVersions',
'lodashAsPromised',
function(factScanDataService, getModuleOptions, resolveVersions, _) {
function(factScanDataService, getModuleOptions, resolveEmptyVersions, _) {
return function(hostIds, moduleName, leftDate, rightDate) {
var singleHostMode = false;
if (hostIds.length === 1) {
singleHostMode = true;
hostIds = hostIds.concat(hostIds[0]);
}
@ -27,26 +32,36 @@ export default
}
];
return _(hostVersionParams)
.map(function(versionParam) {
var versionWithRequest =
[ versionParam,
factScanDataService.
getVersion(versionParam)
];
return _(factScanDataService.getVersion(hostVersionParams[1]))
.then(function(result) {
return resolveEmptyVersions(result);
}).thenAll(function(firstResult) {
return versionWithRequest;
}).thenAll(function(versions) {
return resolveVersions(versions);
}, true)
.thenMap(function(versionData) {
return factScanDataService.getVersion(hostVersionParams[0])
.then(function(secondResult) {
if (_.isEmpty(secondResult.versions)) {
secondResult = resolveEmptyVersions(secondResult);
}
return [firstResult, secondResult];
});
}).thenAll(function(results) {
var finalSet;
if (singleHostMode) {
finalSet = dedupeVersions(results.reverse());
} else {
finalSet = _.pluck(results, 'versions[0]').reverse();
}
return finalSet;
}).thenMap(function(versionData) {
if (versionData) {
return factScanDataService.getFacts(versionData);
} else {
return { fact: [] };
}
})
.thenAll(function(hostFacts) {
}).thenAll(function(hostFacts) {
return hostFacts;
});
};

View File

@ -0,0 +1,31 @@
import moment from 'tower/shared/moment/moment';
function resolveEmptyVersions(service, _, candidate, previousResult) {
candidate = _.merge({}, candidate);
if (_.isEmpty(candidate.versions)) {
var originalStartDate = candidate.dateRange.from.clone();
if (!_.isUndefined(previousResult)) {
candidate.dateRange.from = moment(previousResult.versions[0].timestamp);
} else {
candidate.dateRange.from = originalStartDate.clone().subtract(1, 'year');
}
candidate.dateRange.to = originalStartDate;
return service.getVersion(candidate);
}
return _.promise(candidate);
}
export default
[ 'factScanDataService',
'lodashAsPromised',
function(factScanDataService, lodash) {
return _.partial(resolveEmptyVersions, factScanDataService, lodash);
}
];

View File

@ -1,86 +0,0 @@
function resolveVersions(service, _, results) {
function transformToObjects(versionArray) {
var converted = versionArray[0];
converted.versions = versionArray[1];
return converted;
}
function resolveEmpties(result) {
var newResult = _.merge({}, result);
if (_.isEmpty(newResult.versions)) {
var originalStartDate = result.dateRange.from.clone();
newResult.dateRange.from = originalStartDate.clone().subtract(1, 'year');
newResult.dateRange.to = originalStartDate;
return [newResult, service.getVersion(newResult)];
}
return [newResult, _.promise(newResult.versions)];
}
function resolveDuplicates(nonEmptyResults) {
var allSameHost =
_.every(nonEmptyResults, { 'hostId': nonEmptyResults[0].hostId });
if (allSameHost) {
if (_.any(nonEmptyResults, 'versions.length', 0)) {
return _.pluck(nonEmptyResults, 'versions[0]');
}
var firstTimestamp = nonEmptyResults[0].versions[0].timestamp;
var hostIdsWithDupes =
_(nonEmptyResults)
.pluck('versions[0]')
.filter('timestamp', firstTimestamp)
.map(function(version, index) {
return nonEmptyResults[index].hostId;
})
.value();
if (hostIdsWithDupes.length === 1) {
return _.pluck(nonEmptyResults, 'versions[0]');
}
return nonEmptyResults.map(function(scan, index) {
var hasDupe =
_.include(hostIdsWithDupes, scan.hostId);
if (hasDupe && index === 1) {
return scan.versions[1];
} else {
return scan.versions[0];
}
});
} else {
return _.pluck(nonEmptyResults, 'versions[0]');
}
}
return _(results)
.map(transformToObjects)
.map(resolveEmpties)
.thenAll(function(resolved) {
var versionObjects = resolved.map(transformToObjects);
return resolveDuplicates(versionObjects);
}, true)
.value();
}
export default
[ 'factScanDataService',
'lodashAsPromised',
function(factScanDataService, lodash) {
return _.partial(resolveVersions, factScanDataService, lodash);
}
];

View File

@ -8,7 +8,7 @@ import route from './system-tracking.route';
import factScanDataService from './data-services/fact-scan-data.service';
import getDataForComparison from './data-services/get-data-for-comparison.factory';
import getModuleOptions from './data-services/get-module-options.factory';
import resolveVersions from './data-services/resolve-versions.factory';
import resolveEmptyVersions from './data-services/resolve-empty-versions.factory';
import controller from './system-tracking.controller';
import stringOrDateFilter from './string-or-date.filter';
import shared from 'tower/shared/main';
@ -24,7 +24,7 @@ export default
.service('factScanDataService', factScanDataService)
.factory('getDataForComparison', getDataForComparison)
.factory('getModuleOptions', getModuleOptions)
.factory('resolveVersions', resolveVersions)
.factory('resolveEmptyVersions', resolveEmptyVersions)
.filter('stringOrDate', stringOrDateFilter)
.controller('systemTracking', controller)
.config(['$routeProvider', function($routeProvider) {

View File

@ -23,11 +23,17 @@ function controller($rootScope,
var hosts = $routeParams.model.hosts;
var moduleParam = $routeParams.module || 'packages';
$scope.compareMode =
hostIds.length === 1 ? 'single-host' : 'host-to-host';
$scope.hostIds = $routeParams.hosts;
$scope.inventory = $routeParams.model.inventory;
$scope.factModulePickersLabelLeft = "Compare latest facts collected on or before";
$scope.factModulePickersLabelRight = "To latest facts collected on or before";
if ($scope.compareMode === 'host-to-host') {
$scope.factModulePickersLabelLeft = "Compare latest facts collected across both hosts on or before";
} else {
$scope.factModulePickersLabelLeft = "Compare latest facts collected on or before";
$scope.factModulePickersLabelRight = "To latest facts collected on or before";
}
$scope.modules = moduleOptions;
@ -53,6 +59,9 @@ function controller($rootScope,
var rightRange = searchConfig.rightRange;
var activeModule = searchConfig.module;
if ($scope.compareMode === 'host-to-host') {
rightRange = searchConfig.leftRange;
}
waitIndicator('start');

View File

@ -10,7 +10,7 @@
<span class="FactModulePickers-label">{{ factModulePickersLabelLeft }}</span>
<date-picker date="leftDate"></date-picker>
</div>
<div class="FactModulePickers-dateContainer FactModulePickers-dateContainer--right">
<div class="FactModulePickers-dateContainer FactModulePickers-dateContainer--right" ng-show="compareMode == 'single-host'">
<span class="FactModulePickers-label">{{ factModulePickersLabelRight }}</span>
<date-picker date="rightDate"></date-picker>
</div>