Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/assets/images/emoji.pngbin263346 -> 1025831 bytes
-rw-r--r--app/assets/images/emoji@2x.pngbin689076 -> 2492919 bytes
-rw-r--r--app/assets/stylesheets/framework/gitlab-theme.scss11
-rw-r--r--app/assets/stylesheets/framework/sidebar.scss20
-rw-r--r--app/assets/stylesheets/pages/merge_requests.scss3
-rw-r--r--app/assets/stylesheets/pages/projects.scss368
-rw-r--r--app/helpers/issues_helper.rb2
-rw-r--r--app/helpers/members_helper.rb11
-rw-r--r--app/models/ability.rb30
-rw-r--r--app/models/award_emoji.rb2
-rw-r--r--app/models/group.rb2
-rw-r--r--app/models/project.rb2
-rw-r--r--app/models/user.rb2
-rw-r--r--app/views/layouts/_page.html.haml5
-rw-r--r--app/views/layouts/header/_default.html.haml4
-rw-r--r--app/views/projects/_home_panel.html.haml52
-rw-r--r--app/views/projects/_last_commit.html.haml19
-rw-r--r--app/views/projects/buttons/_fork.html.haml5
-rw-r--r--app/views/projects/show.html.haml99
-rw-r--r--app/views/shared/members/_access_request_buttons.html.haml2
20 files changed, 285 insertions, 354 deletions
diff --git a/app/assets/images/emoji.png b/app/assets/images/emoji.png
index 99093d4725a..6bacb0e92b6 100644
--- a/app/assets/images/emoji.png
+++ b/app/assets/images/emoji.png
Binary files differ
diff --git a/app/assets/images/emoji@2x.png b/app/assets/images/emoji@2x.png
index 48989942a9f..99588b56616 100644
--- a/app/assets/images/emoji@2x.png
+++ b/app/assets/images/emoji@2x.png
Binary files differ
diff --git a/app/assets/stylesheets/framework/gitlab-theme.scss b/app/assets/stylesheets/framework/gitlab-theme.scss
index 0a8603b6702..d1ff63bd099 100644
--- a/app/assets/stylesheets/framework/gitlab-theme.scss
+++ b/app/assets/stylesheets/framework/gitlab-theme.scss
@@ -20,17 +20,6 @@
.sidebar-wrapper {
background: $color-darker;
-
- .sidebar-user {
- background: $color-darker;
- color: $color-light;
-
- &:hover {
- background-color: $color-dark;
- color: $white-light;
- text-decoration: none;
- }
- }
}
.nav-sidebar li {
diff --git a/app/assets/stylesheets/framework/sidebar.scss b/app/assets/stylesheets/framework/sidebar.scss
index e8d6a7f2775..188823054fd 100644
--- a/app/assets/stylesheets/framework/sidebar.scss
+++ b/app/assets/stylesheets/framework/sidebar.scss
@@ -40,32 +40,16 @@
}
}
-.sidebar-user {
- padding: 15px;
- position: absolute;
- left: 0;
- bottom: 0;
- width: $sidebar_width;
- overflow: hidden;
- font-size: 16px;
- line-height: 36px;
- transition: width $sidebar-transition-duration, padding $sidebar-transition-duration;
-
- @media (min-width: $sidebar-breakpoint) {
- bottom: 50px;
- }
-}
-
.nav-sidebar {
position: absolute;
top: 50px;
- bottom: 65px;
+ bottom: 0;
width: $sidebar_width;
overflow-y: auto;
overflow-x: hidden;
@media (min-width: $sidebar-breakpoint) {
- bottom: 115px;
+ bottom: 50px;
}
&.navbar-collapse {
diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss
index 124f4afaa0d..d9756b66af0 100644
--- a/app/assets/stylesheets/pages/merge_requests.scss
+++ b/app/assets/stylesheets/pages/merge_requests.scss
@@ -167,7 +167,8 @@
.commit {
margin: 0;
- padding: 2px 0;
+ padding-top: 2px;
+ padding-bottom: 2px;
list-style: none;
&:hover {
background: none;
diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss
index 817c2982923..3325b586496 100644
--- a/app/assets/stylesheets/pages/projects.scss
+++ b/app/assets/stylesheets/pages/projects.scss
@@ -64,86 +64,49 @@
}
.project-home-panel {
- background: $white-light;
- text-align: left;
- padding: 24px 0;
+ padding-top: 24px;
+ padding-bottom: 24px;
- .container-fluid {
- position: relative;
-
- @media (min-width: $screen-lg-min) {
- .row {
- display: flex;
- -ms-flex-align: center;
- -webkit-align-items: center;
- -webkit-box-align: center;
- }
- }
+ @media (min-width: $screen-sm-min) {
+ border-bottom: 1px solid $border-color;
}
- .cover-controls {
- .project-settings-dropdown {
- margin-left: 10px;
- display: inline-block;
+ .project-avatar {
+ float: none;
+ margin-left: auto;
+ margin-right: auto;
- .dropdown-menu {
- left: auto;
- width: auto;
- right: 0;
- max-width: 240px;
- }
+ &.identicon {
+ border-radius: 50%;
}
}
- .cover-title {
- margin-bottom: 0;
- }
-
- .project-image-container {
- @include make-sm-column(1);
- max-width: 86px;
- min-width: 86px;
- padding-right: 0;
-
- @media (max-width: $screen-md-max) {
- padding-left: 0;
- margin: 0 0 10px;
- max-width: none;
- min-width: none;
+ .project-title {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ font-size: 24px;
+ font-weight: 400;
+ line-height: 1;
- .avatar.s70 {
- margin: auto;
- }
+ .fa {
+ margin-left: 2px;
+ font-size: 12px;
+ vertical-align: middle;
}
}
- .project-info {
- @include make-sm-column(10);
-
- h1 {
- font-size: 24px;
- font-weight: normal;
- margin: 0;
- }
+ .project-home-desc {
+ margin-left: auto;
+ margin-right: auto;
+ margin-bottom: 15px;
+ max-width: 480px;
- .project-home-desc {
- p {
- margin: 0;
- }
+ > p {
+ margin-bottom: 0;
}
}
- .identicon {
- float: left;
- @include border-radius(50%);
- }
-
- .avatar {
- float: none;
- }
-
.notifications-btn {
-
.fa-bell,
.fa-spinner {
margin-right: 6px;
@@ -153,127 +116,106 @@
margin-left: 6px;
}
}
+}
- .project-repo-buttons {
- font-size: 0;
-
- .btn {
- @include btn-gray;
- padding: 3px 10px;
- text-transform: none;
- background-color: $background-color;
+.project-repo-buttons {
+ font-size: 0;
- .fa {
- color: $layout-link-gray;
- }
+ .btn {
+ @include btn-gray;
+ padding: 3px 10px;
- .fa-caret-down {
- margin-left: 3px;
- }
+ .fa {
+ color: $layout-link-gray;
}
- form {
- margin-left: 10px;
+ .fa-caret-down {
+ margin-left: 3px;
}
+ }
- .count-buttons {
- display: inline-block;
- vertical-align: top;
- margin-top: 16px;
- }
+ .project-repo-btn-group,
+ .notification-dropdown {
+ margin-left: 10px;
+ }
- .project-clone-holder {
- display: inline-block;
- margin-top: 16px;
+ .count-buttons {
+ display: inline-block;
+ vertical-align: top;
+ }
- input {
- height: 29px;
- }
+ .project-clone-holder {
+ display: inline-block;
+
+ input {
+ height: 29px;
}
+ }
- .count-with-arrow {
- display: inline-block;
- position: relative;
- margin-left: 4px;
-
- .arrow {
- &:before {
- content: '';
- display: inline-block;
- position: absolute;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
- top: 50%;
- left: 0;
- margin-top: -6px;
- border-width: 7px 5px 7px 0;
- border-right-color: #dce0e5;
- }
-
- &:after {
- content: '';
- position: absolute;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
- top: 50%;
- left: 1px;
- margin-top: -9px;
- border-width: 10px 7px 10px 0;
- border-right-color: #fff;
- }
- }
- .count {
- @include btn-gray;
+ .count-with-arrow {
+ display: inline-block;
+ position: relative;
+ margin-left: 4px;
+
+ .arrow {
+ &:before {
+ content: '';
display: inline-block;
- background: white;
- border-radius: 2px;
- border-width: 1px;
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-color: transparent;
border-style: solid;
- font-size: 13px;
- font-weight: 600;
- line-height: 13px;
- padding: $gl-vert-padding $gl-padding;
- letter-spacing: .4px;
- padding: 7px 14px;
- text-align: center;
- vertical-align: middle;
- touch-action: manipulation;
- cursor: pointer;
- background-image: none;
- white-space: nowrap;
- margin: 0 10px 0 4px;
-
- a {
- color: inherit;
- }
-
- &:hover {
- background: #fff;
- }
+ top: 50%;
+ left: 0;
+ margin-top: -6px;
+ border-width: 7px 5px 7px 0;
+ border-right-color: #dce0e5;
+ pointer-events: none;
}
- }
- }
-
- .project-right-buttons {
- position: absolute;
- right: 16px;
- bottom: 0;
- @media (max-width: $screen-md-max) {
- top: 0;
+ &:after {
+ content: '';
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+ top: 50%;
+ left: 1px;
+ margin-top: -9px;
+ border-width: 10px 7px 10px 0;
+ border-right-color: #fff;
+ pointer-events: none;
+ }
}
- }
-
- @media (max-width: $screen-md-max) {
- text-align: center;
+ .count {
+ @include btn-gray;
+ display: inline-block;
+ background: white;
+ border-radius: 2px;
+ border-width: 1px;
+ border-style: solid;
+ font-size: 13px;
+ font-weight: 600;
+ line-height: 13px;
+ padding: $gl-vert-padding $gl-padding;
+ letter-spacing: .4px;
+ padding: 7px 14px;
+ text-align: center;
+ vertical-align: middle;
+ touch-action: manipulation;
+ background-image: none;
+ white-space: nowrap;
+ margin: 0 10px 0 4px;
+
+ a {
+ color: inherit;
+ }
- .project-info,
- .project-image-container {
- width: 100%;
+ &:hover {
+ background: #fff;
+ }
}
}
}
@@ -421,36 +363,42 @@ a.deploy-project-label {
}
.project-stats {
- margin-top: $gl-padding;
- margin-bottom: 0;
- padding: 0;
- background-color: $white-light;
font-size: 0;
+ border-bottom: 1px solid $border-color;
- ul.nav {
- display: inline-block;
+ .nav {
+ padding-top: 12px;
+ padding-bottom: 12px;
}
- .nav li {
+ .nav > li {
display: inline-block;
- margin: 16px 0;
- margin-right: 16px;
+
+ &:not(:last-child) {
+ margin-right: $gl-padding;
+ }
+
+ &.project-repo-buttons-right {
+ margin-top: 10px;
+
+ @media (min-width: $screen-md-min) {
+ float: right;
+ margin-top: 0;
+ }
+ }
}
.nav > li > a {
+ padding: 0;
background-color: transparent;
- padding: 5px 10px;
font-size: 15px;
+ line-height: 29px;
color: $notes-light-color;
- }
-
- li {
- display: inline;
- }
- a {
- float: left;
- font-size: 17px;
+ &:hover,
+ &:focus {
+ color: darken($notes-light-color, 15%);
+ }
}
li.missing {
@@ -458,6 +406,8 @@ a.deploy-project-label {
border-radius: $border-radius-default;
a {
+ padding-left: 10px;
+ padding-right: 10px;
color: $notes-light-color;
display: block;
}
@@ -466,10 +416,6 @@ a.deploy-project-label {
background-color: $gray-normal;
}
}
-
- &.row-content-block.second-block {
- margin-top: 0;
- }
}
pre.light-well {
@@ -557,8 +503,32 @@ pre.light-well {
}
.project-last-commit {
+ @media (min-width: $screen-sm-min) {
+ margin-top: $gl-padding;
+ }
+
+ &.container-fluid {
+ padding-top: 12px;
+ padding-bottom: 12px;
+ background-color: $background-color;
+ border: 1px solid $border-color;
+ border-right-width: 0;
+ border-left-width: 0;
+
+ @media (min-width: $screen-sm-min) {
+ border-right-width: 1px;
+ border-left-width: 1px;
+ }
+ }
+
+ &.container-limited {
+ @media (min-width: 1281px) {
+ border-radius: $border-radius-base;
+ }
+ }
+
.ci-status {
- margin-right: 16px;
+ margin-right: $gl-padding;
}
.commit-row-message {
@@ -566,19 +536,12 @@ pre.light-well {
}
.commit_short_id {
- margin: 0 5px;
+ margin-right: 5px;
color: $gl-link-color;
font-weight: 600;
}
.commit-author-link {
- margin-left: 7px;
- text-decoration: none;
- .avatar {
- float: none;
- margin-right: 4px;
- }
-
.commit-author-name {
font-weight: 600;
}
@@ -601,15 +564,10 @@ pre.light-well {
}
.git-clone-holder {
- width: 498px;
+ width: 380px;
.btn-clipboard {
border: 1px solid $border-color;
- padding: 6px $gl-padding;
- }
-
- .project-home-dropdown + & {
- margin-right: 45px;
}
.clone-options {
diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb
index 72bd1fbbd81..2b0defd1dda 100644
--- a/app/helpers/issues_helper.rb
+++ b/app/helpers/issues_helper.rb
@@ -118,7 +118,7 @@ module IssuesHelper
end
def emoji_icon(name, unicode = nil, aliases = [], sprite: true)
- unicode ||= Emoji.emoji_filename(name) rescue ""
+ unicode ||= Gitlab::Emoji.emoji_filename(name) rescue ""
data = {
aliases: aliases.join(" "),
diff --git a/app/helpers/members_helper.rb b/app/helpers/members_helper.rb
index c70cd19b587..ec106418f2d 100644
--- a/app/helpers/members_helper.rb
+++ b/app/helpers/members_helper.rb
@@ -12,17 +12,6 @@ module MembersHelper
can?(current_user, action_member_permission(:admin, member), member.source)
end
- def can_see_request_access_button?(source)
- source_parent = source.respond_to?(:group) && source.group
-
- return false if source_parent && source.group.members.exists?(user_id: current_user.id)
- return false if source_parent && source.group.requesters.exists?(user_id: current_user.id)
- return false if source.members.exists?(user_id: current_user.id)
- return true if source.requesters.exists?(user_id: current_user.id)
-
- true
- end
-
def remove_member_message(member, user: nil)
user = current_user if defined?(current_user)
diff --git a/app/models/ability.rb b/app/models/ability.rb
index ba1f2ae4075..eeb0ceba081 100644
--- a/app/models/ability.rb
+++ b/app/models/ability.rb
@@ -157,10 +157,11 @@ class Ability
# Push abilities on the users team role
rules.push(*project_team_rules(project.team, user))
- if project.owner == user ||
- (project.group && project.group.has_owner?(user)) ||
- user.admin?
+ owner = user.admin? ||
+ project.owner == user ||
+ (project.group && project.group.has_owner?(user))
+ if owner
rules.push(*project_owner_rules)
end
@@ -169,6 +170,10 @@ class Ability
# Allow to read builds for internal projects
rules << :read_build if project.public_builds?
+
+ unless owner || project.team.member?(user) || project_group_member?(project, user)
+ rules << :request_access
+ end
end
if project.archived?
@@ -345,8 +350,11 @@ class Ability
rules = []
rules << :read_group if can_read_group?(user, group)
+ owner = user.admin? || group.has_owner?(user)
+ master = owner || group.has_master?(user)
+
# Only group masters and group owners can create new projects
- if group.has_master?(user) || group.has_owner?(user) || user.admin?
+ if master
rules += [
:create_projects,
:admin_milestones
@@ -354,7 +362,7 @@ class Ability
end
# Only group owner and administrators can admin group
- if group.has_owner?(user) || user.admin?
+ if owner
rules += [
:admin_group,
:admin_namespace,
@@ -363,6 +371,10 @@ class Ability
]
end
+ if group.public? || (group.internal? && !user.external?)
+ rules << :request_access unless group.users.include?(user)
+ end
+
rules.flatten
end
@@ -564,5 +576,13 @@ class Ability
rules
end
+
+ def project_group_member?(project, user)
+ project.group &&
+ (
+ project.group.members.exists?(user_id: user.id) ||
+ project.group.requesters.exists?(user_id: user.id)
+ )
+ end
end
end
diff --git a/app/models/award_emoji.rb b/app/models/award_emoji.rb
index 59c7d87f5df..46b17479d6d 100644
--- a/app/models/award_emoji.rb
+++ b/app/models/award_emoji.rb
@@ -8,7 +8,7 @@ class AwardEmoji < ActiveRecord::Base
belongs_to :user
validates :awardable, :user, presence: true
- validates :name, presence: true, inclusion: { in: Emoji.emojis_names }
+ validates :name, presence: true, inclusion: { in: Gitlab::Emoji.emojis_names }
validates :name, uniqueness: { scope: [:user, :awardable_type, :awardable_id] }
participant :user
diff --git a/app/models/group.rb b/app/models/group.rb
index a8be7004ee8..37631b99701 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -90,7 +90,7 @@ class Group < Namespace
end
def avatar_url(size = nil)
- if avatar.present?
+ if self[:avatar].present?
[gitlab_config.url, avatar.url].join
end
end
diff --git a/app/models/project.rb b/app/models/project.rb
index ae96f00a705..e5fae15cb19 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -701,7 +701,7 @@ class Project < ActiveRecord::Base
end
def avatar_url
- if avatar.present?
+ if self[:avatar].present?
[gitlab_config.url, avatar.url].join
elsif avatar_in_git
Gitlab::Routing.url_helpers.namespace_project_avatar_url(namespace, self)
diff --git a/app/models/user.rb b/app/models/user.rb
index 5036a3e300c..695a47ba6eb 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -653,7 +653,7 @@ class User < ActiveRecord::Base
end
def avatar_url(size = nil, scale = 2)
- if avatar.present?
+ if self[:avatar].present?
[gitlab_config.url, avatar.url].join
else
GravatarService.new.execute(email, size, scale)
diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml
index 2234bf79c87..8596bbfdef6 100644
--- a/app/views/layouts/_page.html.haml
+++ b/app/views/layouts/_page.html.haml
@@ -8,11 +8,6 @@
- else
= render 'layouts/nav/explore'
- - if current_user
- = link_to current_user, class: 'sidebar-user', title: "Profile", data: {user: current_user.username} do
- = image_tag avatar_icon(current_user, 60), alt: 'Profile', class: 'avatar avatar s36'
- .username
- = current_user.username
= link_to '#', class: "nav-header-btn text-center pin-nav-btn has-tooltip #{'is-active' if pinned_nav?} js-nav-pin", title: pinned_nav? ? "Unpin navigation" : "Pin Navigation", data: {placement: 'right', container: 'body'} do
%span.sr-only Toggle navigation pinning
= icon('thumb-tack')
diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml
index d59a93a8fd7..11cee421a99 100644
--- a/app/views/layouts/header/_default.html.haml
+++ b/app/views/layouts/header/_default.html.haml
@@ -45,7 +45,9 @@
.dropdown-menu-nav.dropdown-menu-align-right
%ul
%li
- = link_to "Profile", current_user
+ = link_to "Profile", current_user, class: 'profile-link', data: { user: current_user.username }
+ %li
+ = link_to "Profile Settings", profile_path
%li.divider
%li
= link_to "Sign out", destroy_user_session_path, method: :delete, class: "sign-out-link", title: 'Sign out'
diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml
index 540efa4780f..cf11723dc8e 100644
--- a/app/views/projects/_home_panel.html.haml
+++ b/app/views/projects/_home_panel.html.haml
@@ -1,41 +1,29 @@
- empty_repo = @project.empty_repo?
-.project-home-panel.cover-block.clearfix{:class => ("empty-project" if empty_repo)}
+.project-home-panel.text-center{ class: ("empty-project" if empty_repo) }
%div{ class: container_class }
- .row
- .project-image-container
- = project_icon(@project, alt: '', class: 'project-avatar avatar s70')
- .project-info
- .cover-title.project-home-desc
- %h1
- = @project.name
- %span.visibility-icon.has-tooltip{data: { container: 'body' }, title: visibility_icon_description(@project)}
- = visibility_level_icon(@project.visibility_level, fw: false)
+ = project_icon(@project, alt: @project.name, class: 'project-avatar avatar s70')
+ %h1.project-title
+ = @project.name
+ %span.visibility-icon.has-tooltip{data: { container: 'body' }, title: visibility_icon_description(@project)}
+ = visibility_level_icon(@project.visibility_level, fw: false)
- - if @project.description.present?
- .cover-desc.project-home-desc
- = markdown(@project.description, pipeline: :description)
+ .project-home-desc
+ - if @project.description.present?
+ = markdown(@project.description, pipeline: :description)
- - if forked_from_project = @project.forked_from_project
- .cover-desc
- Forked from
- = link_to project_path(forked_from_project) do
- = forked_from_project.namespace.try(:name)
+ - if forked_from_project = @project.forked_from_project
+ %p
+ Forked from
+ = link_to project_path(forked_from_project) do
+ = forked_from_project.namespace.try(:name)
- .project-repo-buttons.project-action-buttons
- .count-buttons
- = render 'projects/buttons/star'
- = render 'projects/buttons/fork'
+ .project-repo-buttons.project-action-buttons
+ .count-buttons
+ = render 'projects/buttons/star'
+ = render 'projects/buttons/fork'
- .project-clone-holder
- = render "shared/clone_panel"
-
- .project-repo-buttons.btn-group.project-right-buttons
- - if current_user
- .pull-left.append-right-10= render 'shared/members/access_request_buttons', source: @project
-
- = render "projects/buttons/download"
- = render 'projects/buttons/dropdown'
- = render 'shared/notifications/button', notification_setting: @notification_setting
+ .project-clone-holder
+ = render "shared/clone_panel"
:javascript
new Star();
diff --git a/app/views/projects/_last_commit.html.haml b/app/views/projects/_last_commit.html.haml
index 66c30283c7a..630ae7d6140 100644
--- a/app/views/projects/_last_commit.html.haml
+++ b/app/views/projects/_last_commit.html.haml
@@ -1,11 +1,10 @@
-.project-last-commit
- - if commit.status
- = link_to builds_namespace_project_commit_path(commit.project.namespace, commit.project, commit), class: "ci-status ci-#{commit.status}" do
- = ci_icon_for_status(commit.status)
- = ci_label_for_status(commit.status)
+- if commit.status
+ = link_to builds_namespace_project_commit_path(commit.project.namespace, commit.project, commit), class: "ci-status ci-#{commit.status}" do
+ = ci_icon_for_status(commit.status)
+ = ci_label_for_status(commit.status)
- = link_to commit.short_id, namespace_project_commit_path(project.namespace, project, commit), class: "commit_short_id"
- = link_to_gfm commit.title, namespace_project_commit_path(project.namespace, project, commit), class: "commit-row-message"
- &middot;
- #{time_ago_with_tooltip(commit.committed_date, skip_js: true)} by
- = commit_author_link(commit, avatar: true, size: 24)
+= link_to commit.short_id, namespace_project_commit_path(project.namespace, project, commit), class: "commit_short_id"
+= link_to_gfm commit.title, namespace_project_commit_path(project.namespace, project, commit), class: "commit-row-message"
+&middot;
+#{time_ago_with_tooltip(commit.committed_date, skip_js: true)} by
+= commit_author_link(commit, avatar: true, size: 24)
diff --git a/app/views/projects/buttons/_fork.html.haml b/app/views/projects/buttons/_fork.html.haml
index 34ad9fe2c43..a9eaed4c5f6 100644
--- a/app/views/projects/buttons/_fork.html.haml
+++ b/app/views/projects/buttons/_fork.html.haml
@@ -14,6 +14,5 @@
Fork
%div.count-with-arrow
%span.arrow
- %span.count
- = link_to namespace_project_forks_path(@project.namespace, @project) do
- = @project.forks_count
+ = link_to namespace_project_forks_path(@project.namespace, @project), class: "count" do
+ = @project.forks_count
diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml
index f6e81af2638..58d8e068754 100644
--- a/app/views/projects/show.html.haml
+++ b/app/views/projects/show.html.haml
@@ -12,60 +12,67 @@
= render 'projects/last_push'
= render "home_panel"
-.project-stats.row-content-block.second-block
- %div{ class: container_class }
- %ul.nav
- %li
- = link_to project_files_path(@project) do
- Files (#{repository_size})
- %li
- = link_to namespace_project_commits_path(@project.namespace, @project, current_ref) do
- #{'Commit'.pluralize(@project.commit_count)} (#{number_with_delimiter(@project.commit_count)})
- %li
- = link_to namespace_project_branches_path(@project.namespace, @project) do
- #{'Branch'.pluralize(@repository.branch_count)} (#{number_with_delimiter(@repository.branch_count)})
+%nav.project-stats{ class: (container_class) }
+ %ul.nav
+ %li
+ = link_to project_files_path(@project) do
+ Files (#{repository_size})
+ %li
+ = link_to namespace_project_commits_path(@project.namespace, @project, current_ref) do
+ #{'Commit'.pluralize(@project.commit_count)} (#{number_with_delimiter(@project.commit_count)})
+ %li
+ = link_to namespace_project_branches_path(@project.namespace, @project) do
+ #{'Branch'.pluralize(@repository.branch_count)} (#{number_with_delimiter(@repository.branch_count)})
+ %li
+ = link_to namespace_project_tags_path(@project.namespace, @project) do
+ #{'Tag'.pluralize(@repository.tag_count)} (#{number_with_delimiter(@repository.tag_count)})
+
+ - if default_project_view != 'readme' && @repository.readme
%li
- = link_to namespace_project_tags_path(@project.namespace, @project) do
- #{'Tag'.pluralize(@repository.tag_count)} (#{number_with_delimiter(@repository.tag_count)})
+ = link_to 'Readme', readme_path(@project)
- - if default_project_view != 'readme' && @repository.readme
- %li
- = link_to 'Readme', readme_path(@project)
+ - if @repository.changelog
+ %li
+ = link_to 'Changelog', changelog_path(@project)
- - if @repository.changelog
- %li
- = link_to 'Changelog', changelog_path(@project)
+ - if @repository.license_blob
+ %li
+ = link_to license_short_name(@project), license_path(@project)
- - if @repository.license_blob
- %li
- = link_to license_short_name(@project), license_path(@project)
+ - if @repository.contribution_guide
+ %li
+ = link_to 'Contribution guide', contribution_guide_path(@project)
- - if @repository.contribution_guide
- %li
- = link_to 'Contribution guide', contribution_guide_path(@project)
+ - if current_user && can_push_branch?(@project, @project.default_branch)
+ - unless @repository.changelog
+ %li.missing
+ = link_to add_special_file_path(@project, file_name: 'CHANGELOG') do
+ Add Changelog
+ - unless @repository.license_blob
+ %li.missing
+ = link_to add_special_file_path(@project, file_name: 'LICENSE') do
+ Add License
+ - unless @repository.contribution_guide
+ %li.missing
+ = link_to add_special_file_path(@project, file_name: 'CONTRIBUTING.md', commit_message: 'Add contribution guide') do
+ Add Contribution guide
+ - unless @repository.gitlab_ci_yml
+ %li.missing
+ = link_to add_special_file_path(@project, file_name: '.gitlab-ci.yml') do
+ Set Up CI
+ %li.project-repo-buttons-right
+ .project-repo-buttons.project-right-buttons
+ - if current_user
+ = render 'shared/members/access_request_buttons', source: @project
- - if current_user && can_push_branch?(@project, @project.default_branch)
- - unless @repository.changelog
- %li.missing
- = link_to add_special_file_path(@project, file_name: 'CHANGELOG') do
- Add Changelog
- - unless @repository.license_blob
- %li.missing
- = link_to add_special_file_path(@project, file_name: 'LICENSE') do
- Add License
- - unless @repository.contribution_guide
- %li.missing
- = link_to add_special_file_path(@project, file_name: 'CONTRIBUTING.md', commit_message: 'Add contribution guide') do
- Add Contribution guide
- - unless @repository.gitlab_ci_yml
- %li.missing
- = link_to add_special_file_path(@project, file_name: '.gitlab-ci.yml') do
- Set Up CI
+ .btn-group.project-repo-btn-group
+ = render "projects/buttons/download"
+ = render 'projects/buttons/dropdown'
+ = render 'shared/notifications/button', notification_setting: @notification_setting
- if @repository.commit
- .content-block.second-block.white
- %div{ class: container_class }
- = render 'projects/last_commit', commit: @repository.commit, project: @project
+ .project-last-commit{ class: container_class }
+ = render 'projects/last_commit', commit: @repository.commit, project: @project
%div{ class: container_class }
- if @project.archived?
diff --git a/app/views/shared/members/_access_request_buttons.html.haml b/app/views/shared/members/_access_request_buttons.html.haml
index 35dcdccc921..eff914398bb 100644
--- a/app/views/shared/members/_access_request_buttons.html.haml
+++ b/app/views/shared/members/_access_request_buttons.html.haml
@@ -1,4 +1,4 @@
-- if can_see_request_access_button?(source)
+- if can?(current_user, :request_access, source)
- if requester = source.requesters.find_by(user_id: current_user.id)
= link_to 'Withdraw Access Request', polymorphic_path([:leave, source, :members]),
method: :delete,