-
Notifications
You must be signed in to change notification settings - Fork 437
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #12123 from danidoni/implement-filters-for-a-workf…
…low-run-index-page Implement filters for Workflow Runs
- Loading branch information
Showing
14 changed files
with
403 additions
and
34 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
21 changes: 21 additions & 0 deletions
21
src/api/app/components/workflow_run_filter_component.html.haml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
.row.list-group-flush | ||
= render WorkflowRunFilterLinkComponent.new(token: @token, text: 'All', amount: @count['all'], | ||
filter_item: {}, selected_filter: @selected_filter) | ||
.row.list-group-flush.mt-5 | ||
%h5.ml-3 Status | ||
= render WorkflowRunFilterLinkComponent.new(token: @token, text: 'Succeeded', amount: @count['success'], | ||
filter_item: { status: 'success' }, selected_filter: @selected_filter) | ||
= render WorkflowRunFilterLinkComponent.new(token: @token, text: 'Running', amount: @count['running'], | ||
filter_item: { status: 'running' }, selected_filter: @selected_filter) | ||
= render WorkflowRunFilterLinkComponent.new(token: @token, text: 'Failed', amount: @count['fail'], | ||
filter_item: { status: 'fail' }, selected_filter: @selected_filter) | ||
.row.list-group-flush.mt-5 | ||
%h5.ml-3 Event type | ||
= render WorkflowRunFilterLinkComponent.new(token: @token, text: 'Pull Requests', amount: @count['pull_request'], | ||
filter_item: { event_type: 'pull_request' }, selected_filter: @selected_filter) | ||
= render WorkflowRunFilterLinkComponent.new(token: @token, text: 'Push', amount: @count['push'], | ||
filter_item: { event_type: 'push' }, selected_filter: @selected_filter) | ||
= render WorkflowRunFilterLinkComponent.new(token: @token, text: 'Merge Request Hook', amount: @count['Merge Request Hook'], | ||
filter_item: { event_type: 'Merge Request Hook' }, selected_filter: @selected_filter) | ||
= render WorkflowRunFilterLinkComponent.new(token: @token, text: 'Push Hook', amount: @count['Push Hook'], | ||
filter_item: { event_type: 'Push Hook' }, selected_filter: @selected_filter) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
class WorkflowRunFilterComponent < ApplicationComponent | ||
def initialize(token:, selected_filter:, finder: WorkflowRunsFinder.new) | ||
super | ||
|
||
@count = workflow_runs_count(finder) | ||
@selected_filter = selected_filter | ||
@token = token | ||
end | ||
|
||
def workflow_runs_count(finder) | ||
counted_workflow_runs = {} | ||
counted_workflow_runs['success'] = finder.succeeded.count | ||
counted_workflow_runs['running'] = finder.running.count | ||
counted_workflow_runs['fail'] = finder.failed.count | ||
counted_workflow_runs.merge(finder.group_by_event_type) | ||
end | ||
end |
4 changes: 4 additions & 0 deletions
4
src/api/app/components/workflow_run_filter_link_component.html.haml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
= link_to(token_workflow_runs_path(@token, @filter_item), class: "list-group-item list-group-item-action #{css_for_link}") do | ||
= @text | ||
- if @amount.positive? | ||
%span.badge.align-text-top.ml-2{ class: css_for_badge_color }>= @amount |
31 changes: 31 additions & 0 deletions
31
src/api/app/components/workflow_run_filter_link_component.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
class WorkflowRunFilterLinkComponent < ApplicationComponent | ||
def initialize(text:, filter_item:, selected_filter:, token:, amount:) | ||
super | ||
|
||
@text = text | ||
@filter_item = filter_item | ||
@selected_filter = selected_filter | ||
@amount = amount || 0 | ||
@token = token | ||
end | ||
|
||
def css_for_link | ||
workflow_run_filter_matches? ? 'active' : '' | ||
end | ||
|
||
def css_for_badge_color | ||
workflow_run_filter_matches? ? 'badge-light' : 'badge-primary' | ||
end | ||
|
||
private | ||
|
||
def workflow_run_filter_matches? | ||
if @selected_filter[:status].present? | ||
@filter_item[:status] == @selected_filter[:status] | ||
elsif @selected_filter[:event_type].present? | ||
@filter_item[:event_type] == @selected_filter[:event_type] | ||
elsif @selected_filter.empty? | ||
@filter_item.empty? | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
class WorkflowRunsFinder | ||
def initialize(relation = WorkflowRun.all) | ||
@relation = relation.order(created_at: :desc) | ||
end | ||
|
||
def all | ||
@relation.all | ||
end | ||
|
||
def group_by_event_type | ||
@relation.all.each_with_object(Hash.new(0)) do |workflow_run, grouped_workflows| | ||
grouped_workflows[workflow_run.hook_event] += 1 | ||
end | ||
end | ||
|
||
def with_event_type(event_type) | ||
allowed_events = ScmWebhookEventValidator::ALLOWED_GITHUB_EVENTS + ScmWebhookEventValidator::ALLOWED_GITLAB_EVENTS | ||
filtered_event_type = '%' + ([event_type] & allowed_events).first + '%' | ||
@relation.where('request_headers LIKE ?', filtered_event_type) | ||
end | ||
|
||
def with_status(status) | ||
@relation.where(status: status) | ||
end | ||
|
||
def succeeded | ||
with_status('success') | ||
end | ||
|
||
def running | ||
with_status('running') | ||
end | ||
|
||
def failed | ||
with_status('fail') | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,17 +1,27 @@ | ||
- @pagetitle = 'Workflow Runs' | ||
|
||
.card | ||
.card-body | ||
%h3= @pagetitle | ||
- if @workflow_runs.blank? | ||
%p There are no workflow runs for this token yet | ||
- else | ||
.text-center | ||
%span.ml-3= page_entries_info(@workflow_runs) | ||
.accordion.pt-3#workflow-runs-accordion | ||
- @workflow_runs.each do |workflow_run| | ||
.card-header{ id: "workflow-run-heading#{workflow_run.id}" } | ||
.mb-0 | ||
.row | ||
= render(WorkflowRunRowComponent.new(workflow_run: workflow_run)) | ||
= paginate @workflow_runs, views_prefix: 'webui' | ||
.row | ||
.col-md-4.col-lg-3.px-0.px-md-3.sticky-top#workflow-runs-filter-desktop | ||
.card.mb-3 | ||
%strong.d-block.d-md-none.p-3{ data: { toggle: 'collapse', target: '#filters' }, | ||
aria: { expanded: true, controls: 'filters' } } | ||
Filtered by: #{params[:status]&.humanize} | ||
%i.float-right.mt-1.fa.fa-chevron-down#workflow-runs-dropdown-trigger | ||
.card-body.collapse#filters | ||
= render WorkflowRunFilterComponent.new(token: @token, selected_filter: @selected_filter) | ||
.col-md-8.col-lg-9.px-0.px-md-3#workflow-run-list | ||
.card | ||
- if @workflow_runs.blank? | ||
.card-body | ||
%p There are no workflow runs for this token yet | ||
- else | ||
.card-body | ||
.text-center | ||
%span.ml-3= page_entries_info(@workflow_runs) | ||
.accordion.pt-3#workflow-runs-accordion | ||
- @workflow_runs.each do |workflow_run| | ||
.card-header{ id: "workflow-run-heading#{workflow_run.id}" } | ||
.mb-0 | ||
.row | ||
= render(WorkflowRunRowComponent.new(workflow_run: workflow_run)) | ||
= paginate @workflow_runs, views_prefix: 'webui' |
47 changes: 47 additions & 0 deletions
47
src/api/spec/components/workflow_run_filter_component_spec.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
require 'rails_helper' | ||
|
||
RSpec.describe WorkflowRunFilterComponent, type: :component do | ||
let(:token) { create(:workflow_token) } | ||
let(:stub_finder) do | ||
instance_double('WorkflowRunsFinder', | ||
succeeded: [:workflow_run], | ||
running: [:workflow_run, :workflow_run], | ||
failed: [:workflow_run, :workflow_run, :workflow_run], | ||
group_by_event_type: { pull_request: [:workflow_run] }) | ||
end | ||
let(:selected_filter) { {} } | ||
|
||
before do | ||
render_inline(described_class.new(token: token, selected_filter: selected_filter, finder: stub_finder)) | ||
end | ||
|
||
it 'renders a link to receive all workflow runs' do | ||
expect(rendered_component).to have_css('a.active', text: 'All') | ||
end | ||
|
||
context 'status filter links' do | ||
it 'renders the succeeded filter' do | ||
expect(rendered_component).to have_css('a', text: 'Succeeded') | ||
end | ||
|
||
it 'renders the failed filter' do | ||
expect(rendered_component).to have_css('a', text: 'Failed') | ||
end | ||
|
||
it 'renders the running filter' do | ||
expect(rendered_component).to have_css('a', text: 'Running') | ||
end | ||
end | ||
|
||
context 'event type filter links' do | ||
it 'renders the push event filters' do | ||
expect(rendered_component).to have_css('a', text: 'Push') | ||
expect(rendered_component).to have_css('a', text: 'Push Hook') | ||
end | ||
|
||
it 'renders the pull request event filters' do | ||
expect(rendered_component).to have_css('a', text: 'Pull Requests') | ||
expect(rendered_component).to have_css('a', text: 'Merge Request Hook') | ||
end | ||
end | ||
end |
Oops, something went wrong.