Added empty state svg and set up blank conditional
Added new spec step Added empty state to dashboard Split empty and filtered empty states Moved empty_state icons into their own folder and DRY up empty state html Fixed failing spec Added to groups page Review changes
This commit is contained in:
parent
a0d5bb0bb8
commit
a08fba63be
12 changed files with 99 additions and 48 deletions
|
@ -254,3 +254,32 @@
|
|||
.content-block-small {
|
||||
padding: 10px 0;
|
||||
}
|
||||
|
||||
.empty-state {
|
||||
margin: 100px 0 0;
|
||||
|
||||
.text-content {
|
||||
max-width: 460px;
|
||||
margin: 0 auto;
|
||||
padding: $gl-padding;
|
||||
}
|
||||
|
||||
.svg-content {
|
||||
text-align: center;
|
||||
|
||||
svg {
|
||||
max-width: 425px;
|
||||
width: 100%;
|
||||
padding: $gl-padding;
|
||||
}
|
||||
}
|
||||
|
||||
@media(max-width: $screen-xs-max) {
|
||||
margin-top: 50px;
|
||||
text-align: center;
|
||||
|
||||
.btn {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -48,4 +48,8 @@ module GroupsHelper
|
|||
"#{status.humanize} #{projects_lfs_status(group)}"
|
||||
end
|
||||
end
|
||||
|
||||
def group_issues(group)
|
||||
IssuesFinder.new(current_user, group_id: group.id).execute
|
||||
end
|
||||
end
|
||||
|
|
|
@ -458,4 +458,8 @@ module ProjectsHelper
|
|||
def project_child_container_class(view_path)
|
||||
view_path == "projects/issues/issues" ? "prepend-top-default" : "project-show-#{view_path}"
|
||||
end
|
||||
|
||||
def project_issues(project)
|
||||
IssuesFinder.new(current_user, project_id: project.id).execute
|
||||
end
|
||||
end
|
||||
|
|
|
@ -3,24 +3,27 @@
|
|||
- if current_user
|
||||
= auto_discovery_link_tag(:atom, url_for(params.merge(format: :atom, private_token: current_user.private_token)), title: "#{@group.name} issues")
|
||||
|
||||
.top-area
|
||||
= render 'shared/issuable/nav', type: :issues
|
||||
.nav-controls
|
||||
- if group_issues(@group).exists?
|
||||
.top-area
|
||||
= render 'shared/issuable/nav', type: :issues
|
||||
.nav-controls
|
||||
- if current_user
|
||||
= link_to url_for(params.merge(format: :atom, private_token: current_user.private_token)), class: 'btn' do
|
||||
= icon('rss')
|
||||
%span.icon-label
|
||||
Subscribe
|
||||
= render 'shared/new_project_item_select', path: 'issues/new', label: "New Issue"
|
||||
|
||||
= render 'shared/issuable/filter', type: :issues
|
||||
|
||||
.row-content-block.second-block
|
||||
Only issues from the
|
||||
%strong #{@group.name}
|
||||
group are listed here.
|
||||
- if current_user
|
||||
= link_to url_for(params.merge(format: :atom, private_token: current_user.private_token)), class: 'btn' do
|
||||
= icon('rss')
|
||||
%span.icon-label
|
||||
Subscribe
|
||||
= render 'shared/new_project_item_select', path: 'issues/new', label: "New Issue"
|
||||
To see all issues you should visit #{link_to 'dashboard', issues_dashboard_path} page.
|
||||
|
||||
= render 'shared/issuable/filter', type: :issues
|
||||
|
||||
.row-content-block.second-block
|
||||
Only issues from
|
||||
%strong #{@group.name}
|
||||
group are listed here.
|
||||
- if current_user
|
||||
To see all issues you should visit #{link_to 'dashboard', issues_dashboard_path} page.
|
||||
|
||||
.prepend-top-default
|
||||
= render 'shared/issues'
|
||||
.prepend-top-default
|
||||
= render 'shared/issues'
|
||||
- else
|
||||
= render 'shared/empty_states/issues', project_select_button: true
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
%ul.content-list.issues-list.issuable-list
|
||||
= render partial: "projects/issues/issue", collection: @issues
|
||||
- if @issues.blank?
|
||||
%li
|
||||
.nothing-here-block No issues to show
|
||||
= render 'shared/empty_states/issues'
|
||||
|
||||
- if @issues.present?
|
||||
= paginate @issues, theme: "gitlab"
|
||||
|
|
|
@ -10,8 +10,8 @@
|
|||
- if current_user
|
||||
= auto_discovery_link_tag(:atom, url_for(params.merge(format: :atom, private_token: current_user.private_token)), title: "#{@project.name} issues")
|
||||
|
||||
%div{ class: (container_class) }
|
||||
- if @project.issues.any?
|
||||
- if project_issues(@project).exists?
|
||||
%div{ class: (container_class) }
|
||||
.top-area
|
||||
= render 'shared/issuable/nav', type: :issues
|
||||
.nav-controls
|
||||
|
@ -36,21 +36,5 @@
|
|||
= render 'issues'
|
||||
- if new_issue_email
|
||||
= render 'issue_by_email', email: new_issue_email
|
||||
- else
|
||||
.blank-state.blank-state-welcome
|
||||
%h2.blank-state-title.blank-state-welcome-title
|
||||
Welcome to GitLab Issues
|
||||
%p.blank-state-text
|
||||
Code, test, and deploy together
|
||||
.blank-state
|
||||
.blank-state-icon
|
||||
= custom_icon("issues", size: 50)
|
||||
%h3.blank-state-title
|
||||
You don't have any issues right now.
|
||||
%p.blank-state-text
|
||||
Issues are the best way to track your project progress
|
||||
- if can? current_user, :create_issue, @project
|
||||
= link_to new_namespace_project_issue_path(@project.namespace, @project), class: "btn btn-new", title: "New Issue", id: "new_issue_link" do
|
||||
New Issue
|
||||
- if new_issue_email
|
||||
= render 'issue_by_email', email: new_issue_email
|
||||
- else
|
||||
= render 'shared/empty_states/issues', button_path: new_namespace_project_issue_path(@project.namespace, @project)
|
||||
|
|
|
@ -13,4 +13,4 @@
|
|||
= render 'projects/issues/issue', issue: issue
|
||||
= paginate @issues, theme: "gitlab"
|
||||
- else
|
||||
.nothing-here-block No issues to show
|
||||
= render 'shared/empty_states/issues'
|
||||
|
|
22
app/views/shared/empty_states/_issues.html.haml
Normal file
22
app/views/shared/empty_states/_issues.html.haml
Normal file
|
@ -0,0 +1,22 @@
|
|||
- button_path = local_assigns.fetch(:button_path, false)
|
||||
- project_select_button = local_assigns.fetch(:project_select_button, false)
|
||||
- has_button = button_path || project_select_button
|
||||
|
||||
.row.empty-state
|
||||
.pull-right.col-xs-12{ class: "#{'col-sm-6' if has_button}" }
|
||||
.svg-content
|
||||
= render 'shared/empty_states/icons/issues.svg'
|
||||
.col-xs-12{ class: "#{'col-sm-6' if has_button}" }
|
||||
.text-content
|
||||
- if has_button
|
||||
%h4
|
||||
The Issue Tracker is a good place to add things that need to be improved or solved in a project!
|
||||
%p
|
||||
An issue can be a bug, a todo or a feature request that needs to be discussed in a project.
|
||||
Besides, issues are searchable and filterable.
|
||||
- if project_select_button
|
||||
= render 'shared/new_project_item_select', path: 'issues/new', label: 'New issue'
|
||||
- else
|
||||
= link_to 'New issue', button_path, class: 'btn btn-new', title: 'New issue', id: 'new_issue_link'
|
||||
- else
|
||||
%h4.text-center There are no issues to show.
|
1
app/views/shared/empty_states/icons/_issues.svg
Normal file
1
app/views/shared/empty_states/icons/_issues.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 16 KiB |
|
@ -62,7 +62,7 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
|
|||
end
|
||||
|
||||
step 'I click link "New Issue"' do
|
||||
click_link "New Issue"
|
||||
page.has_link?('New Issue') ? click_link('New Issue') : click_link('New issue')
|
||||
end
|
||||
|
||||
step 'I click "author" dropdown' do
|
||||
|
|
|
@ -3,8 +3,8 @@ require 'rails_helper'
|
|||
describe 'Filter issues', feature: true do
|
||||
include WaitForAjax
|
||||
|
||||
let!(:project) { create(:project) }
|
||||
let!(:group) { create(:group) }
|
||||
let!(:project) { create(:project, group: group) }
|
||||
let!(:user) { create(:user)}
|
||||
let!(:milestone) { create(:milestone, project: project) }
|
||||
let!(:label) { create(:label, project: project) }
|
||||
|
@ -127,7 +127,7 @@ describe 'Filter issues', feature: true do
|
|||
expect(page).to have_content wontfix.title
|
||||
end
|
||||
|
||||
find('body').click
|
||||
find('.dropdown-menu-close-icon').click
|
||||
|
||||
expect(find('.filtered-labels')).to have_content(wontfix.title)
|
||||
|
||||
|
@ -135,7 +135,7 @@ describe 'Filter issues', feature: true do
|
|||
wait_for_ajax
|
||||
find('.dropdown-menu-labels a', text: label.title).click
|
||||
|
||||
find('body').click
|
||||
find('.dropdown-menu-close-icon').click
|
||||
|
||||
expect(find('.filtered-labels')).to have_content(wontfix.title)
|
||||
expect(find('.filtered-labels')).to have_content(label.title)
|
||||
|
@ -150,8 +150,8 @@ describe 'Filter issues', feature: true do
|
|||
it "selects and unselects `won't fix`" do
|
||||
find('.dropdown-menu-labels a', text: wontfix.title).click
|
||||
find('.dropdown-menu-labels a', text: wontfix.title).click
|
||||
# Close label dropdown to load
|
||||
find('body').click
|
||||
|
||||
find('.dropdown-menu-close-icon').click
|
||||
expect(page).not_to have_css('.filtered-labels')
|
||||
end
|
||||
end
|
||||
|
|
|
@ -371,10 +371,12 @@ describe 'Issues', feature: true do
|
|||
|
||||
describe 'when I want to reset my incoming email token' do
|
||||
let(:project1) { create(:project, namespace: @user.namespace) }
|
||||
let(:issue) { create(:issue, project: project1) }
|
||||
|
||||
before do
|
||||
allow(Gitlab.config.incoming_email).to receive(:enabled).and_return(true)
|
||||
project1.team << [@user, :master]
|
||||
project1.issues << issue
|
||||
visit namespace_project_issues_path(@user.namespace, project1)
|
||||
end
|
||||
|
||||
|
@ -576,7 +578,10 @@ describe 'Issues', feature: true do
|
|||
|
||||
describe 'new issue by email' do
|
||||
shared_examples 'show the email in the modal' do
|
||||
let(:issue) { create(:issue, project: project) }
|
||||
|
||||
before do
|
||||
project.issues << issue
|
||||
stub_incoming_email_setting(enabled: true, address: "p+%{key}@gl.ab")
|
||||
|
||||
visit namespace_project_issues_path(project.namespace, project)
|
||||
|
|
Loading…
Reference in a new issue