Skip to content

Commit

Permalink
Fixes #4821, content views allow inclusion/exclusion of repos via fil…
Browse files Browse the repository at this point in the history
…ter UI.
  • Loading branch information
Walden Raines committed Mar 28, 2014
1 parent 1d29f92 commit 6d5c514
Show file tree
Hide file tree
Showing 21 changed files with 718 additions and 239 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ child :content_view => :content_view do
end

child :repositories => :repositories do
attributes :id, :name, :label
extends 'katello/api/v2/repositories/show'
end

node :rules do |filter|
Expand Down
6 changes: 1 addition & 5 deletions app/views/katello/api/v2/content_views/show.json.rabl
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ child :environments => :environments do
end

child :repositories => :repositories do
attributes :id, :name, :label
extends 'katello/api/v2/repositories/show'
end

child :puppet_modules => :puppet_modules do
Expand All @@ -34,10 +34,6 @@ child :versions => :versions do
attributes :environment_ids
end

child :repositories => :repositories do
attributes :id, :name, :label
end

child :components => :components do
extends 'katello/api/v2/content_view_versions/show'
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,53 +179,83 @@ angular.module('Bastion.content-views').config(['$stateProvider', function ($sta
controller: 'FilterDetailsController',
templateUrl: 'content-views/details/filters/views/filter-details.html'
})

.state('content-views.details.filters.details.rpm', {
abstract: true,
collapsed: true,
url: '/filters/:filterId/packages',
controller: 'PackageFilterController',
url: '/filters/:filterId/package',
templateUrl: 'content-views/details/filters/views/package-filter.html'
})
.state('content-views.details.filters.details.rpm.details', {
url: '/details',
collapsed: true,
controller: 'PackageFilterController',
templateUrl: 'content-views/details/filters/views/package-filter-details.html'
})
.state('content-views.details.filters.details.rpm.repositories', {
collapsed: true,
url: '/repositories',
controller: 'FilterRepositoriesController',
templateUrl: 'content-views/details/filters/views/filter-repositories.html'
})

.state('content-views.details.filters.details.package_group', {
abstract: true,
collapsed: true,
template: '<div ui-view></div>'
url: '/filters/:filterId/package-group',
templateUrl: 'content-views/details/filters/views/package-group-filter.html'
})
.state('content-views.details.filters.details.package_group.list', {
collapsed: true,
url: '/filters/:filterId/package_groups/list',
url: '/list',
controller: 'PackageGroupFilterListController',
templateUrl: 'content-views/details/filters/views/package-group-filter.html'
templateUrl: 'content-views/details/filters/views/package-group-filter-details.html'
})
.state('content-views.details.filters.details.package_group.available', {
collapsed: true,
url: '/filters/:filterId/package_groups/available',
url: '/available',
controller: 'AvailablePackageGroupFilterController',
templateUrl: 'content-views/details/filters/views/package-group-filter.html'
templateUrl: 'content-views/details/filters/views/package-group-filter-details.html'
})
.state('content-views.details.filters.details.package_group.repositories', {
collapsed: true,
url: '/repositories',
controller: 'FilterRepositoriesController',
templateUrl: 'content-views/details/filters/views/filter-repositories.html'
})

.state('content-views.details.filters.details.erratum', {
abstract: true,
collapsed: true,
url: '/filters/:filterId/errata',
controller: 'ErrataFilterController',
templateUrl: 'content-views/details/filters/views/errata-filter.html'
})
.state('content-views.details.filters.details.erratum.list', {
collapsed: true,
url: '/filters/:filterId/errata/list',
url: '/list',
controller: 'ErrataFilterListController',
templateUrl: 'content-views/details/filters/views/errata-filter-table.html'
templateUrl: 'content-views/details/filters/views/errata-filter-details.html'
})
.state('content-views.details.filters.details.erratum.available', {
collapsed: true,
url: '/filters/:filterId/errata/available',
url: '/available',
controller: 'AvailableErrataFilterController',
templateUrl: 'content-views/details/filters/views/errata-filter-table.html'
templateUrl: 'content-views/details/filters/views/errata-filter-details.html'
})
.state('content-views.details.filters.details.erratum.dateType', {
collapsed: true,
url: '/filters/:filterId/errata/date_type',
url: '/date_type',
controller: 'DateTypeErrataFilterController',
templateUrl: 'content-views/details/filters/views/date-type-errata-filter.html'
})
.state('content-views.details.filters.details.erratum.repositories', {
collapsed: true,
url: '/repositories',
controller: 'FilterRepositoriesController',
templateUrl: 'content-views/details/filters/views/filter-repositories.html'
})

.state('content-views.details.tasks', {
abstract: true,
collapsed: true,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/**
* Copyright 2014 Red Hat, Inc.
*
* This software is licensed to you under the GNU General Public
* License as published by the Free Software Foundation; either version
* 2 of the License (GPLv2) or (at your option) any later version.
* There is NO WARRANTY for this software, express or implied,
* including the implied warranties of MERCHANTABILITY,
* NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should
* have received a copy of GPLv2 along with this software; if not, see
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*/

/**
* @ngdoc object
* @name Bastion.content-views.controller:FilterRepositoriesController
*
* @requires $scope
* @requires gettext
* @requires Filter
* @requires ContentViewRepositoriesUtl
*
* @description
* Provides a way for users to select which repositories the filter applies to.
*/
angular.module('Bastion.content-views').controller('FilterRepositoriesController',
['$scope', 'gettext', 'Filter', 'ContentViewRepositoriesUtil',
function ($scope, gettext, Filter, ContentViewRepositoriesUtil) {
var refreshTable, success, error;

ContentViewRepositoriesUtil($scope);

refreshTable = function (filter) {
$scope.$parent.filter = filter;

var displayedRepositories = filter['content_view'].repositories,
filterRepositories = filter.repositories;

if (filterRepositories.length === 0) {
displayedRepositories = _.map(displayedRepositories, function (repository) {
repository.selected = true;
return repository;
});
} else {
displayedRepositories = _.map(displayedRepositories, function (repository) {
repository.selected = _.pluck(filterRepositories, 'id').indexOf(repository.id) >= 0;
return repository;
});
}

$scope.repositoriesTable.rows = displayedRepositories;
$scope.showRepos = filterRepositories.length !== 0;
};

success = function (filter) {
refreshTable(filter);
$scope.successMessages = [gettext('Affected repositories have been updated.')];
};

error = function (response) {
$scope.errorMessages = response.data.errors;
};

$scope.successMessages = [];
$scope.errorMessages = [];
$scope.showRepos = false;
$scope.repositoriesTable = {};

$scope.filter.$promise.then(refreshTable);

$scope.updateRepositories = function () {
var repositoryIds = _.pluck($scope.repositoriesTable.getSelected(), 'id');

if (repositoryIds.length === 0) {
$scope.errorMessages = [gettext('You must select at least one repository.')];
} else {
Filter.update({id: $scope.filter.id, 'repository_ids': repositoryIds}, success, error);
}
};

$scope.selectAllRepositories = function () {
Filter.update({id: $scope.filter.id, 'repository_ids': []}, success, error);
};
}]
);
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,27 @@ angular.module('Bastion.content-views').controller('FiltersController',
angular.forEach(filterIds, removeFilter);
};

$scope.getFilterState = function (filter) {
var state;

switch (filter.type) {
case "erratum":
state = "content-views.details.filters.details.erratum.list({filterId: filter.id})";
if (filter.rules[0].types) {
state = "content-views.details.filters.details.erratum.dateType({filterId: filter.id})";
}
break;
case "rpm":
state = "content-views.details.filters.details.rpm({filterId: filter.id})";
break;
case "package_group":
state = "content-views.details.filters.details.package_group.list({filterId: filter.id})";
break;
}

return state;
};

function removeFilter(id) {
var success, failure;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,3 @@
<nav>
<ul class="nav nav-tabs">
<li ng-class="{active: isState('content-views.details.filters.details.erratum.list')}">
<a ui-sref="content-views.details.filters.details.erratum.list({filterId: filter.id})">
<span translate>
List/Remove
</span>
</a>
</li>

<li ng-class="{active: isState('content-views.details.filters.details.erratum.available')}"
ng-show="!contentView.permissions.editable">
<a ui-sref="content-views.details.filters.details.erratum.available({filterId: filter.id})">
<span translate>
Add
</span>
</a>
</li>
</ul>
</nav>

<div ng-if="isState('content-views.details.filters.details.erratum.available')">
<form name="errataForm" class="form-horizontal">
<div ng-include="'content-views/details/filters/views/date-type-errata.html'"></div>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,42 @@
<span page-title ng-model="filter">{{ 'Errata Filter:' | translate }} {{ filter.name }}</span>

<div class="details details-full">
<nav>
<ul class="nav nav-tabs">
<li ng-if="!filter.rules[0].types" ng-class="{active: isState('content-views.details.filters.details.erratum.list')}">
<a ui-sref="content-views.details.filters.details.erratum.list({filterId: filter.id})">
<span translate>
List/Remove
</span>
</a>
</li>

<li ng-if="!filter.rules[0].types" ng-class="{active: isState('content-views.details.filters.details.erratum.available')}"
ng-show="!contentView.permissions.editable">
<a ui-sref="content-views.details.filters.details.erratum.available({filterId: filter.id})">
<span translate>
Add
</span>
</a>
</li>

<li ng-if="filter.rules[0].types" ng-class="{active: isState('content-views.details.filters.details.erratum.dateType')}"
ng-show="!contentView.permissions.editable">
<a ui-sref="content-views.details.filters.details.erratum.dateType({filterId: filter.id})">
<span translate>
Erratum Date Range
</span>
</a>
</li>

<li ng-class="{active: isState('content-views.details.filters.details.erratum.repositories')}"
ng-show="!contentView.permissions.editable">
<a ui-sref="content-views.details.filters.details.erratum.repositories({filterId: filter.id})"
ng-include="'content-views/details/filters/views/partials/filter-repositories-count.html'">
</a>
</li>
</ul>
</nav>

<div ui-view></div>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,41 @@
<span page-title ng-model="filter">{{ 'Filter:' | translate }} {{ filter.name }}</span>

<div class="details details-full">

<header class="details-header">
<h3>
<ol class="breadcrumb">
<li ng-class="{active: isState('content-views.details.filters.list')}">
<a ui-sref="content-views.details.filters.list" translate>Filters</a>
<i class="icon-double-angle-right"></i>
{{ filter.name }}: {{ filter.inclusion | filterType }} {{ filter.type | filterContentType }}
</h3>
</li>

<li ng-if="filter.type === 'erratum'"
ng-class="{active: stateIncludes('content-views.details.filters.details.erratum')}">
<a ng-if="!filter.rules[0].types"
ui-sref="content-views.details.filters.details.erratum.list({filterId: filter.id})">
{{ filter.name }}
</a>
<a ng-if="filter.rules[0].types"
ui-sref="content-views.details.filters.details.erratum.dateType({filterId: filter.id})">
{{ filter.name }}
</a>
</li>

<li ng-if="filter.type === 'rpm'"
ng-class="{active: stateIncludes('content-views.details.filters.details.rpm')}">
<a ui-sref="content-views.details.filters.details.rpm({filterId: filter.id})">
{{ filter.name }}
</a>
</li>

<li ng-if="filter.type === 'package_group'"
ng-class="{active: stateIncludes('content-views.details.filters.details.package_group')}">
<a ui-sref="content-views.details.filters.details.package_group.list({filterId: filter.id})">
{{ filter.name }}
</a>
</li>
</ol>

<header class="details-header">
<h3>{{ filter.name }} ({{ filter.inclusion | filterType }} {{ filter.type | filterContentType }})</h3>
</header>

<div ui-view></div>
Expand Down
Loading

0 comments on commit 6d5c514

Please sign in to comment.