Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[webui] Add request tables to group#show #3782

Merged
merged 1 commit into from
Sep 8, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/api/app/assets/javascripts/webui/application.js.erb
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
//= require webui/application/requests_table
//= require webui/application/image_templates
//= require webui/application/kiwi_editor
//= require webui/application/groups

function remove_dialog() {
$(this).parents('.dialog:visible').remove();
Expand Down
15 changes: 15 additions & 0 deletions src/api/app/assets/javascripts/webui/application/groups.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
$(document).ready(function(){
$('#group-members-table').dataTable();
$('.header-tabs li a').click(function() {
// Select tab
$('.header-tabs li').removeClass('selected');
$(this).parent().addClass('selected');
// Show and hide content
var id = $(this).data("id");
$('.table-container').addClass('hidden');
$('#' + id).removeClass('hidden');
// Show reload button when tab is changed
$(this).parent().parent().find('.result_reload').hide();
$(this).siblings('.result_reload').show();
});
});
23 changes: 23 additions & 0 deletions src/api/app/controllers/webui/groups/bs_requests_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
module Webui
module Groups
class BsRequestsController < WebuiController
include Webui::Mixins::BsRequestsControllerMixin
before_action :set_group

REQUEST_METHODS = {
'requests_in_table' => :incoming_requests,
'reviews_in_table' => :involved_reviews
}

private

def set_group
@user_or_group = Group.find_by_title!(params[:title])
end

def request_method
REQUEST_METHODS[params[:dataTableId]]
end
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
module Webui
module Mixins
module BsRequestsControllerMixin
def index
parsed_params = BsRequest::DataTable::ParamsParser.new(params).parsed_params
requests_query = BsRequest::DataTable::FindForUserOrGroupQuery.new(@user_or_group, request_method, parsed_params)
@requests_data_table = BsRequest::DataTable::Table.new(requests_query, parsed_params[:draw])

respond_to do |format|
format.json { render 'webui/shared/bs_requests/index' }
end
end
end
end
end
14 changes: 5 additions & 9 deletions src/api/app/controllers/webui/users/bs_requests_controller.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
module Webui
module Users
class BsRequestsController < WebuiController
include Webui::Mixins::BsRequestsControllerMixin
before_action :check_display_user
before_action :set_user

REQUEST_METHODS = {
'all_requests_table' => :requests,
Expand All @@ -11,18 +13,12 @@ class BsRequestsController < WebuiController
'reviews_in_table' => :involved_reviews
}

def index
parsed_params = BsRequest::DataTable::ParamsParser.new(params).parsed_params
requests_query = BsRequest::DataTable::FindForUserQuery.new(@displayed_user, request_method, parsed_params)
@requests_data_table = BsRequest::DataTable::Table.new(requests_query, parsed_params[:draw])
private

respond_to do |format|
format.json
end
def set_user
@user_or_group = @displayed_user
end

private

def request_method
REQUEST_METHODS[params[:dataTableId]] || :requests
end
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
class BsRequest
module DataTable
class FindForUserQuery
class FindForUserOrGroupQuery
attr_reader :user, :params

def initialize(user, request_method, params)
@user = user
def initialize(user_or_group, request_method, params)
@user_or_group = user_or_group
@request_method = request_method
@params = params
end
Expand All @@ -31,11 +31,15 @@ def count_requests
def requests_query(search = nil)
raise ArgumentError unless valid_request_methods.include?(@request_method)

@user.send(@request_method, search)
@user_or_group.send(@request_method, search)
end

def valid_request_methods
Webui::Users::BsRequestsController::REQUEST_METHODS.values
if @user_or_group.is_a?(User)
Webui::Users::BsRequestsController::REQUEST_METHODS.values
else
Webui::Groups::BsRequestsController::REQUEST_METHODS.values
end
end
end
end
Expand Down
13 changes: 13 additions & 0 deletions src/api/app/models/group.rb
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,19 @@ def display_name
address.display_name = title
address.format
end

def involved_reviews(search = nil)
BsRequest.find_for(
group: title,
roles: [:reviewer],
review_states: [:new],
states: [:review],
search: search)
end

def incoming_requests(search = nil)
BsRequest.find_for(group: title, states: [:new], roles: [:maintainer], search: search)
end
end

# == Schema Information
Expand Down
57 changes: 42 additions & 15 deletions src/api/app/views/webui/groups/show.html.haml
Original file line number Diff line number Diff line change
@@ -1,16 +1,43 @@
- @pagetitle = "Group #{@group.title}"
%h2= @pagetitle
- unless @group.users.empty?
%table#group-members-table
%thead
%tr
%th Group members
%tbody
- @group.users.each do |user|
%tr
%td= link_to(user.login, user_show_path(user))
- else
%p
%i This group does not contain users
- content_for :ready_function do
$('#group-members-table').dataTable();
- @layouttype = "custom"
- @crumb_list = ['Group', @group.title]

.grid_16.alpha.omega.box.box-shadow
.box-header.header-tabs
%ul
%li.selected
%a#reviews-in-tab{data: { id: 'reviews-in' } }
Incoming Reviews
= sprite_tag('reload', title: 'Reload', class: 'result_reload', data: { table: 'reviews_in_table' })
= image_tag('ajax-loader.gif', class: 'result_spinner hidden')
%li
%a#requests-in-tab{data: { id: 'requests-in' } }
Incoming Requests
= sprite_tag('reload', title: 'Reload', class: 'result_reload hidden', data: { table: 'requests_in_table' })
= image_tag('ajax-loader.gif', class: 'result_spinner hidden')
%li
%a#group-members-tab{data: { id: 'group-members' } }
Group Members
.grid_16.alpha
.table-container#reviews-in
%h3 Incoming Reviews
= render(partial: 'webui/shared/requests_table', locals: { id: 'reviews_in_table', source_url: group_requests_path(@group) })

.table-container.hidden#requests-in
%h3 Incoming Requests
= render(partial: 'webui/shared/requests_table', locals: { id: 'requests_in_table', source_url: group_requests_path(@group) })

.table-container.hidden#group-members
%h3 Group Members
%table#group-members-table
%thead
%tr
%th Login Name
%tbody
- if @group.users.any?
- @group.users.each do |user|
%tr
%td= link_to(user.login, user_show_path(user))
- else
%tr
%td This group does not contain users.
4 changes: 4 additions & 0 deletions src/api/config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,10 @@ def self.public_or_about_path?(request)
get 'users/(:user)/requests' => :index, as: 'user_requests'
end

controller 'webui/groups/bs_requests' do
get 'groups/(:title)/requests' => :index, as: 'group_requests'
end

controller 'webui/users/rss_tokens' do
post 'users/rss_tokens' => :create, as: 'user_rss_token'
end
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
require 'rails_helper'

RSpec.describe Webui::Groups::BsRequestsController do
describe 'GET #index' do
include_context 'a set of bs requests'

let(:group) { create(:group) }
let!(:relationship_project_group) { create(:relationship_project_group, group: group, project: target_project) }
let!(:relationship_project_group2) { create(:relationship_project_group, group: group, project: target_project2) }
let(:base_params) { { title: group.title, format: :json, dataTableId: 'requests_in_table' } }
let(:context_params) { { } }
let(:params) { base_params.merge(context_params) }

# this is for overwritting request3 because we set the relationship between group and target_project and target_project2
# which would include request3 as well which we don't want. Therefore we overwrite it here with a different target_project3
let!(:target_project3) { create(:project_with_package, name: 'c_target_project') }
let!(:target_package3) { target_project3.packages.first }
let!(:request3) do
create(:bs_request_with_submit_action,
creator: user2,
priority: 'critical',
source_project: source_project2,
source_package: source_package2,
target_project: target_project3,
target_package: target_package3)
end

before do
get :index, params: params
end

it { expect(response).to have_http_status(:success) }
it { expect(subject).to render_template(:index) }

it_behaves_like 'a bs requests data table controller'

context 'with the dataTableId param set to "reviews_in_table"' do
let(:context_params) { { dataTableId: 'reviews_in_table' } }
let(:bs_request) { create(:bs_request) }
let!(:review) { create(:review, by_group: group.title, bs_request: bs_request) }
let(:another_group) { create(:group) }
let(:another_bs_request) { create(:bs_request) }
let!(:another_review) { create(:review, by_group: another_group.title, bs_request: another_bs_request) }

before do
bs_request.state = :review
bs_request.save
another_bs_request.state = :review
another_bs_request.save
end

it 'returns those requests' do
expect(assigns(:requests_data_table).rows.length).to eq(1)
expect(assigns(:requests_data_table).rows.first.request).to eq(bs_request)
end

it 'assigns the total count of records' do
expect(assigns(:requests_data_table).records_total).to eq(1)
expect(assigns(:requests_data_table).count_requests).to eq(1)
end
end
end
end
4 changes: 3 additions & 1 deletion src/api/spec/features/webui/groups_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@

expect(page).to have_content('Showing 1 to 2 of 2 entries')
click_link('test_group_b')
expect(page).to have_content('This group does not contain users')
expect(page).to have_content('Incoming Reviews')
find('#group-members-tab').click
expect(page).to have_content('This group does not contain users.')

visit groups_path
expect(page).to have_content('Showing 1 to 2 of 2 entries')
Expand Down
2 changes: 2 additions & 0 deletions src/api/test/functional/webui/group_controller_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@ def test_list_all_groups # spec/features/webui/groups_spec.rb

find(:id, 'group-table_wrapper').must_have_text 'Showing 1 to 5 of 5 entries'
find(:id, 'test_group_empty').click
find(:id, 'group-members-tab').click
find(:id, 'content').must_have_text 'This group does not contain users'

visit groups_path
find(:id, 'test_group').click
find(:id, 'group-members-tab').click
find(:id, 'group-members-table_wrapper').must_have_text 'Showing 1 to 2 of 2 entries'
find(:link, 'adrian').click
assert page.current_url.end_with? user_show_path(user: 'adrian')
Expand Down