mirror of
https://github.com/ansible/awx.git
synced 2026-01-14 03:10:42 -03:30
Fixed issue where search actions were sending two requests. Cleaned up and organized smart search controller
This commit is contained in:
parent
ee6902bbbb
commit
36732d8113
@ -16,71 +16,26 @@ function SmartSearchController (
|
||||
let queryset;
|
||||
let transitionSuccessListener;
|
||||
|
||||
configService.getConfig()
|
||||
.then(config => init(config));
|
||||
|
||||
function init (config) {
|
||||
let version;
|
||||
|
||||
try {
|
||||
[version] = config.version.split('-');
|
||||
} catch (err) {
|
||||
version = 'latest';
|
||||
}
|
||||
|
||||
$scope.documentationLink = `http://docs.ansible.com/ansible-tower/${version}/html/userguide/search_sort.html`;
|
||||
$scope.searchPlaceholder = i18n._('Search');
|
||||
|
||||
if ($scope.defaultParams) {
|
||||
defaults = $scope.defaultParams;
|
||||
} else {
|
||||
// steps through the current tree of $state configurations, grabs default search params
|
||||
const stateConfig = _.find($state.$current.path, step => _.has(step, `params.${searchKey}`));
|
||||
defaults = stateConfig.params[searchKey].config.value;
|
||||
}
|
||||
|
||||
if ($scope.querySet) {
|
||||
queryset = $scope.querySet;
|
||||
} else {
|
||||
queryset = $state.params[searchKey];
|
||||
}
|
||||
|
||||
path = GetBasePath($scope.basePath) || $scope.basePath;
|
||||
generateSearchTags();
|
||||
|
||||
qs.initFieldset(path, $scope.djangoModel)
|
||||
.then((data) => {
|
||||
$scope.models = data.models;
|
||||
$scope.options = data.options.data;
|
||||
$scope.keyFields = _.reduce(data.models[$scope.djangoModel].base, function(result, value, key) {
|
||||
if (value.filterable) {
|
||||
result.push(key);
|
||||
}
|
||||
return result;
|
||||
}, []);
|
||||
if ($scope.list) {
|
||||
$scope.$emit(optionsKey, data.options);
|
||||
}
|
||||
});
|
||||
|
||||
function compareParams (a, b) {
|
||||
for (let key in a) {
|
||||
if (!(key in b) || a[key].toString() !== b[key].toString()) {
|
||||
return false;
|
||||
}
|
||||
const compareParams = (a, b) => {
|
||||
for (let key in a) {
|
||||
if (!(key in b) || a[key].toString() !== b[key].toString()) {
|
||||
return false;
|
||||
}
|
||||
for (let key in b) {
|
||||
if (!(key in a)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for (let key in b) {
|
||||
if (!(key in a)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
if (transitionSuccessListener) {
|
||||
transitionSuccessListener();
|
||||
}
|
||||
const generateSearchTags = () => {
|
||||
const { singleSearchParam } = $scope;
|
||||
$scope.searchTags = qs.createSearchTagsFromQueryset(queryset, defaults, singleSearchParam);
|
||||
};
|
||||
|
||||
const listenForTransitionSuccess = () => {
|
||||
transitionSuccessListener = $transitions.onSuccess({}, trans => {
|
||||
// State has changed - check to see if this is a param change
|
||||
if (trans.from().name === trans.to().name) {
|
||||
@ -99,29 +54,22 @@ function SmartSearchController (
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
$scope.$on('$destroy', transitionSuccessListener);
|
||||
$scope.$watch('disableSearch', disableSearch => {
|
||||
if (disableSearch) {
|
||||
$scope.searchPlaceholder = i18n._('Cannot search running job');
|
||||
} else {
|
||||
$scope.searchPlaceholder = i18n._('Search');
|
||||
}
|
||||
});
|
||||
}
|
||||
const isAnsibleFactField = (termParts) => {
|
||||
const rootField = termParts[0].split('.')[0].replace(/^-/, '');
|
||||
return rootField === 'ansible_facts';
|
||||
};
|
||||
|
||||
function generateSearchTags () {
|
||||
const { singleSearchParam } = $scope;
|
||||
$scope.searchTags = qs.createSearchTagsFromQueryset(queryset, defaults, singleSearchParam);
|
||||
}
|
||||
|
||||
function revertSearch (queryToBeRestored) {
|
||||
const revertSearch = (queryToBeRestored) => {
|
||||
queryset = queryToBeRestored;
|
||||
// https://ui-router.github.io/docs/latest/interfaces/params.paramdeclaration.html#dynamic
|
||||
// This transition will not reload controllers/resolves/views
|
||||
// but will register new $stateParams[$scope.iterator + '_search'] terms
|
||||
if (!$scope.querySet) {
|
||||
$state.go('.', { [searchKey]: queryset });
|
||||
transitionSuccessListener();
|
||||
$state.go('.', { [searchKey]: queryset })
|
||||
.then(() => listenForTransitionSuccess());
|
||||
}
|
||||
qs.search(path, queryset).then((res) => {
|
||||
if ($scope.querySet) {
|
||||
@ -134,18 +82,9 @@ function SmartSearchController (
|
||||
$scope.searchTerm = null;
|
||||
|
||||
generateSearchTags();
|
||||
}
|
||||
|
||||
$scope.toggleKeyPane = () => {
|
||||
$scope.showKeyPane = !$scope.showKeyPane;
|
||||
};
|
||||
|
||||
function isAnsibleFactField (termParts) {
|
||||
const rootField = termParts[0].split('.')[0].replace(/^-/, '');
|
||||
return rootField === 'ansible_facts';
|
||||
}
|
||||
|
||||
function isFilterableBaseField (termParts) {
|
||||
const isFilterableBaseField = (termParts) => {
|
||||
const rootField = termParts[0].split('.')[0].replace(/^-/, '');
|
||||
const listName = $scope.list.name;
|
||||
const baseFieldPath = `models.${listName}.base.${rootField}`;
|
||||
@ -155,9 +94,9 @@ function SmartSearchController (
|
||||
const isBaseModelRelatedSearchTermField = (_.get($scope, `${baseFieldPath}.type`) === 'field');
|
||||
|
||||
return isBaseField && !isBaseModelRelatedSearchTermField && isFilterable;
|
||||
}
|
||||
};
|
||||
|
||||
function isRelatedField (termParts) {
|
||||
const isRelatedField = (termParts) => {
|
||||
const rootField = termParts[0].split('.')[0].replace(/^-/, '');
|
||||
const listName = $scope.list.name;
|
||||
const baseRelatedTypePath = `models.${listName}.base.${rootField}.type`;
|
||||
@ -166,7 +105,69 @@ function SmartSearchController (
|
||||
const isBaseModelRelatedSearchTermField = (_.get($scope, baseRelatedTypePath) === 'field');
|
||||
|
||||
return (isRelatedSearchTermField || isBaseModelRelatedSearchTermField);
|
||||
}
|
||||
};
|
||||
|
||||
configService.getConfig()
|
||||
.then(config => {
|
||||
let version;
|
||||
|
||||
try {
|
||||
[version] = config.version.split('-');
|
||||
} catch (err) {
|
||||
version = 'latest';
|
||||
}
|
||||
|
||||
$scope.documentationLink = `http://docs.ansible.com/ansible-tower/${version}/html/userguide/search_sort.html`;
|
||||
$scope.searchPlaceholder = i18n._('Search');
|
||||
|
||||
if ($scope.defaultParams) {
|
||||
defaults = $scope.defaultParams;
|
||||
} else {
|
||||
// steps through the current tree of $state configurations, grabs default search params
|
||||
const stateConfig = _.find($state.$current.path, step => _.has(step, `params.${searchKey}`));
|
||||
defaults = stateConfig.params[searchKey].config.value;
|
||||
}
|
||||
|
||||
if ($scope.querySet) {
|
||||
queryset = $scope.querySet;
|
||||
} else {
|
||||
queryset = $state.params[searchKey];
|
||||
}
|
||||
|
||||
path = GetBasePath($scope.basePath) || $scope.basePath;
|
||||
generateSearchTags();
|
||||
|
||||
qs.initFieldset(path, $scope.djangoModel)
|
||||
.then((data) => {
|
||||
$scope.models = data.models;
|
||||
$scope.options = data.options.data;
|
||||
$scope.keyFields = _.reduce(data.models[$scope.djangoModel].base, (result, value, key) => {
|
||||
if (value.filterable) {
|
||||
result.push(key);
|
||||
}
|
||||
return result;
|
||||
}, []);
|
||||
if ($scope.list) {
|
||||
$scope.$emit(optionsKey, data.options);
|
||||
}
|
||||
});
|
||||
|
||||
$scope.$on('$destroy', transitionSuccessListener);
|
||||
$scope.$watch('disableSearch', disableSearch => {
|
||||
if (disableSearch) {
|
||||
$scope.searchPlaceholder = i18n._('Cannot search running job');
|
||||
} else {
|
||||
$scope.searchPlaceholder = i18n._('Search');
|
||||
}
|
||||
});
|
||||
|
||||
listenForTransitionSuccess();
|
||||
});
|
||||
|
||||
|
||||
$scope.toggleKeyPane = () => {
|
||||
$scope.showKeyPane = !$scope.showKeyPane;
|
||||
};
|
||||
|
||||
$scope.addTerms = terms => {
|
||||
const { singleSearchParam } = $scope;
|
||||
@ -182,11 +183,13 @@ function SmartSearchController (
|
||||
// This transition will not reload controllers/resolves/views but will register new
|
||||
// $stateParams[searchKey] terms.
|
||||
if (!$scope.querySet) {
|
||||
transitionSuccessListener();
|
||||
$state.go('.', { [searchKey]: queryset })
|
||||
.then(() => {
|
||||
// same as above in $scope.remove. For some reason deleting the page
|
||||
// from the queryset works for all lists except lists in modals.
|
||||
delete $stateParams[searchKey].page;
|
||||
listenForTransitionSuccess();
|
||||
});
|
||||
}
|
||||
|
||||
@ -212,6 +215,7 @@ function SmartSearchController (
|
||||
queryset = qs.removeTermsFromQueryset(queryset, term, isFilterableBaseField, isRelatedField, isAnsibleFactField, singleSearchParam);
|
||||
|
||||
if (!$scope.querySet) {
|
||||
transitionSuccessListener();
|
||||
$state.go('.', { [searchKey]: queryset })
|
||||
.then(() => {
|
||||
// for some reason deleting a tag from a list in a modal does not
|
||||
@ -219,6 +223,7 @@ function SmartSearchController (
|
||||
// that that happened and remove it if it didn't.
|
||||
const clearedParams = qs.removeTermsFromQueryset($stateParams[searchKey], term, isFilterableBaseField, isRelatedField, isAnsibleFactField, singleSearchParam);
|
||||
$stateParams[searchKey] = clearedParams;
|
||||
listenForTransitionSuccess();
|
||||
});
|
||||
}
|
||||
|
||||
@ -246,7 +251,9 @@ function SmartSearchController (
|
||||
queryset = cleared;
|
||||
|
||||
if (!$scope.querySet) {
|
||||
$state.go('.', { [searchKey]: queryset });
|
||||
transitionSuccessListener();
|
||||
$state.go('.', { [searchKey]: queryset })
|
||||
.then(() => listenForTransitionSuccess());
|
||||
}
|
||||
|
||||
qs.search(path, queryset)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user