Merge branch '21604-pipeline-ui-updates' into 'master'
Update pipeline graph styles to match mockup #### What does this MR do? * Updates CSS for pipeline graph to match mockup * Adds JS to dynamically change line widths based on number of builds #### Screenshots (if relevant) ![Screen_Shot_2016-10-04_at_2.06.24_PM](/uploads/362378ca23e18a3cc59185eafab9f9ac/Screen_Shot_2016-10-04_at_2.06.24_PM.png) #### What are the relevant issue numbers? Closes #21604 See merge request !6320
This commit is contained in:
commit
8f4e754414
|
@ -126,6 +126,9 @@
|
|||
new TreeView();
|
||||
}
|
||||
break;
|
||||
case 'projects:pipelines:show':
|
||||
new gl.Pipelines();
|
||||
break;
|
||||
case 'groups:activity':
|
||||
new Activities();
|
||||
break;
|
||||
|
|
|
@ -1,24 +1,40 @@
|
|||
(function() {
|
||||
function toggleGraph() {
|
||||
((global) => {
|
||||
|
||||
class Pipelines {
|
||||
constructor() {
|
||||
$(document).off('click', '.toggle-pipeline-btn').on('click', '.toggle-pipeline-btn', this.toggleGraph);
|
||||
this.addMarginToBuildColumns();
|
||||
}
|
||||
|
||||
toggleGraph() {
|
||||
const $pipelineBtn = $(this).closest('.toggle-pipeline-btn');
|
||||
const $pipelineGraph = $(this).closest('.row-content-block').next('.pipeline-graph');
|
||||
const $btnText = $(this).find('.toggle-btn-text');
|
||||
const $icon = $(this).find('.fa');
|
||||
const graphCollapsed = $pipelineGraph.hasClass('graph-collapsed');
|
||||
|
||||
$($pipelineBtn).add($pipelineGraph).toggleClass('graph-collapsed');
|
||||
|
||||
const graphCollapsed = $pipelineGraph.hasClass('graph-collapsed');
|
||||
const expandIcon = 'fa-caret-down';
|
||||
const hideIcon = 'fa-caret-up';
|
||||
|
||||
if(graphCollapsed) {
|
||||
$btnText.text('Expand');
|
||||
$icon.removeClass(hideIcon).addClass(expandIcon);
|
||||
} else {
|
||||
$btnText.text('Hide');
|
||||
$icon.removeClass(expandIcon).addClass(hideIcon);
|
||||
graphCollapsed ? $btnText.text('Expand') : $btnText.text('Hide')
|
||||
}
|
||||
|
||||
addMarginToBuildColumns() {
|
||||
const $secondChildBuildNode = $('.build:nth-child(2)');
|
||||
if ($secondChildBuildNode.length) {
|
||||
const $firstChildBuildNode = $secondChildBuildNode.prev('.build');
|
||||
const $multiBuildColumn = $secondChildBuildNode.closest('.stage-column');
|
||||
const $previousColumn = $multiBuildColumn.prev('.stage-column');
|
||||
$multiBuildColumn.addClass('left-margin');
|
||||
$firstChildBuildNode.addClass('left-connector');
|
||||
$previousColumn.each(function() {
|
||||
$this = $(this);
|
||||
if ($('.build', $this).length === 1) $this.addClass('no-margin');
|
||||
});
|
||||
}
|
||||
$('.pipeline-graph').removeClass('hidden');
|
||||
}
|
||||
}
|
||||
|
||||
$(document).on('click', '.toggle-pipeline-btn', toggleGraph);
|
||||
})();
|
||||
global.Pipelines = Pipelines;
|
||||
|
||||
})(window.gl || (window.gl = {}));
|
||||
|
|
|
@ -17,8 +17,10 @@ $white-normal: #ededed;
|
|||
$white-dark: #ececec;
|
||||
|
||||
$gray-light: #fafafa;
|
||||
$gray-lighter: #f9f9f9;
|
||||
$gray-normal: #f5f5f5;
|
||||
$gray-dark: #ededed;
|
||||
$gray-darker: #eee;
|
||||
$gray-darkest: #c9c9c9;
|
||||
|
||||
$green-light: #38ae67;
|
||||
|
@ -33,6 +35,8 @@ $blue-medium-light: #3498cb;
|
|||
$blue-medium: #2f8ebf;
|
||||
$blue-medium-dark: #2d86b4;
|
||||
|
||||
$blue-light-transparent: rgba(44, 159, 216, 0.05);
|
||||
|
||||
$orange-light: #fc8a51;
|
||||
$orange-normal: #e75e40;
|
||||
$orange-dark: #ce5237;
|
||||
|
@ -91,6 +95,7 @@ $table-text-gray: #8f8f8f;
|
|||
$gl-font-size: 15px;
|
||||
$gl-title-color: #333;
|
||||
$gl-text-color: #5c5c5c;
|
||||
$gl-text-color-light: #8c8c8c;
|
||||
$gl-text-green: #4a2;
|
||||
$gl-text-red: #d12f19;
|
||||
$gl-text-orange: #d90;
|
||||
|
|
|
@ -303,16 +303,41 @@
|
|||
.stage-column {
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
margin-right: 65px;
|
||||
|
||||
&:not(:last-child) {
|
||||
margin-right: 44px;
|
||||
}
|
||||
|
||||
&.left-margin {
|
||||
&:not(:first-child) {
|
||||
margin-left: 44px;
|
||||
|
||||
.left-connector {
|
||||
&::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 48%;
|
||||
left: -48px;
|
||||
border-top: 2px solid $border-color;
|
||||
width: 48px;
|
||||
height: 1px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.no-margin {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
li {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.stage-name {
|
||||
margin-bottom: 15px;
|
||||
margin: 0 0 15px 10px;
|
||||
font-weight: bold;
|
||||
width: 150px;
|
||||
width: 176px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
|
@ -321,17 +346,23 @@
|
|||
.build {
|
||||
border: 1px solid $border-color;
|
||||
position: relative;
|
||||
padding: 6px 10px;
|
||||
padding: 7px 10px 8px;
|
||||
border-radius: 30px;
|
||||
width: 150px;
|
||||
width: 186px;
|
||||
margin-bottom: 10px;
|
||||
|
||||
&:hover {
|
||||
background-color: $gray-lighter;
|
||||
.dropdown-menu-toggle {
|
||||
background-color: transparent;
|
||||
}
|
||||
}
|
||||
|
||||
&.playable {
|
||||
background-color: $gray-light;
|
||||
|
||||
svg {
|
||||
height: 12px;
|
||||
width: 12px;
|
||||
height: 13px;
|
||||
width: 20px;
|
||||
position: relative;
|
||||
top: 1px;
|
||||
|
||||
|
@ -342,10 +373,20 @@
|
|||
}
|
||||
|
||||
.build-content {
|
||||
width: 130px;
|
||||
display: -ms-flexbox;
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
width: 164px;
|
||||
|
||||
.ci-status-icon {
|
||||
svg {
|
||||
height: 20px;
|
||||
width: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.ci-status-text {
|
||||
width: 110px;
|
||||
width: 135px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
|
@ -356,44 +397,53 @@
|
|||
}
|
||||
|
||||
a {
|
||||
color: $layout-link-gray;
|
||||
color: $gl-text-color-light;
|
||||
text-decoration: none;
|
||||
|
||||
&:hover {
|
||||
.ci-status-text {
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.dropdown-menu-toggle {
|
||||
border: none;
|
||||
width: auto;
|
||||
padding: 0;
|
||||
color: $layout-link-gray;
|
||||
color: $gl-text-color-light;
|
||||
flex-grow: 1;
|
||||
|
||||
.ci-status-text {
|
||||
width: 80px;
|
||||
max-width: 112px;
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.grouped-pipeline-dropdown {
|
||||
padding: 8px 0;
|
||||
width: 200px;
|
||||
width: 186px;
|
||||
left: auto;
|
||||
right: -214px;
|
||||
right: -197px;
|
||||
top: -9px;
|
||||
max-height: 245px;
|
||||
overflow-y: scroll;
|
||||
|
||||
a:hover {
|
||||
a {
|
||||
color: $gl-text-color;
|
||||
padding: 7px 8px 8px;
|
||||
|
||||
&:hover {
|
||||
background-color: $blue-light-transparent;
|
||||
border-radius: 3px;
|
||||
|
||||
.ci-status-text {
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
svg {
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
}
|
||||
|
||||
.ci-status-text {
|
||||
width: 145px;
|
||||
width: 112px;
|
||||
}
|
||||
|
||||
.arrow {
|
||||
|
@ -426,9 +476,10 @@
|
|||
}
|
||||
|
||||
.badge {
|
||||
background-color: $gray-dark;
|
||||
color: $layout-link-gray;
|
||||
background-color: $gray-darker;
|
||||
color: $gl-text-color-light;
|
||||
font-weight: normal;
|
||||
margin-left: $btn-xs-side-margin;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -442,10 +493,10 @@
|
|||
&::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
right: -69px;
|
||||
top: 48%;
|
||||
right: -48px;
|
||||
border-top: 2px solid $border-color;
|
||||
width: 69px;
|
||||
width: 48px;
|
||||
height: 1px;
|
||||
}
|
||||
}
|
||||
|
@ -454,25 +505,25 @@
|
|||
&:not(:first-child) {
|
||||
&::after, &::before {
|
||||
content: '';
|
||||
top: -47px;
|
||||
top: -49px;
|
||||
position: absolute;
|
||||
border-bottom: 2px solid $border-color;
|
||||
width: 20px;
|
||||
height: 65px;
|
||||
width: 25px;
|
||||
height: 69px;
|
||||
}
|
||||
|
||||
// Right connecting curves
|
||||
&::after {
|
||||
right: -20px;
|
||||
right: -25px;
|
||||
border-right: 2px solid $border-color;
|
||||
border-radius: 0 0 15px;
|
||||
border-radius: 0 0 20px;
|
||||
}
|
||||
|
||||
// Left connecting curves
|
||||
&::before {
|
||||
left: -20px;
|
||||
left: -25px;
|
||||
border-left: 2px solid $border-color;
|
||||
border-radius: 0 0 0 15px;
|
||||
border-radius: 0 0 0 20px;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -480,7 +531,7 @@
|
|||
&:nth-child(2) {
|
||||
&::after, &::before {
|
||||
height: 29px;
|
||||
top: -10px;
|
||||
top: -9px;
|
||||
}
|
||||
.curve {
|
||||
display: block;
|
||||
|
@ -538,20 +589,20 @@
|
|||
width: 21px;
|
||||
height: 25px;
|
||||
position: absolute;
|
||||
top: -29px;
|
||||
top: -32px;
|
||||
border-top: 2px solid $border-color;
|
||||
}
|
||||
|
||||
&::after {
|
||||
left: -39px;
|
||||
left: -44px;
|
||||
border-right: 2px solid $border-color;
|
||||
border-radius: 0 15px;
|
||||
border-radius: 0 20px;
|
||||
}
|
||||
|
||||
&::before {
|
||||
right: -39px;
|
||||
right: -44px;
|
||||
border-left: 2px solid $border-color;
|
||||
border-radius: 15px 0 0;
|
||||
border-radius: 20px 0 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,8 +5,10 @@
|
|||
.ci-status-text= subject.name
|
||||
- elsif can?(current_user, :read_build, @project)
|
||||
= link_to namespace_project_build_path(subject.project.namespace, subject.project, subject) do
|
||||
%span.ci-status-icon
|
||||
= render_status_with_link('build', subject.status)
|
||||
.ci-status-text= subject.name
|
||||
- else
|
||||
%span.ci-status-icon
|
||||
= render_status_with_link('build', subject.status)
|
||||
= ci_icon_for_status(subject.status)
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
.pipeline-graph-container
|
||||
.row-content-block.build-content.middle-block.pipeline-actions
|
||||
.pull-right
|
||||
.btn.btn-grouped.btn-white.toggle-pipeline-btn
|
||||
%span.toggle-btn-text Hide
|
||||
%span pipeline graph
|
||||
= icon('caret-up')
|
||||
%span.caret
|
||||
- if can?(current_user, :update_pipeline, pipeline.project)
|
||||
- if pipeline.builds.latest.failed.any?(&:retryable?)
|
||||
= link_to "Retry failed", retry_namespace_project_pipeline_path(pipeline.project.namespace, pipeline.project, pipeline.id), class: 'btn btn-grouped btn-primary', method: :post
|
||||
|
@ -27,7 +28,7 @@
|
|||
in
|
||||
= time_interval_in_words pipeline.duration
|
||||
|
||||
.row-content-block.build-content.middle-block.pipeline-graph
|
||||
.row-content-block.build-content.middle-block.pipeline-graph.hidden
|
||||
.pipeline-visualization
|
||||
%ul.stage-column-list
|
||||
- stages = pipeline.stages_with_latest_statuses
|
||||
|
|
|
@ -10,5 +10,5 @@
|
|||
- else
|
||||
%li.build
|
||||
.curve
|
||||
.build-content
|
||||
.dropdown.inline.build-content
|
||||
= render "projects/commit/pipeline_status_group", name: group_name, subject: grouped_statuses
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
- group_status = CommitStatus.where(id: subject).status
|
||||
= render_status_with_link('build', group_status)
|
||||
.dropdown.inline
|
||||
%button.dropdown-menu-toggle{ type: 'button', data: { toggle: 'dropdown' } }
|
||||
%span.ci-status-icon
|
||||
= render_status_with_link('build', group_status)
|
||||
%span.ci-status-text
|
||||
= name
|
||||
%span.badge= subject.size
|
||||
%ul.dropdown-menu.grouped-pipeline-dropdown
|
||||
.arrow
|
||||
%li.arrow
|
||||
- subject.each do |status|
|
||||
%li
|
||||
= render "projects/#{status.to_partial_path}_pipeline", subject: status
|
||||
|
|
|
@ -62,5 +62,3 @@
|
|||
%td.coverage
|
||||
- if generic_commit_status.try(:coverage)
|
||||
#{generic_commit_status.coverage}%
|
||||
|
||||
%td
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
- if subject.target_url
|
||||
= link_to subject.target_url do
|
||||
%span.ci-status-icon
|
||||
= render_status_with_link('commit status', subject.status)
|
||||
%span.ci-status-text= subject.name
|
||||
- else
|
||||
%span.ci-status-icon
|
||||
= render_status_with_link('commit status', subject.status)
|
||||
%span.ci-status-text= subject.name
|
||||
|
|
Loading…
Reference in New Issue