Skip to content

Commit

Permalink
[webui] make requests table for packages use DataTable js plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
evanrolfe committed May 5, 2017
1 parent e1fd3d2 commit 5577165
Show file tree
Hide file tree
Showing 18 changed files with 253 additions and 161 deletions.
Expand Up @@ -27,6 +27,10 @@ $( document ).ready(function() {
d.state = state_dropdown.val();
}
}
}).on('xhr.dt', function ( e, settings, json, xhr ) {
if (json) {
$('#request_count').text('(' + json.recordsTotal + ')');
}
});

// 2. Reload button (if it exists)
Expand Down
24 changes: 2 additions & 22 deletions src/api/app/controllers/webui/package_controller.rb
Expand Up @@ -203,7 +203,9 @@ def users

def requests
@default_request_type = params[:type] if params[:type]
@available_types = %w(all submit delete add_role change_devel maintenance_incident maintenance_release)
@default_request_state = params[:state] if params[:state]
@available_states = ['new or review', 'new', 'review', 'accepted', 'declined', 'revoked', 'superseded']
end

def commit
Expand Down Expand Up @@ -1055,28 +1057,6 @@ def file_available?(url, max_redirects = 5)
end
end

def require_package
required_parameters :package
params[:rev], params[:package] = params[:pkgrev].split('-', 2) if params[:pkgrev]
@project ||= params[:project]
unless params[:package].blank?
begin
@package = Package.get_by_project_and_name( @project.to_param, params[:package],
{use_source: false, follow_project_links: true, follow_multibuild: true} )
rescue APIException # why it's not found is of no concern :)
end
end

return if @package

if request.xhr?
render nothing: true, status: :not_found
else
flash[:error] = "Package \"#{params[:package]}\" not found in project \"#{params[:project]}\""
redirect_to project_show_path(project: @project, nextstatus: 404)
end
end

def users_path
url_for(action: :users, project: @project, package: @package)
end
Expand Down
21 changes: 21 additions & 0 deletions src/api/app/controllers/webui/packages/bs_requests_controller.rb
@@ -0,0 +1,21 @@
module Webui
module Packages
class BsRequestsController < WebuiController
before_action :set_project
before_action :require_package

def index
parsed_params = BsRequest::DataTable::ParamsParserWithStateAndType.new(params).parsed_params
requests_query = BsRequest::DataTable::FindForPackageQuery.new(@project, @package, parsed_params)
@requests_data_table = BsRequest::DataTable::Table.new(requests_query, params[:draw])

# NOTE: This session is used by requests/show
session[:request_numbers] = requests_query.requests.map(&:number)

respond_to do |format|
format.json
end
end
end
end
end
20 changes: 2 additions & 18 deletions src/api/app/controllers/webui/projects/bs_requests_controller.rb
Expand Up @@ -4,10 +4,8 @@ class BsRequestsController < WebuiController
before_action :set_project

def index
parsed_params = BsRequest::DataTable::ParamsParser.new(params).parsed_params
requests_query = BsRequest::DataTable::FindForProjectQuery.new(
@project, types, states, parsed_params
)
parsed_params = BsRequest::DataTable::ParamsParserWithStateAndType.new(params).parsed_params
requests_query = BsRequest::DataTable::FindForProjectQuery.new(@project, parsed_params)
@requests_data_table = BsRequest::DataTable::Table.new(requests_query, params[:draw])

# NOTE: This session is used by requests/show
Expand All @@ -17,20 +15,6 @@ def index
format.json
end
end

private

def types
[params[:type]] if params[:type].present? && params[:type] != 'all'
end

def states
if params[:state] == 'new or review'
['new', 'review']
elsif params[:state].present?
[params[:state]]
end
end
end
end
end
22 changes: 22 additions & 0 deletions src/api/app/controllers/webui/webui_controller.rb
Expand Up @@ -255,6 +255,28 @@ def peek_enabled?
User.current && (User.current.is_admin? || User.current.is_staff?)
end

def require_package
required_parameters :package
params[:rev], params[:package] = params[:pkgrev].split('-', 2) if params[:pkgrev]
@project ||= params[:project]
unless params[:package].blank?
begin
@package = Package.get_by_project_and_name( @project.to_param, params[:package],
{use_source: false, follow_project_links: true, follow_multibuild: true} )
rescue APIException # why it's not found is of no concern :)
end
end

return if @package

if request.xhr?
render nothing: true, status: :not_found
else
flash[:error] = "Package \"#{params[:package]}\" not found in project \"#{params[:project]}\""
redirect_to project_show_path(project: @project, nextstatus: 404)
end
end

private

def require_configuration
Expand Down
42 changes: 42 additions & 0 deletions src/api/app/models/bs_request/data_table/find_for_package_query.rb
@@ -0,0 +1,42 @@
class BsRequest
module DataTable
class FindForPackageQuery
def initialize(project, package, params)
@project = project
@package = package
@params = params
end

def requests
@requests ||=
request_query
.offset(@params[:offset])
.limit(@params[:limit])
.reorder(@params[:sort_column] => @params[:sort_direction])
.includes(:bs_request_actions)
end

def records_total
request_query_without_search.count
end

def count_requests
request_query.count
end

private

def request_query
BsRequest.collection(
@params.merge(project: @project.name, package: @package.name)
)
end

def request_query_without_search
BsRequest.collection(
@params.except(:search).merge(project: @project.name, package: @package.name)
)
end
end
end
end
@@ -1,10 +1,8 @@
class BsRequest
module DataTable
class FindForProjectQuery
def initialize(project, types, states, params)
def initialize(project, params)
@project = project
@types = types
@states = states
@params = params
end

Expand All @@ -29,13 +27,13 @@ def count_requests

def request_query
BsRequest.collection(
@params.merge(project: @project.name, types: @types, states: @states)
@params.merge(project: @project.name)
)
end

def request_query_without_search
BsRequest.collection(
@params.except(:search).merge(project: @project.name, types: @types, states: @states)
@params.except(:search).merge(project: @project.name)
)
end
end
Expand Down
@@ -0,0 +1,23 @@
class BsRequest
module DataTable
class ParamsParserWithStateAndType < ParamsParser
def parsed_params
super.merge(types: types, states: states)
end

private

def types
[@requested_params[:type]] if @requested_params[:type].present? && @requested_params[:type] != 'all'
end

def states
if @requested_params[:state] == 'new or review'
['new', 'review']
elsif @requested_params[:state].present?
[@requested_params[:state]]
end
end
end
end
end
45 changes: 0 additions & 45 deletions src/api/app/views/shared/_select_requests.html.erb

This file was deleted.

5 changes: 3 additions & 2 deletions src/api/app/views/webui/package/requests.html.erb
@@ -1,9 +1,10 @@
<% @pagetitle = "Requests for #{@package}" %>
<% package_bread_crumb('Requests') %>
<%= render :partial => 'tabs' %>
<%= render :partial => 'tabs' %>

<h3><%= @pagetitle %></h3>

<%= render :partial => 'shared/select_requests', :locals => {:project => @project.name, :package => @package.name, :no_target => true} %>
<%= render(partial: 'webui/shared/requests_state_and_type_form') %>
<%= render(partial: 'webui/shared/requests_table', locals: { id: 'all_requests_table', source_url: packages_requests_path(project: @project, package: @package) }) %>
21 changes: 21 additions & 0 deletions src/api/app/views/webui/packages/bs_requests/index.json.erb
@@ -0,0 +1,21 @@
{
"draw": "<%= @requests_data_table.draw %>",
"recordsTotal": "<%= @requests_data_table.records_total %>",
"recordsFiltered": "<%= @requests_data_table.count_requests %>",
"data": [
<% @requests_data_table.rows.each.with_index do |row,index | %>
[
"<%= escape_javascript(fuzzy_time(row.created_at, false)) %>",
"<%= escape_javascript(project_or_package_link(project: row.source_project, package: row.source_package, creator: row.creator, trim_to: 40, short: true)) %>",
"<%= escape_javascript(target_project_link(row)) %>",
"<%= escape_javascript(user_with_realname_and_icon(row.creator, short: true)) %>",
"<%= escape_javascript(row.request_type) %>",
"<%= escape_javascript(row.priority) %>",
"<%= escape_javascript(link_to(sprite_tag('req-showdiff', title: "Show request ##{row.number}"), request_show_path(row.number), { class: :request_link })) %>"
]
<% unless index == @requests_data_table.rows.length - 1 %>
,
<% end %>
<% end %>
]
}
18 changes: 1 addition & 17 deletions src/api/app/views/webui/project/requests.html.erb
Expand Up @@ -5,22 +5,6 @@

<h3><%= @pagetitle %></h3>

<p>
Display
<%= select_tag(
"request_type_select",
options_for_select(@available_types, @default_request_type),
data: { table: 'all_requests_table' }) %>
requests in state
<%= select_tag(
"request_state_select",
options_for_select(@available_states, @default_request_state),
data: { table: 'all_requests_table' }) %>
<span id="request_count">
<%= "(" + @requests.length.to_s + ")" unless not defined?(@requests) || @requests.blank? %>
</span>:
<%= image_tag('ajax-loader.gif', :id => "spinner", :class => "hidden") %>
</p>

<%= render(partial: 'webui/shared/requests_state_and_type_form') %>
<%= render(partial: 'webui/shared/requests_table', locals: { id: 'all_requests_table', source_url: projects_requests_path(@project) }) %>
@@ -0,0 +1,14 @@
<p>
Display
<%= select_tag(
"request_type_select",
options_for_select(@available_types, @default_request_type),
data: { table: 'all_requests_table' }) %>
requests in state
<%= select_tag(
"request_state_select",
options_for_select(@available_states, @default_request_state),
data: { table: 'all_requests_table' }) %>
<span id="request_count"></span>:
<%= image_tag('ajax-loader.gif', :id => "spinner", :class => "hidden") %>
</p>
1 change: 1 addition & 0 deletions src/api/config/routes.rb
Expand Up @@ -666,6 +666,7 @@ def self.public_or_about_path?(request)

### /projects
get 'projects/:project/requests' => 'webui/projects/bs_requests#index', constraints: cons, as: 'projects_requests'
get 'projects/:project/packages/:package/requests' => 'webui/packages/bs_requests#index', constraints: cons, as: 'packages_requests'
end

controller :source do
Expand Down
@@ -0,0 +1,21 @@
require 'rails_helper'

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

let(:base_params) { { project: source_project, package: source_package, format: :json } }
let(:context_params) { {} }
let(:params) { base_params.merge(context_params) }

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'
it_behaves_like 'a bs requests data table controller with state and type options'
end
end

0 comments on commit 5577165

Please sign in to comment.