mirror of
https://github.com/ansible/awx.git
synced 2026-05-20 15:27:47 -02:30
Merge pull request #3356 from marshmalien/feat-toolbar-sort-projects-list
Add toolbar sort to projects list Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
This commit is contained in:
@@ -46,6 +46,11 @@ function ProjectsStrings (BaseString) {
|
|||||||
HEADER: this.error.HEADER,
|
HEADER: this.error.HEADER,
|
||||||
CALL: this.error.CALL,
|
CALL: this.error.CALL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ns.sort = {
|
||||||
|
NAME_ASCENDING: t.s('Name (Ascending)'),
|
||||||
|
NAME_DESCENDING: t.s('Name (Descending)')
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
ProjectsStrings.$inject = ['BaseStringService'];
|
ProjectsStrings.$inject = ['BaseStringService'];
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ function projectsListController (
|
|||||||
};
|
};
|
||||||
vm.dataset = Dataset.data;
|
vm.dataset = Dataset.data;
|
||||||
vm.projects = Dataset.data.results;
|
vm.projects = Dataset.data.results;
|
||||||
|
|
||||||
$scope.$watch('vm.dataset.count', () => {
|
$scope.$watch('vm.dataset.count', () => {
|
||||||
$scope.$emit('updateCount', vm.dataset.count, 'projects');
|
$scope.$emit('updateCount', vm.dataset.count, 'projects');
|
||||||
});
|
});
|
||||||
@@ -46,8 +47,49 @@ function projectsListController (
|
|||||||
} else {
|
} else {
|
||||||
vm.activeId = '';
|
vm.activeId = '';
|
||||||
}
|
}
|
||||||
|
setToolbarSort();
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
|
function setToolbarSort () {
|
||||||
|
const orderByValue = _.get($state.params, 'project_search.order_by');
|
||||||
|
const sortValue = _.find(vm.toolbarSortOptions, (option) => option.value === orderByValue);
|
||||||
|
if (sortValue) {
|
||||||
|
vm.toolbarSortValue = sortValue;
|
||||||
|
} else {
|
||||||
|
vm.toolbarSortValue = toolbarSortDefault;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const toolbarSortDefault = {
|
||||||
|
label: `${strings.get('sort.NAME_ASCENDING')}`,
|
||||||
|
value: 'name'
|
||||||
|
};
|
||||||
|
|
||||||
|
vm.toolbarSortOptions = [
|
||||||
|
toolbarSortDefault,
|
||||||
|
{
|
||||||
|
label: `${strings.get('sort.NAME_DESCENDING')}`,
|
||||||
|
value: '-name'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
vm.toolbarSortValue = toolbarSortDefault;
|
||||||
|
|
||||||
|
vm.onToolbarSort = (sort) => {
|
||||||
|
vm.toolbarSortValue = sort;
|
||||||
|
|
||||||
|
const queryParams = Object.assign(
|
||||||
|
$state.params.project_search,
|
||||||
|
{ order_by: sort.value }
|
||||||
|
);
|
||||||
|
|
||||||
|
qs.search(GetBasePath(vm.list.basePath), queryParams)
|
||||||
|
.then(({ data }) => {
|
||||||
|
vm.dataset = data;
|
||||||
|
vm.projects = vm.dataset.results;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
$scope.$on('ws-jobs', (e, data) => {
|
$scope.$on('ws-jobs', (e, data) => {
|
||||||
$log.debug(data);
|
$log.debug(data);
|
||||||
if (vm.projects) {
|
if (vm.projects) {
|
||||||
|
|||||||
@@ -21,10 +21,13 @@
|
|||||||
</div>
|
</div>
|
||||||
<at-list-toolbar
|
<at-list-toolbar
|
||||||
ng-if="vm.projects.length > 0"
|
ng-if="vm.projects.length > 0"
|
||||||
sort-only="false"
|
|
||||||
on-collapse="vm.onCollapse"
|
|
||||||
on-expand="vm.onExpand"
|
on-expand="vm.onExpand"
|
||||||
is-collapsed="vm.isCollapsed">
|
on-collapse="vm.onCollapse"
|
||||||
|
is-collapsed="vm.isCollapsed"
|
||||||
|
sort-only="false"
|
||||||
|
sort-value="vm.toolbarSortValue"
|
||||||
|
sort-options="vm.toolbarSortOptions"
|
||||||
|
on-sort="vm.onToolbarSort">
|
||||||
</at-list-toolbar>
|
</at-list-toolbar>
|
||||||
<at-list results="vm.projects">
|
<at-list results="vm.projects">
|
||||||
<at-row ng-repeat="project in vm.projects"
|
<at-row ng-repeat="project in vm.projects"
|
||||||
@@ -44,7 +47,7 @@
|
|||||||
<div aw-tool-tip="{{ project.scm_update_tooltip }}"
|
<div aw-tool-tip="{{ project.scm_update_tooltip }}"
|
||||||
data-tip-watch="project.scm_update_tooltip"
|
data-tip-watch="project.scm_update_tooltip"
|
||||||
data-placement="top">
|
data-placement="top">
|
||||||
<div class="at-RowAction"
|
<div class="at-RowAction"
|
||||||
ng-class="{'at-RowAction--disabled': project.scm_update_disabled }"
|
ng-class="{'at-RowAction--disabled': project.scm_update_disabled }"
|
||||||
ng-click="vm.SCMUpdate(project.id, $event)"
|
ng-click="vm.SCMUpdate(project.id, $event)"
|
||||||
ng-show="project.summary_fields.user_capabilities.start">
|
ng-show="project.summary_fields.user_capabilities.start">
|
||||||
@@ -56,16 +59,16 @@
|
|||||||
</at-row-action>
|
</at-row-action>
|
||||||
<at-row-action icon="fa-trash" ng-click="vm.deleteProject(project.id, project.name)"
|
<at-row-action icon="fa-trash" ng-click="vm.deleteProject(project.id, project.name)"
|
||||||
ng-show="(project.status !== 'updating'
|
ng-show="(project.status !== 'updating'
|
||||||
&& project.status !== 'running'
|
&& project.status !== 'running'
|
||||||
&& project.status !== 'pending'
|
&& project.status !== 'pending'
|
||||||
&& project.status !== 'waiting')
|
&& project.status !== 'waiting')
|
||||||
&& project.summary_fields.user_capabilities.delete">
|
&& project.summary_fields.user_capabilities.delete">
|
||||||
</at-row-action>
|
</at-row-action>
|
||||||
<at-row-action icon="fa-minus-circle" ng-click="vm.cancelUpdate(project)"
|
<at-row-action icon="fa-minus-circle" ng-click="vm.cancelUpdate(project)"
|
||||||
ng-show="(project.status == 'updating'
|
ng-show="(project.status == 'updating'
|
||||||
|| project.status == 'running'
|
|| project.status == 'running'
|
||||||
|| project.status == 'pending'
|
|| project.status == 'pending'
|
||||||
|| project.status == 'waiting')
|
|| project.status == 'waiting')
|
||||||
&& project.summary_fields.user_capabilities.start">
|
&& project.summary_fields.user_capabilities.start">
|
||||||
</at-row-action>
|
</at-row-action>
|
||||||
</div>
|
</div>
|
||||||
@@ -77,7 +80,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<at-truncate string="{{ project.scm_revision }}" maxLength="7"></at-truncate>
|
<at-truncate string="{{ project.scm_revision }}" maxLength="7"></at-truncate>
|
||||||
</div>
|
</div>
|
||||||
<at-row-item
|
<at-row-item
|
||||||
label-value="{{:: vm.strings.get('list.ROW_ITEM_LABEL_ORGANIZATION')}}"
|
label-value="{{:: vm.strings.get('list.ROW_ITEM_LABEL_ORGANIZATION')}}"
|
||||||
value="{{ project.summary_fields.organization.name }}"
|
value="{{ project.summary_fields.organization.name }}"
|
||||||
value-link="/#/organizations/{{ project.organization }}">
|
value-link="/#/organizations/{{ project.organization }}">
|
||||||
|
|||||||
@@ -113,6 +113,12 @@ function ComponentsStrings (BaseString) {
|
|||||||
ns.list = {
|
ns.list = {
|
||||||
DEFAULT_EMPTY_LIST: t.s('Please add items to this list.')
|
DEFAULT_EMPTY_LIST: t.s('Please add items to this list.')
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ns.toolbar = {
|
||||||
|
COMPACT: t.s('Compact'),
|
||||||
|
EXPANDED: t.s('Expanded'),
|
||||||
|
SORT_BY: t.s('SORT BY')
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
ComponentsStrings.$inject = ['BaseStringService'];
|
ComponentsStrings.$inject = ['BaseStringService'];
|
||||||
|
|||||||
@@ -96,6 +96,43 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.at-List-toolbarDropdown {
|
||||||
|
border-top-right-radius: @at-border-radius;
|
||||||
|
padding: 2px 10px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
cursor: pointer;
|
||||||
|
background: @at-gray-f2;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-toggle {
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-toggleText {
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-menu {
|
||||||
|
border-bottom-left-radius: @at-border-radius;
|
||||||
|
border-bottom-right-radius: @at-border-radius;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
left: auto;
|
||||||
|
margin: 0;
|
||||||
|
right: 0;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-menuHeader {
|
||||||
|
color: @at-gray-646972;
|
||||||
|
font-weight: bold;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.at-List-container {
|
.at-List-container {
|
||||||
border: @at-border-default-width solid @at-color-list-border;
|
border: @at-border-default-width solid @at-color-list-border;
|
||||||
border-radius: @at-border-radius;
|
border-radius: @at-border-radius;
|
||||||
|
|||||||
@@ -1,5 +1,12 @@
|
|||||||
const templateUrl = require('~components/list/list-toolbar.partial.html');
|
const templateUrl = require('~components/list/list-toolbar.partial.html');
|
||||||
|
|
||||||
|
function AtListToolbar (strings) {
|
||||||
|
const vm = this || {};
|
||||||
|
vm.strings = strings;
|
||||||
|
}
|
||||||
|
|
||||||
|
AtListToolbar.$inject = ['ComponentsStrings'];
|
||||||
|
|
||||||
function atListToolbar () {
|
function atListToolbar () {
|
||||||
return {
|
return {
|
||||||
restrict: 'E',
|
restrict: 'E',
|
||||||
@@ -9,9 +16,14 @@ function atListToolbar () {
|
|||||||
scope: {
|
scope: {
|
||||||
onExpand: '=',
|
onExpand: '=',
|
||||||
onCollapse: '=',
|
onCollapse: '=',
|
||||||
sortOnly: '=',
|
|
||||||
isCollapsed: '=',
|
isCollapsed: '=',
|
||||||
}
|
onSort: '<',
|
||||||
|
sortOnly: '=',
|
||||||
|
sortOptions: '<',
|
||||||
|
sortValue: '<'
|
||||||
|
},
|
||||||
|
controller: AtListToolbar,
|
||||||
|
controllerAs: 'vm'
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,24 @@
|
|||||||
<div class="at-List-toolbar--attached">
|
<div class="at-List-toolbar--attached">
|
||||||
<div ng-class="isCollapsed ? 'active' : ''" ng-if="!sortOnly" class="at-List-toolbar-item" ng-click="onCollapse()">Compact</div>
|
<div ng-class="isCollapsed ? 'active' : ''" ng-if="!sortOnly" class="at-List-toolbar-item" ng-click="onCollapse()">{{ vm.strings.get('toolbar.COMPACT') }}</div>
|
||||||
<div ng-class="!isCollapsed ? 'active' : ''" ng-if="!sortOnly" class="at-List-toolbar-item" ng-click="onExpand()">Expanded</div>
|
<div ng-class="!isCollapsed ? 'active' : ''" ng-if="!sortOnly" class="at-List-toolbar-item" ng-click="onExpand()">{{ vm.strings.get('toolbar.EXPANDED') }}</div>
|
||||||
<div class="at-List-toolbar-item">Sort</div>
|
<div ng-if="sortOptions" class="at-List-toolbarDropdown dropdown">
|
||||||
|
<button
|
||||||
|
class="at-List-toolbarDropdown-toggle dropdown-toggle"
|
||||||
|
data-display="static"
|
||||||
|
data-toggle="dropdown">
|
||||||
|
<span class="at-List-toolbarDropdown-toggleText">{{ sortValue.label }}</span>
|
||||||
|
<i class="fa fa-angle-down" aria-hidden="true"></i>
|
||||||
|
</button>
|
||||||
|
<ul class="at-List-toolbarDropdown-menu dropdown-menu">
|
||||||
|
<li class="at-List-toolbarDropdown-menuHeader dropdown-item">
|
||||||
|
{{ vm.strings.get('toolbar.SORT_BY') }}
|
||||||
|
</li>
|
||||||
|
<li
|
||||||
|
class="dropdown-item"
|
||||||
|
ng-repeat="option in sortOptions"
|
||||||
|
ng-click="onSort(option)">
|
||||||
|
{{ option.label }}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
Reference in New Issue
Block a user