mirror of
https://github.com/ansible/awx.git
synced 2026-05-09 10:27:37 -02:30
This commit is contained in:
@@ -1,9 +1,7 @@
|
|||||||
export default ['$scope', '$state', 'QuerySet', 'GetBasePath',
|
export default ['$scope', '$state', 'QuerySet', 'GetBasePath',
|
||||||
function($scope, $state, qs, GetBasePath) {
|
function($scope, $state, qs, GetBasePath) {
|
||||||
|
|
||||||
let queryset, path,
|
let queryset, path, order_by;
|
||||||
order_by = $state.params[`${$scope.columnIterator}_search`].order_by,
|
|
||||||
activeField = isDescending(order_by) ? order_by.substring(1, order_by.length) : order_by;
|
|
||||||
|
|
||||||
function isDescending(str) {
|
function isDescending(str) {
|
||||||
if (str){
|
if (str){
|
||||||
@@ -15,15 +13,16 @@ export default ['$scope', '$state', 'QuerySet', 'GetBasePath',
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
function invertOrderBy(str) {
|
function invertOrderBy(str) {
|
||||||
return order_by.charAt(0) === '-' ? `${str.substring(1, str.length)}` : `-${str}`;
|
return str.charAt(0) === '-' ? `${str.substring(1, str.length)}` : `-${str}`;
|
||||||
}
|
}
|
||||||
$scope.orderByIcon = function() {
|
$scope.orderByIcon = function() {
|
||||||
|
order_by = $state.params[`${$scope.columnIterator}_search`].order_by;
|
||||||
// column sort is inactive
|
// column sort is inactive
|
||||||
if (activeField !== $scope.columnField) {
|
if (order_by !== $scope.columnField && order_by !== invertOrderBy($scope.columnField)) {
|
||||||
return 'fa-sort';
|
return 'fa-sort';
|
||||||
}
|
}
|
||||||
// column sort is active (governed by order_by) and descending
|
// column sort is active (governed by order_by) and descending
|
||||||
else if (isDescending(order_by)) {
|
else if (isDescending($state.params[`${$scope.columnIterator}_search`].order_by)) {
|
||||||
return 'fa-sort-down';
|
return 'fa-sort-down';
|
||||||
}
|
}
|
||||||
// column sort is active governed by order_by) and asscending
|
// column sort is active governed by order_by) and asscending
|
||||||
@@ -33,17 +32,19 @@ export default ['$scope', '$state', 'QuerySet', 'GetBasePath',
|
|||||||
};
|
};
|
||||||
|
|
||||||
$scope.toggleColumnOrderBy = function() {
|
$scope.toggleColumnOrderBy = function() {
|
||||||
// toggle active sort order
|
let order_by = $state.params[`${$scope.columnIterator}_search`].order_by;
|
||||||
if (activeField === $scope.columnField) {
|
|
||||||
|
if (order_by === $scope.columnField || order_by === invertOrderBy($scope.columnField)) {
|
||||||
order_by = invertOrderBy(order_by);
|
order_by = invertOrderBy(order_by);
|
||||||
}
|
}
|
||||||
// set new active sort order
|
// set new active sort order
|
||||||
else {
|
else {
|
||||||
order_by = $scope.columnField;
|
order_by = $scope.columnField;
|
||||||
}
|
}
|
||||||
|
|
||||||
queryset = _.merge($state.params[`${$scope.columnIterator}_search`], { order_by: order_by });
|
queryset = _.merge($state.params[`${$scope.columnIterator}_search`], { order_by: order_by });
|
||||||
path = GetBasePath($scope.basePath) || $scope.basePath;
|
path = GetBasePath($scope.basePath) || $scope.basePath;
|
||||||
$state.go('.', { [$scope.iterator + '_search']: queryset });
|
$state.go('.', { [$scope.columnIterator + '_search']: queryset });
|
||||||
qs.search(path, queryset).then((res) =>{
|
qs.search(path, queryset).then((res) =>{
|
||||||
$scope.dataset = res.data;
|
$scope.dataset = res.data;
|
||||||
$scope.collection = res.data.results;
|
$scope.collection = res.data.results;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<th id="{{columnIterator}}-{{columnField}}-header" class="List-tableHeader list-header {{columnCustomClass}}" ng-click="toggleColumnOrderBy()" ng-class="{'list-header-noSort' : columnNoSort === 'true'}">
|
<th id="{{columnIterator}}-{{columnField}}-header" class="List-tableHeader list-header {{columnCustomClass}}" ng-click="toggleColumnOrderBy()" ng-class="{'list-header-noSort' : columnNoSort === 'true'}">
|
||||||
{{columnLabel}}
|
{{columnLabel}}
|
||||||
<i ng-hide="columnNoSort === 'true'" class="fa" ng-class="orderByIcon()">
|
<i ng-hide="columnNoSort === 'true'" class="fa columnSortIcon" ng-class="orderByIcon()">
|
||||||
</th>
|
</th>
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ export default ['$stateParams', '$scope', '$state', 'QuerySet', 'GetBasePath', '
|
|||||||
function stripDefaultParams(params) {
|
function stripDefaultParams(params) {
|
||||||
let stripped =_.pick(params, (value, key) => {
|
let stripped =_.pick(params, (value, key) => {
|
||||||
// setting the default value of a term to null in a state definition is a very explicit way to ensure it will NEVER generate a search tag, even with a non-default value
|
// setting the default value of a term to null in a state definition is a very explicit way to ensure it will NEVER generate a search tag, even with a non-default value
|
||||||
return defaults[key] !== value && key !== 'page' && key !== 'page_size' && defaults[key] !== null;
|
return defaults[key] !== value && key !== 'order_by' && key !== 'page' && key !== 'page_size' && defaults[key] !== null;
|
||||||
});
|
});
|
||||||
return _(stripped).map(qs.decodeParam).flatten().value();
|
return _(stripped).map(qs.decodeParam).flatten().value();
|
||||||
}
|
}
|
||||||
|
|||||||
101
awx/ui/tests/spec/column-sort/column-sort.directive-test.js
Normal file
101
awx/ui/tests/spec/column-sort/column-sort.directive-test.js
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
describe('Directive: column-sort', () =>{
|
||||||
|
|
||||||
|
let $scope, template, $compile, QuerySet, GetBasePath;
|
||||||
|
|
||||||
|
beforeEach(angular.mock.module('templateUrl'));
|
||||||
|
beforeEach(function(){
|
||||||
|
|
||||||
|
this.mock = {
|
||||||
|
dataset: [
|
||||||
|
{name: 'zero', idx: 0},
|
||||||
|
{name: 'one', idx: 1},
|
||||||
|
{name: 'two', idx: 2}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
this.name_field = angular.element(`<column-sort
|
||||||
|
collection="mock"
|
||||||
|
dataset="mock.dataset"
|
||||||
|
base-path="mock"
|
||||||
|
column-iterator="mock"
|
||||||
|
column-field="name"
|
||||||
|
column-label="Name">
|
||||||
|
</column-sort>`);
|
||||||
|
|
||||||
|
this.idx_field = angular.element(`<column-sort
|
||||||
|
collection="mock"
|
||||||
|
dataset="mock.dataset"
|
||||||
|
base-path="mock"
|
||||||
|
column-iterator="mock"
|
||||||
|
column-field="idx"
|
||||||
|
column-label="Index">
|
||||||
|
</column-sort>`);
|
||||||
|
|
||||||
|
this.$state = {
|
||||||
|
params: {},
|
||||||
|
go: jasmine.createSpy('go')
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
angular.mock.module('ColumnSortModule', ($provide) =>{
|
||||||
|
|
||||||
|
|
||||||
|
QuerySet = jasmine.createSpyObj('qs', ['search']);
|
||||||
|
QuerySet.search.and.callFake(() => { return { then: function(){} } });
|
||||||
|
GetBasePath = jasmine.createSpy('GetBasePath');
|
||||||
|
$provide.value('QuerySet', QuerySet);
|
||||||
|
$provide.value('GetBasePath', GetBasePath);
|
||||||
|
$provide.value('$state', this.$state);
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(angular.mock.inject(($templateCache, _$rootScope_, _$compile_) => {
|
||||||
|
template = window.__html__['client/src/shared/column-sort/column-sort.partial.html'];
|
||||||
|
$templateCache.put('/static/partials/shared/column-sort/column-sort.partial.html', template);
|
||||||
|
|
||||||
|
$compile = _$compile_;
|
||||||
|
$scope = _$rootScope_.$new();
|
||||||
|
}));
|
||||||
|
|
||||||
|
it('should be ordered by name', function(){
|
||||||
|
|
||||||
|
this.$state.params = {
|
||||||
|
mock_search: {order_by: 'name'}
|
||||||
|
};
|
||||||
|
|
||||||
|
$compile(this.name_field)($scope);
|
||||||
|
$compile(this.idx_field)($scope)
|
||||||
|
|
||||||
|
$scope.$digest();
|
||||||
|
expect( $(this.name_field).find('.columnSortIcon').hasClass('fa-sort-up') ).toEqual(true);
|
||||||
|
expect( $(this.idx_field).find('.columnSortIcon').hasClass('fa-sort') ).toEqual(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should toggle to ascending name order, then ascending idx, then descending idx', function(){
|
||||||
|
|
||||||
|
this.$state.params = {
|
||||||
|
mock_search: {order_by: 'idx'}
|
||||||
|
};
|
||||||
|
|
||||||
|
$compile(this.name_field)($scope);
|
||||||
|
$compile(this.idx_field)($scope)
|
||||||
|
|
||||||
|
$scope.$digest();
|
||||||
|
|
||||||
|
$(this.name_field).click();
|
||||||
|
expect( $(this.name_field).find('.columnSortIcon').hasClass('fa-sort-up') ).toEqual(true);
|
||||||
|
expect( $(this.idx_field).find('.columnSortIcon').hasClass('fa-sort') ).toEqual(true);
|
||||||
|
|
||||||
|
$(this.idx_field).click();
|
||||||
|
expect( $(this.name_field).find('.columnSortIcon').hasClass('fa-sort') ).toEqual(true);
|
||||||
|
expect( $(this.idx_field).find('.columnSortIcon').hasClass('fa-sort-up') ).toEqual(true);
|
||||||
|
|
||||||
|
$(this.idx_field).click();
|
||||||
|
expect( $(this.name_field).find('.columnSortIcon').hasClass('fa-sort') ).toEqual(true);
|
||||||
|
expect( $(this.idx_field).find('.columnSortIcon').hasClass('fa-sort-down') ).toEqual(true)
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user