Commit 74894a38 authored by Mike Greiling's avatar Mike Greiling

Merge branch 'bootstrap4' into 'master'

Upgrade to Bootstrap 4

Closes #45185 and #46710

See merge request gitlab-org/gitlab-ce!18232
parents 6f4935bc d219ed25
...@@ -46,8 +46,9 @@ linters: ...@@ -46,8 +46,9 @@ linters:
# - properties # - properties
# - @include declarations with inner @content # - @include declarations with inner @content
# - nested rule sets. # - nested rule sets.
# Disabled to minimize Bootstrap migration footprint
DeclarationOrder: DeclarationOrder:
enabled: true enabled: false
# `scss-lint:disable` control comments should be preceded by a comment # `scss-lint:disable` control comments should be preceded by a comment
# explaining why these linters are being disabled for this file. # explaining why these linters are being disabled for this file.
......
...@@ -257,7 +257,6 @@ gem 'sass-rails', '~> 5.0.6' ...@@ -257,7 +257,6 @@ gem 'sass-rails', '~> 5.0.6'
gem 'uglifier', '~> 2.7.2' gem 'uglifier', '~> 2.7.2'
gem 'addressable', '~> 2.5.2' gem 'addressable', '~> 2.5.2'
gem 'bootstrap-sass', '~> 3.3.0'
gem 'font-awesome-rails', '~> 4.7' gem 'font-awesome-rails', '~> 4.7'
gem 'gemojione', '~> 3.3' gem 'gemojione', '~> 3.3'
gem 'gon', '~> 6.2' gem 'gon', '~> 6.2'
......
...@@ -69,9 +69,6 @@ GEM ...@@ -69,9 +69,6 @@ GEM
attr_encrypted (3.1.0) attr_encrypted (3.1.0)
encryptor (~> 3.0.0) encryptor (~> 3.0.0)
attr_required (1.0.0) attr_required (1.0.0)
autoprefixer-rails (6.2.3)
execjs
json
awesome_print (1.2.0) awesome_print (1.2.0)
axiom-types (0.1.1) axiom-types (0.1.1)
descendants_tracker (~> 0.0.4) descendants_tracker (~> 0.0.4)
...@@ -91,9 +88,6 @@ GEM ...@@ -91,9 +88,6 @@ GEM
binding_of_caller (0.7.2) binding_of_caller (0.7.2)
debug_inspector (>= 0.0.1) debug_inspector (>= 0.0.1)
blankslate (2.1.2.4) blankslate (2.1.2.4)
bootstrap-sass (3.3.6)
autoprefixer-rails (>= 5.2.1)
sass (>= 3.3.4)
bootstrap_form (2.7.0) bootstrap_form (2.7.0)
brakeman (4.2.1) brakeman (4.2.1)
browser (2.2.0) browser (2.2.0)
...@@ -992,7 +986,6 @@ DEPENDENCIES ...@@ -992,7 +986,6 @@ DEPENDENCIES
benchmark-ips (~> 2.3.0) benchmark-ips (~> 2.3.0)
better_errors (~> 2.1.0) better_errors (~> 2.1.0)
binding_of_caller (~> 0.7.2) binding_of_caller (~> 0.7.2)
bootstrap-sass (~> 3.3.0)
bootstrap_form (~> 2.7.0) bootstrap_form (~> 2.7.0)
brakeman (~> 4.2) brakeman (~> 4.2)
browser (~> 2.2) browser (~> 2.2)
......
...@@ -345,7 +345,7 @@ class AwardsHandler { ...@@ -345,7 +345,7 @@ class AwardsHandler {
counter.text(counterNumber - 1); counter.text(counterNumber - 1);
this.removeYouFromUserList($emojiButton); this.removeYouFromUserList($emojiButton);
} else if (emoji === 'thumbsup' || emoji === 'thumbsdown') { } else if (emoji === 'thumbsup' || emoji === 'thumbsdown') {
$emojiButton.tooltip('destroy'); $emojiButton.tooltip('dispose');
counter.text('0'); counter.text('0');
this.removeYouFromUserList($emojiButton); this.removeYouFromUserList($emojiButton);
if ($emojiButton.parents('.note').length) { if ($emojiButton.parents('.note').length) {
...@@ -358,7 +358,7 @@ class AwardsHandler { ...@@ -358,7 +358,7 @@ class AwardsHandler {
} }
removeEmoji($emojiButton) { removeEmoji($emojiButton) {
$emojiButton.tooltip('destroy'); $emojiButton.tooltip('dispose');
$emojiButton.remove(); $emojiButton.remove();
const $votesBlock = this.getVotesBlock(); const $votesBlock = this.getVotesBlock();
if ($votesBlock.find('.js-emoji-btn').length === 0) { if ($votesBlock.find('.js-emoji-btn').length === 0) {
...@@ -392,7 +392,7 @@ class AwardsHandler { ...@@ -392,7 +392,7 @@ class AwardsHandler {
.removeAttr('data-title') .removeAttr('data-title')
.removeAttr('data-original-title') .removeAttr('data-original-title')
.attr('title', this.toSentence(authors)) .attr('title', this.toSentence(authors))
.tooltip('fixTitle'); .tooltip('_fixTitle');
} }
addYouToUserList(votesBlock, emoji) { addYouToUserList(votesBlock, emoji) {
...@@ -405,7 +405,7 @@ class AwardsHandler { ...@@ -405,7 +405,7 @@ class AwardsHandler {
users.unshift('You'); users.unshift('You');
return awardBlock return awardBlock
.attr('title', this.toSentence(users)) .attr('title', this.toSentence(users))
.tooltip('fixTitle'); .tooltip('_fixTitle');
} }
createAwardButtonForVotesBlock(votesBlock, emojiName) { createAwardButtonForVotesBlock(votesBlock, emojiName) {
......
...@@ -89,7 +89,7 @@ export default { ...@@ -89,7 +89,7 @@ export default {
v-show="hasError" v-show="hasError"
class="btn-group" class="btn-group"
> >
<div class="btn btn-default btn-xs disabled"> <div class="btn btn-default btn-sm disabled">
<icon <icon
class="prepend-left-8 append-right-8" class="prepend-left-8 append-right-8"
name="doc_image" name="doc_image"
...@@ -98,7 +98,7 @@ export default { ...@@ -98,7 +98,7 @@ export default {
/> />
</div> </div>
<div <div
class="btn btn-default btn-xs disabled" class="btn btn-default btn-sm disabled"
> >
<span class="prepend-left-8 append-right-8">{{ s__('Badges|No badge image') }}</span> <span class="prepend-left-8 append-right-8">{{ s__('Badges|No badge image') }}</span>
</div> </div>
...@@ -106,7 +106,7 @@ export default { ...@@ -106,7 +106,7 @@ export default {
<button <button
v-show="hasError" v-show="hasError"
class="btn btn-transparent btn-xs text-primary" class="btn btn-transparent btn-sm text-primary"
type="button" type="button"
v-tooltip v-tooltip
:title="s__('Badges|Reload badge image')" :title="s__('Badges|Reload badge image')"
......
...@@ -23,8 +23,8 @@ export default { ...@@ -23,8 +23,8 @@ export default {
</script> </script>
<template> <template>
<div class="panel panel-default"> <div class="card">
<div class="panel-heading"> <div class="card-header">
{{ s__('Badges|Your badges') }} {{ s__('Badges|Your badges') }}
<span <span
v-show="!isLoading" v-show="!isLoading"
...@@ -33,19 +33,19 @@ export default { ...@@ -33,19 +33,19 @@ export default {
</div> </div>
<loading-icon <loading-icon
v-show="isLoading" v-show="isLoading"
class="panel-body" class="card-body"
size="2" size="2"
/> />
<div <div
v-if="hasNoBadges" v-if="hasNoBadges"
class="panel-body" class="card-body"
> >
<span v-if="isGroupBadge">{{ s__('Badges|This group has no badges') }}</span> <span v-if="isGroupBadge">{{ s__('Badges|This group has no badges') }}</span>
<span v-else>{{ s__('Badges|This project has no badges') }}</span> <span v-else>{{ s__('Badges|This project has no badges') }}</span>
</div> </div>
<div <div
v-else v-else
class="panel-body" class="card-body"
> >
<badge-list-row <badge-list-row
v-for="badge in badges" v-for="badge in badges"
......
...@@ -8,10 +8,10 @@ function showTooltip(target, title) { ...@@ -8,10 +8,10 @@ function showTooltip(target, title) {
if (!$target.data('hideTooltip')) { if (!$target.data('hideTooltip')) {
$target $target
.attr('title', title) .attr('title', title)
.tooltip('fixTitle') .tooltip('_fixTitle')
.tooltip('show') .tooltip('show')
.attr('title', originalTitle) .attr('title', originalTitle)
.tooltip('fixTitle'); .tooltip('_fixTitle');
} }
} }
......
...@@ -69,7 +69,7 @@ $(document).on('keyup.quick_submit', '.js-quick-submit input[type=submit], .js-q ...@@ -69,7 +69,7 @@ $(document).on('keyup.quick_submit', '.js-quick-submit input[type=submit], .js-q
$this.tooltip({ $this.tooltip({
container: 'body', container: 'body',
html: 'true', html: 'true',
placement: 'auto top', placement: 'top',
title, title,
trigger: 'manual', trigger: 'manual',
}); });
......
...@@ -42,9 +42,9 @@ $.fn.requiresInput = function requiresInput() { ...@@ -42,9 +42,9 @@ $.fn.requiresInput = function requiresInput() {
function hideOrShowHelpBlock(form) { function hideOrShowHelpBlock(form) {
const selected = $('.js-select-namespace option:selected'); const selected = $('.js-select-namespace option:selected');
if (selected.length && selected.data('optionsParent') === 'groups') { if (selected.length && selected.data('optionsParent') === 'groups') {
form.find('.help-block').hide(); form.find('.form-text.text-muted').hide();
} else if (selected.length) { } else if (selected.length) {
form.find('.help-block').show(); form.find('.form-text.text-muted').show();
} }
} }
......
...@@ -2,9 +2,9 @@ import sqljs from 'sql.js'; ...@@ -2,9 +2,9 @@ import sqljs from 'sql.js';
import { template as _template } from 'underscore'; import { template as _template } from 'underscore';
const PREVIEW_TEMPLATE = _template(` const PREVIEW_TEMPLATE = _template(`
<div class="panel panel-default"> <div class="card">
<div class="panel-heading"><%- name %></div> <div class="card-header"><%- name %></div>
<div class="panel-body"> <div class="card-body">
<img class="img-thumbnail" src="data:image/png;base64,<%- image %>"/> <img class="img-thumbnail" src="data:image/png;base64,<%- image %>"/>
</div> </div>
</div> </div>
......
...@@ -44,7 +44,7 @@ export default class SketchLoader { ...@@ -44,7 +44,7 @@ export default class SketchLoader {
previewLink.href = previewUrl; previewLink.href = previewUrl;
previewLink.target = '_blank'; previewLink.target = '_blank';
previewImage.src = previewUrl; previewImage.src = previewUrl;
previewImage.className = 'img-responsive'; previewImage.className = 'img-fluid';
previewLink.appendChild(previewImage); previewLink.appendChild(previewImage);
this.container.appendChild(previewLink); this.container.appendChild(previewLink);
......
...@@ -116,7 +116,7 @@ export default class BlobViewer { ...@@ -116,7 +116,7 @@ export default class BlobViewer {
this.copySourceBtn.classList.add('disabled'); this.copySourceBtn.classList.add('disabled');
} }
$(this.copySourceBtn).tooltip('fixTitle'); $(this.copySourceBtn).tooltip('_fixTitle');
} }
switchToViewer(name) { switchToViewer(name) {
......
...@@ -77,7 +77,7 @@ export default { ...@@ -77,7 +77,7 @@ export default {
<template> <template>
<li <li
class="card" class="board-card"
:class="{ :class="{
'user-can-drag': !disabled && issue.id, 'user-can-drag': !disabled && issue.id,
'is-disabled': disabled || !issue.id, 'is-disabled': disabled || !issue.id,
......
...@@ -92,7 +92,7 @@ export default { ...@@ -92,7 +92,7 @@ export default {
<template> <template>
<div class="board-new-issue-form"> <div class="board-new-issue-form">
<div class="card"> <div class="board-card">
<form @submit="submit($event)"> <form @submit="submit($event)">
<div <div
class="flash-container" class="flash-container"
...@@ -122,7 +122,7 @@ export default { ...@@ -122,7 +122,7 @@ export default {
/> />
<div class="clearfix prepend-top-10"> <div class="clearfix prepend-top-10">
<button <button
class="btn btn-success pull-left" class="btn btn-success float-left"
type="submit" type="submit"
:disabled="disabled" :disabled="disabled"
ref="submit-button" ref="submit-button"
...@@ -130,7 +130,7 @@ export default { ...@@ -130,7 +130,7 @@ export default {
Submit issue Submit issue
</button> </button>
<button <button
class="btn btn-default pull-right" class="btn btn-default float-right"
type="button" type="button"
@click="cancel" @click="cancel"
> >
......
...@@ -135,8 +135,8 @@ gl.issueBoards.IssueCardInner = Vue.extend({ ...@@ -135,8 +135,8 @@ gl.issueBoards.IssueCardInner = Vue.extend({
}, },
template: ` template: `
<div> <div>
<div class="card-header"> <div class="board-card-header">
<h4 class="card-title"> <h4 class="board-card-title">
<i <i
class="fa fa-eye-slash confidential-icon" class="fa fa-eye-slash confidential-icon"
v-if="issue.confidential" v-if="issue.confidential"
...@@ -147,13 +147,13 @@ gl.issueBoards.IssueCardInner = Vue.extend({ ...@@ -147,13 +147,13 @@ gl.issueBoards.IssueCardInner = Vue.extend({
:href="issue.path" :href="issue.path"
:title="issue.title">{{ issue.title }}</a> :title="issue.title">{{ issue.title }}</a>
<span <span
class="card-number" class="board-card-number"
v-if="issueId" v-if="issueId"
> >
{{ issue.referencePath }} {{ issue.referencePath }}
</span> </span>
</h4> </h4>
<div class="card-assignee"> <div class="board-card-assignee">
<user-avatar-link <user-avatar-link
v-for="(assignee, index) in issue.assignees" v-for="(assignee, index) in issue.assignees"
:key="assignee.id" :key="assignee.id"
...@@ -175,11 +175,11 @@ gl.issueBoards.IssueCardInner = Vue.extend({ ...@@ -175,11 +175,11 @@ gl.issueBoards.IssueCardInner = Vue.extend({
</div> </div>
</div> </div>
<div <div
class="card-footer" class="board-card-footer"
v-if="showLabelFooter" v-if="showLabelFooter"
> >
<button <button
class="label color-label has-tooltip" class="badge color-label has-tooltip"
v-for="label in issue.labels" v-for="label in issue.labels"
type="button" type="button"
v-if="showLabel(label)" v-if="showLabel(label)"
......
...@@ -41,10 +41,10 @@ gl.issueBoards.ModalEmptyState = Vue.extend({ ...@@ -41,10 +41,10 @@ gl.issueBoards.ModalEmptyState = Vue.extend({
template: ` template: `
<section class="empty-state"> <section class="empty-state">
<div class="row"> <div class="row">
<div class="col-xs-12 col-sm-6 col-sm-push-6"> <div class="col-xs-12 col-sm-6 order-sm-last">
<aside class="svg-content"><img :src="emptyStateSvg"/></aside> <aside class="svg-content"><img :src="emptyStateSvg"/></aside>
</div> </div>
<div class="col-xs-12 col-sm-6 col-sm-pull-6"> <div class="col-xs-12 col-sm-6 order-sm-first">
<div class="text-content"> <div class="text-content">
<h4>{{ contents.title }}</h4> <h4>{{ contents.title }}</h4>
<p v-html="contents.content"></p> <p v-html="contents.content"></p>
......
...@@ -58,7 +58,7 @@ gl.issueBoards.ModalFooter = Vue.extend({ ...@@ -58,7 +58,7 @@ gl.issueBoards.ModalFooter = Vue.extend({
template: ` template: `
<footer <footer
class="form-actions add-issues-footer"> class="form-actions add-issues-footer">
<div class="pull-left"> <div class="float-left">
<button <button
class="btn btn-success" class="btn btn-success"
type="button" type="button"
...@@ -72,7 +72,7 @@ gl.issueBoards.ModalFooter = Vue.extend({ ...@@ -72,7 +72,7 @@ gl.issueBoards.ModalFooter = Vue.extend({
<lists-dropdown></lists-dropdown> <lists-dropdown></lists-dropdown>
</div> </div>
<button <button
class="btn btn-default pull-right" class="btn btn-default float-right"
type="button" type="button"
@click="toggleModal(false)"> @click="toggleModal(false)">
Cancel Cancel
......
...@@ -133,9 +133,9 @@ gl.issueBoards.ModalList = Vue.extend({ ...@@ -133,9 +133,9 @@ gl.issueBoards.ModalList = Vue.extend({
<div <div
v-for="issue in group" v-for="issue in group"
v-if="showIssue(issue)" v-if="showIssue(issue)"
class="card-parent"> class="board-card-parent">
<div <div
class="card" class="board-card"
:class="{ 'is-active': issue.selected }" :class="{ 'is-active': issue.selected }"
@click="toggleIssue($event, issue)"> @click="toggleIssue($event, issue)">
<issue-card-inner <issue-card-inner
......
...@@ -24,7 +24,7 @@ gl.issueBoards.ModalTabs = Vue.extend({ ...@@ -24,7 +24,7 @@ gl.issueBoards.ModalTabs = Vue.extend({
role="button" role="button"
@click.prevent="changeTab('all')"> @click.prevent="changeTab('all')">
Open issues Open issues
<span class="badge"> <span class="badge badge-pill">
{{ issuesCount }} {{ issuesCount }}
</span> </span>
</a> </a>
...@@ -35,7 +35,7 @@ gl.issueBoards.ModalTabs = Vue.extend({ ...@@ -35,7 +35,7 @@ gl.issueBoards.ModalTabs = Vue.extend({
role="button" role="button"
@click.prevent="changeTab('selected')"> @click.prevent="changeTab('selected')">
Selected issues Selected issues
<span class="badge"> <span class="badge badge-pill">
{{ selectedCount }} {{ selectedCount }}
</span> </span>
</a> </a>
......
...@@ -214,7 +214,7 @@ export default () => { ...@@ -214,7 +214,7 @@ export default () => {
if (this.disabled) { if (this.disabled) {
$tooltip.tooltip(); $tooltip.tooltip();
} else { } else {
$tooltip.tooltip('destroy'); $tooltip.tooltip('dispose');
} }
}); });
}, },
......
...@@ -141,6 +141,11 @@ export default class VariableList { ...@@ -141,6 +141,11 @@ export default class VariableList {
$rowClone.find(entry.selector).val(entry.default); $rowClone.find(entry.selector).val(entry.default);
}); });
// Close any dropdowns
$rowClone.find('.dropdown-menu.show').each((index, $dropdown) => {
$dropdown.classList.remove('show');
});
this.initRow($rowClone); this.initRow($rowClone);
$row.after($rowClone); $row.after($rowClone);
......
...@@ -191,11 +191,11 @@ export default { ...@@ -191,11 +191,11 @@ export default {
:value="ingressExternalIp" :value="ingressExternalIp"
readonly readonly
/> />
<span class="input-group-btn"> <span class="input-group-append">
<clipboard-button <clipboard-button
:text="ingressExternalIp" :text="ingressExternalIp"
:title="s__('ClusterIntegration|Copy Ingress IP Address to clipboard')" :title="s__('ClusterIntegration|Copy Ingress IP Address to clipboard')"
class="js-clipboard-btn" class="input-group-text js-clipboard-btn"
/> />
</span> </span>
</div> </div>
......
import $ from 'jquery'; import $ from 'jquery';
// bootstrap jQuery plugins // bootstrap jQuery plugins
import 'bootstrap-sass/assets/javascripts/bootstrap/affix'; import 'bootstrap';
import 'bootstrap-sass/assets/javascripts/bootstrap/alert';
import 'bootstrap-sass/assets/javascripts/bootstrap/button';
import 'bootstrap-sass/assets/javascripts/bootstrap/dropdown';
import 'bootstrap-sass/assets/javascripts/bootstrap/modal';
import 'bootstrap-sass/assets/javascripts/bootstrap/tab';
import 'bootstrap-sass/assets/javascripts/bootstrap/transition';
import 'bootstrap-sass/assets/javascripts/bootstrap/tooltip';
import 'bootstrap-sass/assets/javascripts/bootstrap/popover';
// custom jQuery functions // custom jQuery functions
$.fn.extend({ $.fn.extend({
......
...@@ -78,7 +78,7 @@ export default function initCompareAutocomplete(limitTo = null, clickHandler = ( ...@@ -78,7 +78,7 @@ export default function initCompareAutocomplete(limitTo = null, clickHandler = (
$dropdownContainer.on('click', '.dropdown-content a', e => { $dropdownContainer.on('click', '.dropdown-content a', e => {
$dropdown.prop('title', e.target.text.replace(/_+?/g, '-')); $dropdown.prop('title', e.target.text.replace(/_+?/g, '-'));
if ($dropdown.hasClass('has-tooltip')) { if ($dropdown.hasClass('has-tooltip')) {
$dropdown.tooltip('fixTitle'); $dropdown.tooltip('_fixTitle');
} }
}); });
}); });
......
...@@ -61,8 +61,8 @@ export default class CreateMergeRequestDropdown { ...@@ -61,8 +61,8 @@ export default class CreateMergeRequestDropdown {
} }
available() { available() {
this.availableButton.classList.remove('hide'); this.availableButton.classList.remove('hidden');
this.unavailableButton.classList.add('hide'); this.unavailableButton.classList.add('hidden');
} }
bindEvents() { bindEvents() {
...@@ -232,7 +232,7 @@ export default class CreateMergeRequestDropdown { ...@@ -232,7 +232,7 @@ export default class CreateMergeRequestDropdown {
} }
hide() { hide() {
this.wrapperEl.classList.add('hide'); this.wrapperEl.classList.add('hidden');
} }
init() { init() {
...@@ -406,8 +406,8 @@ export default class CreateMergeRequestDropdown { ...@@ -406,8 +406,8 @@ export default class CreateMergeRequestDropdown {
} }
unavailable() { unavailable() {
this.availableButton.classList.add('hide'); this.availableButton.classList.add('hidden');
this.unavailableButton.classList.remove('hide'); this.unavailableButton.classList.remove('hidden');
} }
updateBranchName(suggestedBranchName) { updateBranchName(suggestedBranchName) {
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
<template> <template>
<span <span
v-if="count === 50" v-if="count === 50"
class="events-info pull-right" class="events-info float-right"
> >
<i <i
class="fa fa-warning" class="fa fa-warning"
......
...@@ -79,7 +79,7 @@ const DiffNoteAvatars = Vue.extend({ ...@@ -79,7 +79,7 @@ const DiffNoteAvatars = Vue.extend({
storeState: { storeState: {
handler() { handler() {
this.$nextTick(() => { this.$nextTick(() => {
$('.has-tooltip', this.$el).tooltip('fixTitle'); $('.has-tooltip', this.$el).tooltip('_fixTitle');
// We need to add/remove a class to an element that is outside the Vue instance // We need to add/remove a class to an element that is outside the Vue instance
this.addNoCommentClass(); this.addNoCommentClass();
...@@ -138,7 +138,7 @@ const DiffNoteAvatars = Vue.extend({ ...@@ -138,7 +138,7 @@ const DiffNoteAvatars = Vue.extend({
this.$nextTick(() => { this.$nextTick(() => {
this.setDiscussionVisible(); this.setDiscussionVisible();
$('.has-tooltip', this.$el).tooltip('fixTitle'); $('.has-tooltip', this.$el).tooltip('_fixTitle');
$('.has-tooltip', this.$el).tooltip('hide'); $('.has-tooltip', this.$el).tooltip('hide');
}); });
}, },
......
...@@ -61,7 +61,7 @@ const ResolveBtn = Vue.extend({ ...@@ -61,7 +61,7 @@ const ResolveBtn = Vue.extend({
this.$nextTick(() => { this.$nextTick(() => {
$(this.$refs.button) $(this.$refs.button)
.tooltip('hide') .tooltip('hide')
.tooltip('fixTitle'); .tooltip('_fixTitle');
}); });
}, },
resolve: function () { resolve: function () {
......
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
</span> </span>
</button> </button>
<ul class="dropdown-menu dropdown-menu-align-right"> <ul class="dropdown-menu dropdown-menu-right">
<li <li
v-for="(action, i) in actions" v-for="(action, i) in actions"
:key="i"> :key="i">
......
...@@ -486,14 +486,14 @@ ...@@ -486,14 +486,14 @@
{{ model.folderName }} {{ model.folderName }}
</span> </span>
<span class="badge"> <span class="badge badge-pill">
{{ model.size }} {{ model.size }}
</span> </span>
</span> </span>
</div> </div>
<div <div
class="table-section section-10 deployment-column hidden-xs hidden-sm" class="table-section section-10 deployment-column d-none d-sm-none d-md-block"
role="gridcell" role="gridcell"
> >
<span v-if="shouldRenderDeploymentID"> <span v-if="shouldRenderDeploymentID">
...@@ -513,7 +513,7 @@ ...@@ -513,7 +513,7 @@
</div> </div>
<div <div
class="table-section section-15 hidden-xs hidden-sm" class="table-section section-15 d-none d-sm-none d-md-block"
role="gridcell" role="gridcell"
> >
<a <a
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
<template> <template>
<a <a
v-tooltip v-tooltip
class="btn monitoring-url hidden-xs hidden-sm" class="btn monitoring-url d-none d-sm-none d-md-block"
data-container="body" data-container="body"
rel="noopener noreferrer nofollow" rel="noopener noreferrer nofollow"
:href="monitoringUrl" :href="monitoringUrl"
......
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
<template> <template>
<button <button
type="button" type="button"
class="btn hidden-xs hidden-sm" class="btn d-none d-sm-none d-md-block"
@click="onClick" @click="onClick"
:disabled="isLoading" :disabled="isLoading"
> >
......
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
if (confirm('Are you sure you want to stop this environment?')) { if (confirm('Are you sure you want to stop this environment?')) {
this.isLoading = true; this.isLoading = true;
$(this.$el).tooltip('destroy'); $(this.$el).tooltip('dispose');
eventHub.$emit('postAction', this.stopUrl); eventHub.$emit('postAction', this.stopUrl);
} }
...@@ -55,7 +55,7 @@ ...@@ -55,7 +55,7 @@
<button <button
v-tooltip v-tooltip
type="button" type="button"
class="btn stop-env-link hidden-xs hidden-sm" class="btn stop-env-link d-none d-sm-none d-md-block"
data-container="body" data-container="body"
@click="onClick" @click="onClick"
:disabled="isLoading" :disabled="isLoading"
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
<template> <template>
<a <a
v-tooltip v-tooltip
class="btn terminal-button hidden-xs hidden-sm" class="btn terminal-button d-none d-sm-none d-md-block"
data-container="body" data-container="body"
:title="title" :title="title"
:aria-label="title" :aria-label="title"
......
...@@ -24,7 +24,7 @@ export function setupFeatureHighlightPopover(id, debounceTimeout = 300) { ...@@ -24,7 +24,7 @@ export function setupFeatureHighlightPopover(id, debounceTimeout = 300) {
template: ` template: `
<div class="popover feature-highlight-popover" role="tooltip"> <div class="popover feature-highlight-popover" role="tooltip">
<div class="arrow"></div> <div class="arrow"></div>
<div class="popover-content"></div> <div class="popover-body"></div>
</div> </div>
`, `,
}) })
......
...@@ -374,7 +374,7 @@ GitLabDropdown = (function() { ...@@ -374,7 +374,7 @@ GitLabDropdown = (function() {
$relatedTarget = $(e.relatedTarget); $relatedTarget = $(e.relatedTarget);
$dropdownMenu = $relatedTarget.closest('.dropdown-menu'); $dropdownMenu = $relatedTarget.closest('.dropdown-menu');
if ($dropdownMenu.length === 0) { if ($dropdownMenu.length === 0) {
return _this.dropdown.removeClass('open'); return _this.dropdown.removeClass('show');
} }
} }
}; };
...@@ -801,7 +801,7 @@ GitLabDropdown = (function() { ...@@ -801,7 +801,7 @@ GitLabDropdown = (function() {
if (this.options.filterable) { if (this.options.filterable) {
const initialScrollTop = $(window).scrollTop(); const initialScrollTop = $(window).scrollTop();
if (this.dropdown.is('.open')) { if (this.dropdown.is('.show') && !this.filterInput.is(':focus')) {
this.filterInput.focus(); this.filterInput.focus();
} }
......
...@@ -62,7 +62,7 @@ export default class GlFieldError { ...@@ -62,7 +62,7 @@ export default class GlFieldError {
this.inputDomElement = this.inputElement.get(0); this.inputDomElement = this.inputElement.get(0);
this.form = formErrors; this.form = formErrors;
this.errorMessage = this.inputElement.attr('title') || 'This field is required.'; this.errorMessage = this.inputElement.attr('title') || 'This field is required.';
this.fieldErrorElement = $(`<p class='${errorMessageClass} hide'>${this.errorMessage}</p>`); this.fieldErrorElement = $(`<p class='${errorMessageClass} hidden'>${this.errorMessage}</p>`);
this.state = { this.state = {
valid: false, valid: false,
...@@ -146,8 +146,8 @@ export default class GlFieldError { ...@@ -146,8 +146,8 @@ export default class GlFieldError {
renderInvalid() { renderInvalid() {
this.inputElement.addClass(inputErrorClass); this.inputElement.addClass(inputErrorClass);
this.scopedSiblings.hide(); this.scopedSiblings.addClass('hidden');
return this.fieldErrorElement.show(); return this.fieldErrorElement.removeClass('hidden');
} }
renderClear() { renderClear() {
...@@ -157,7 +157,7 @@ export default class GlFieldError { ...@@ -157,7 +157,7 @@ export default class GlFieldError {
this.accessCurrentValue(trimmedInput); this.accessCurrentValue(trimmedInput);
} }
this.inputElement.removeClass(inputErrorClass); this.inputElement.removeClass(inputErrorClass);
this.scopedSiblings.hide(); this.scopedSiblings.addClass('hidden');
this.fieldErrorElement.hide(); this.fieldErrorElement.addClass('hidden');
} }
} }
...@@ -99,7 +99,7 @@ export default { ...@@ -99,7 +99,7 @@ export default {
/> />
</div> </div>
<div <div
class="avatar-container prepend-top-8 prepend-left-5 s24 hidden-xs" class="avatar-container prepend-top-8 prepend-left-5 s24 d-none d-sm-block"
:class="{ 'content-loading': group.isChildrenLoading }" :class="{ 'content-loading': group.isChildrenLoading }"
> >
<a <a
......
...@@ -102,12 +102,12 @@ export default { ...@@ -102,12 +102,12 @@ export default {
class="ide-empty-state" class="ide-empty-state"
> >
<div class="row js-empty-state"> <div class="row js-empty-state">
<div class="col-xs-12"> <div class="col-12">
<div class="svg-content svg-250"> <div class="svg-content svg-250">
<img :src="emptyStateSvgPath" /> <img :src="emptyStateSvgPath" />
</div> </div>
</div> </div>
<div class="col-xs-12"> <div class="col-12">
<div class="text-content text-center"> <div class="text-content text-center">
<h4> <h4>
Welcome to the GitLab IDE Welcome to the GitLab IDE
......
...@@ -32,14 +32,14 @@ export default { ...@@ -32,14 +32,14 @@ export default {
<template> <template>
<div <div
v-if="showButtons" v-if="showButtons"
class="pull-right ide-btn-group" class="float-right ide-btn-group"
> >
<a <a
v-tooltip v-tooltip
v-if="!file.binary" v-if="!file.binary"
:href="file.blamePath" :href="file.blamePath"
:title="__('Blame')" :title="__('Blame')"
class="btn btn-xs btn-transparent blame" class="btn btn-sm btn-transparent blame"
> >
<icon <icon
name="blame" name="blame"
...@@ -50,7 +50,7 @@ export default { ...@@ -50,7 +50,7 @@ export default {
v-tooltip v-tooltip
:href="file.commitsPath" :href="file.commitsPath"
:title="__('History')" :title="__('History')"
class="btn btn-xs btn-transparent history" class="btn btn-sm btn-transparent history"
> >
<icon <icon
name="history" name="history"
...@@ -61,7 +61,7 @@ export default { ...@@ -61,7 +61,7 @@ export default {
v-tooltip v-tooltip
:href="file.permalink" :href="file.permalink"
:title="__('Permalink')" :title="__('Permalink')"
class="btn btn-xs btn-transparent permalink" class="btn btn-sm btn-transparent permalink"
> >
<icon <icon
name="link" name="link"
...@@ -72,7 +72,7 @@ export default { ...@@ -72,7 +72,7 @@ export default {
v-tooltip v-tooltip
:href="file.rawPath" :href="file.rawPath"
target="_blank" target="_blank"
class="btn btn-xs btn-transparent prepend-left-10 raw" class="btn btn-sm btn-transparent prepend-left-10 raw"
rel="noopener noreferrer" rel="noopener noreferrer"
:title="rawDownloadButtonLabel"> :title="rawDownloadButtonLabel">
<icon <icon
......
...@@ -57,7 +57,7 @@ export default { ...@@ -57,7 +57,7 @@ export default {
<div <div
class="dropdown" class="dropdown"
:class="{ :class="{
open: dropdownOpen, show: dropdownOpen,
}" }"
> >
<button <button
...@@ -69,12 +69,12 @@ export default { ...@@ -69,12 +69,12 @@ export default {
<icon <icon
name="plus" name="plus"
:size="12" :size="12"
css-classes="pull-left" css-classes="float-left"
/> />
<icon <icon
name="arrow-down" name="arrow-down"
:size="12" :size="12"
css-classes="pull-left" css-classes="float-left"
/> />
</button> </button>
<ul <ul
......
...@@ -70,12 +70,12 @@ export default { ...@@ -70,12 +70,12 @@ export default {
@submit="createEntryInStore" @submit="createEntryInStore"
> >
<form <form
class="form-horizontal"
slot="body" slot="body"
@submit.prevent="createEntryInStore" @submit.prevent="createEntryInStore"
class="form-group row append-bottom-0"
> >
<fieldset class="form-group append-bottom-0"> <fieldset class="form-group append-bottom-0">
<label class="label-light col-sm-3 ide-new-modal-label"> <label class="label-light col-form-label col-sm-3 ide-new-modal-label">
{{ __('Name') }} {{ __('Name') }}
</label> </label>
<div class="col-sm-9"> <div class="col-sm-9">
......
...@@ -197,7 +197,7 @@ export default { ...@@ -197,7 +197,7 @@ export default {
> >
<div class="ide-mode-tabs clearfix" > <div class="ide-mode-tabs clearfix" >
<ul <ul
class="nav-links pull-left" class="nav-links float-left"
v-if="!shouldHideEditor && isEditModeActive" v-if="!shouldHideEditor && isEditModeActive"
> >
<li :class="editTabCSS"> <li :class="editTabCSS">
......
...@@ -144,7 +144,7 @@ export default { ...@@ -144,7 +144,7 @@ export default {
:file="file" :file="file"
/> />
</span> </span>
<span class="pull-right ide-file-icon-holder"> <span class="float-right ide-file-icon-holder">
<mr-file-icon <mr-file-icon
v-if="file.mrChange" v-if="file.mrChange"
/> />
...@@ -177,7 +177,7 @@ export default { ...@@ -177,7 +177,7 @@ export default {
:project-id="file.projectId" :project-id="file.projectId"
:branch="file.branchId" :branch="file.branchId"
:path="file.path" :path="file.path"
class="pull-right prepend-left-8" class="float-right prepend-left-8"
/> />
</div> </div>
</div> </div>
......
...@@ -25,13 +25,13 @@ ...@@ -25,13 +25,13 @@
/> />
</td> </td>
<template v-if="!leftPanelCollapsed"> <template v-if="!leftPanelCollapsed">
<td class="hidden-sm hidden-xs"> <td class="d-none d-sm-none d-md-block">
<skeleton-loading-container <skeleton-loading-container
:small="true" :small="true"
/> />
</td> </td>
<td class="hidden-xs"> <td class="d-none d-sm-block">
<skeleton-loading-container <skeleton-loading-container
class="animation-container-right" class="animation-container-right"
:small="true" :small="true"
......
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
<template> <template>
<div class="prepend-top-default append-bottom-default clearfix"> <div class="prepend-top-default append-bottom-default clearfix">
<button <button
class="btn btn-save pull-left" class="btn btn-save float-left"
:class="{ disabled: formState.updateLoading || !isSubmitEnabled }" :class="{ disabled: formState.updateLoading || !isSubmitEnabled }"
type="submit" type="submit"
:disabled="formState.updateLoading || !isSubmitEnabled" :disabled="formState.updateLoading || !isSubmitEnabled"
...@@ -64,14 +64,14 @@ ...@@ -64,14 +64,14 @@
</i> </i>
</button> </button>
<button <button
class="btn btn-default pull-right" class="btn btn-default float-right"
type="button" type="button"
@click="closeForm"> @click="closeForm">
Cancel Cancel
</button> </button>
<button <button
v-if="shouldShowDeleteButton" v-if="shouldShowDeleteButton"
class="btn btn-danger pull-right append-right-default" class="btn btn-danger float-right append-right-default"
:class="{ disabled: deleteLoading }" :class="{ disabled: deleteLoading }"
type="button" type="button"
:disabled="deleteLoading" :disabled="deleteLoading"
......
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,7 @@
<div <div
:class="{ :class="{
'col-sm-8 col-lg-9': hasIssuableTemplates, 'col-sm-8 col-lg-9': hasIssuableTemplates,
'col-xs-12': !hasIssuableTemplates, 'col-12': !hasIssuableTemplates,
}" }"
> >
<title-field <title-field
......
import $ from 'jquery'; import $ from 'jquery';
import _ from 'underscore'; import _ from 'underscore';
import StickyFill from 'stickyfilljs';
import axios from './lib/utils/axios_utils'; import axios from './lib/utils/axios_utils';
import { visitUrl } from './lib/utils/url_utility'; import { visitUrl } from './lib/utils/url_utility';
import bp from './breakpoints'; import bp from './breakpoints';
...@@ -82,17 +83,11 @@ export default class Job { ...@@ -82,17 +83,11 @@ export default class Job {
/** /**
If the browser does not support position sticky, it returns the position as static. If the browser does not support position sticky, it returns the position as static.
If the browser does support sticky, then we allow the browser to handle it, if not If the browser does support sticky, then we allow the browser to handle it, if not
then we default back to Bootstraps affix then we use a polyfill
**/ **/
if (this.$topBar.css('position') !== 'static') return; if (this.$topBar.css('position') !== 'static') return;
const offsetTop = this.$buildTrace.offset().top; StickyFill.add(this.$topBar);
this.$topBar.affix({
offset: {
top: offsetTop,
},
});
} }
// eslint-disable-next-line class-methods-use-this // eslint-disable-next-line class-methods-use-this
......
...@@ -56,7 +56,7 @@ export default { ...@@ -56,7 +56,7 @@ export default {
actions.push({ actions.push({
label: 'New issue', label: 'New issue',
path: this.job.new_issue_path, path: this.job.new_issue_path,
cssClass: 'js-new-issue btn btn-new btn-inverted visible-md-block visible-lg-block', cssClass: 'js-new-issue btn btn-new btn-inverted d-none d-md-block d-lg-block d-xl-block',
type: 'link', type: 'link',
}); });
} }
......
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
<span <span
v-if="hasHelpURL" v-if="hasHelpURL"
class="help-button pull-right" class="help-button float-right"
> >
<a <a
:href="helpUrl" :href="helpUrl"
......
...@@ -48,7 +48,7 @@ export default { ...@@ -48,7 +48,7 @@ export default {
return `${this.job.runner.description} (#${this.job.runner.id})`; return `${this.job.runner.description} (#${this.job.runner.id})`;
}, },
retryButtonClass() { retryButtonClass() {
let className = 'js-retry-button pull-right btn btn-retry visible-md-block visible-lg-block'; let className = 'js-retry-button pull-right btn btn-retry d-none d-md-block d-lg-block d-xl-block';
className += className +=
this.job.status && this.job.recoverable this.job.status && this.job.recoverable
? ' btn-primary' ? ' btn-primary'
...@@ -105,7 +105,7 @@ export default { ...@@ -105,7 +105,7 @@ export default {
type="button" type="button"
:aria-label="__('Toggle Sidebar')" :aria-label="__('Toggle Sidebar')"
class="btn btn-blank gutter-toggle pull-right class="btn btn-blank gutter-toggle pull-right
visible-xs-block visible-sm-block js-sidebar-build-toggle" d-block d-sm-block d-md-none js-sidebar-build-toggle"
> >
<i <i
aria-hidden="true" aria-hidden="true"
......
...@@ -35,7 +35,7 @@ export default class LabelManager { ...@@ -35,7 +35,7 @@ export default class LabelManager {
const $label = $(`#${$btn.data('domId')}`); const $label = $(`#${$btn.data('domId')}`);
const action = $btn.parents('.js-prioritized-labels').length ? 'remove' : 'add'; const action = $btn.parents('.js-prioritized-labels').length ? 'remove' : 'add';
const $tooltip = $(`#${$btn.find('.has-tooltip:visible').attr('aria-describedby')}`); const $tooltip = $(`#${$btn.find('.has-tooltip:visible').attr('aria-describedby')}`);
$tooltip.tooltip('destroy'); $tooltip.tooltip('dispose');
_this.toggleLabelPriority($label, action); _this.toggleLabelPriority($label, action);
_this.toggleEmptyState($label, $btn, action); _this.toggleEmptyState($label, $btn, action);
} }
......
...@@ -120,7 +120,7 @@ export default class LabelsSelect { ...@@ -120,7 +120,7 @@ export default class LabelsSelect {
$sidebarLabelTooltip $sidebarLabelTooltip
.attr('title', labelTooltipTitle) .attr('title', labelTooltipTitle)
.tooltip('fixTitle'); .tooltip('_fixTitle');
$('.has-tooltip', $value).tooltip({ $('.has-tooltip', $value).tooltip({
container: 'body' container: 'body'
......
...@@ -51,7 +51,7 @@ export const rstrip = (val) => { ...@@ -51,7 +51,7 @@ export const rstrip = (val) => {
return val; return val;
}; };
export const updateTooltipTitle = ($tooltipEl, newTitle) => $tooltipEl.attr('title', newTitle).tooltip('fixTitle'); export const updateTooltipTitle = ($tooltipEl, newTitle) => $tooltipEl.attr('title', newTitle).tooltip('_fixTitle');
export const disableButtonIfEmptyField = (fieldSelector, buttonSelector, eventName = 'input') => { export const disableButtonIfEmptyField = (fieldSelector, buttonSelector, eventName = 'input') => {
const field = $(fieldSelector); const field = $(fieldSelector);
......
...@@ -143,8 +143,7 @@ export const localTimeAgo = ($timeagoEls, setTimeago = true) => { ...@@ -143,8 +143,7 @@ export const localTimeAgo = ($timeagoEls, setTimeago = true) => {
if (setTimeago) { if (setTimeago) {
// Recreate with custom template // Recreate with custom template
$(el).tooltip({ $(el).tooltip({
template: template: '<div class="tooltip local-timeago" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',
'<div class="tooltip local-timeago" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
}); });
} }
......
...@@ -46,9 +46,9 @@ document.addEventListener('beforeunload', () => { ...@@ -46,9 +46,9 @@ document.addEventListener('beforeunload', () => {
// Unbind scroll events // Unbind scroll events
$(document).off('scroll'); $(document).off('scroll');
// Close any open tooltips // Close any open tooltips
$('.has-tooltip, [data-toggle="tooltip"]').tooltip('destroy'); $('.has-tooltip, [data-toggle="tooltip"]').tooltip('dispose');
// Close any open popover // Close any open popover
$('[data-toggle="popover"]').popover('destroy'); $('[data-toggle="popover"]').popover('dispose');
}); });
window.addEventListener('hashchange', handleLocationHash); window.addEventListener('hashchange', handleLocationHash);
...@@ -111,7 +111,7 @@ document.addEventListener('DOMContentLoaded', () => { ...@@ -111,7 +111,7 @@ document.addEventListener('DOMContentLoaded', () => {
$('.remove-row').on('ajax:success', function removeRowAjaxSuccessCallback() { $('.remove-row').on('ajax:success', function removeRowAjaxSuccessCallback() {
$(this) $(this)
.tooltip('destroy') .tooltip('dispose')
.closest('li') .closest('li')
.fadeOut(); .fadeOut();
}); });
...@@ -141,9 +141,9 @@ document.addEventListener('DOMContentLoaded', () => { ...@@ -141,9 +141,9 @@ document.addEventListener('DOMContentLoaded', () => {
}); });
// Initialize tooltips // Initialize tooltips
$.fn.tooltip.Constructor.DEFAULTS.trigger = 'hover';
$body.tooltip({ $body.tooltip({
selector: '.has-tooltip, [data-toggle="tooltip"]', selector: '.has-tooltip, [data-toggle="tooltip"]',
trigger: 'hover',
placement(tip, el) { placement(tip, el) {
return $(el).data('placement') || 'bottom'; return $(el).data('placement') || 'bottom';
}, },
...@@ -196,7 +196,7 @@ document.addEventListener('DOMContentLoaded', () => { ...@@ -196,7 +196,7 @@ document.addEventListener('DOMContentLoaded', () => {
$container.remove(); $container.remove();
}); });
$('.navbar-toggle').on('click', () => { $('.navbar-toggler').on('click', () => {
$('.header-content').toggleClass('menu-expanded'); $('.header-content').toggleClass('menu-expanded');
gl.lazyLoader.loadCheck(); gl.lazyLoader.loadCheck();
}); });
......
...@@ -362,7 +362,7 @@ export default class MergeRequestTabs { ...@@ -362,7 +362,7 @@ export default class MergeRequestTabs {
// //
// status - Boolean, true to show, false to hide // status - Boolean, true to show, false to hide
toggleLoading(status) { toggleLoading(status) {
$('.mr-loading-status .loading').toggle(status); $('.mr-loading-status .loading').toggleClass('hidden', status);
} }
diffViewType() { diffViewType() {
......
...@@ -17,12 +17,12 @@ export default { ...@@ -17,12 +17,12 @@ export default {
<template> <template>
<div <div
v-if="showPanels" v-if="showPanels"
class="panel panel-default prometheus-panel" class="card prometheus-panel"
> >
<div class="panel-heading"> <div class="card-header">
<h4>{{ name }}</h4> <h4>{{ name }}</h4>
</div> </div>
<div class="panel-body prometheus-graph-group"> <div class="card-body prometheus-graph-group">
<slot></slot> <slot></slot>
</div> </div>
</div> </div>
......
...@@ -1231,8 +1231,8 @@ export default class Notes { ...@@ -1231,8 +1231,8 @@ export default class Notes {
const isForced = forceShow === true || forceShow === false; const isForced = forceShow === true || forceShow === false;
const showNow = forceShow === true || (!isCurrentlyShown && !isForced); const showNow = forceShow === true || (!isCurrentlyShown && !isForced);
targetRow.toggle(showNow); targetRow.toggleClass('hide', !showNow);
notesContent.toggle(showNow); notesContent.toggleClass('hide', !showNow);
} }
if (addForm) { if (addForm) {
...@@ -1675,7 +1675,7 @@ export default class Notes { ...@@ -1675,7 +1675,7 @@ export default class Notes {
<div class="note-header"> <div class="note-header">
<div class="note-header-info"> <div class="note-header-info">
<a href="/${_.escape(currentUsername)}"> <a href="/${_.escape(currentUsername)}">
<span class="hidden-xs">${_.escape( <span class="d-none d-sm-block">${_.escape(
currentUsername, currentUsername,
)}</span> )}</span>
<span class="note-headline-light">${_.escape( <span class="note-headline-light">${_.escape(
...@@ -1694,7 +1694,7 @@ export default class Notes { ...@@ -1694,7 +1694,7 @@ export default class Notes {
</li>`, </li>`,
); );
$tempNote.find('.hidden-xs').text(_.escape(currentUserFullname)); $tempNote.find('.d-none.d-sm-block').text(_.escape(currentUserFullname));
$tempNote $tempNote
.find('.note-headline-light') .find('.note-headline-light')
.text(`@${_.escape(currentUsername)}`); .text(`@${_.escape(currentUsername)}`);
......
...@@ -321,7 +321,7 @@ Please check your network connection and try again.`; ...@@ -321,7 +321,7 @@ Please check your network connection and try again.`;
<li class="timeline-entry"> <li class="timeline-entry">
<div class="timeline-entry-inner"> <div class="timeline-entry-inner">
<div class="flash-container error-alert timeline-content"></div> <div class="flash-container error-alert timeline-content"></div>
<div class="timeline-icon hidden-xs hidden-sm"> <div class="timeline-icon d-none d-sm-none d-md-block">
<user-avatar-link <user-avatar-link
v-if="author" v-if="author"
:link-href="author.path" :link-href="author.path"
...@@ -369,7 +369,7 @@ js-gfm-input js-autosize markdown-area js-vue-textarea" ...@@ -369,7 +369,7 @@ js-gfm-input js-autosize markdown-area js-vue-textarea"
</markdown-field> </markdown-field>
<div class="note-form-actions"> <div class="note-form-actions">
<div <div
class="pull-left btn-group class="float-left btn-group
append-right-10 comment-type-dropdown js-comment-type-dropdown droplab-dropdown"> append-right-10 comment-type-dropdown js-comment-type-dropdown droplab-dropdown">
<button <button
@click.prevent="handleSave()" @click.prevent="handleSave()"
...@@ -383,6 +383,7 @@ append-right-10 comment-type-dropdown js-comment-type-dropdown droplab-dropdown" ...@@ -383,6 +383,7 @@ append-right-10 comment-type-dropdown js-comment-type-dropdown droplab-dropdown"
name="button" name="button"
type="button" type="button"
class="btn comment-btn note-type-toggle js-note-new-discussion dropdown-toggle" class="btn comment-btn note-type-toggle js-note-new-discussion dropdown-toggle"
data-display="static"
data-toggle="dropdown" data-toggle="dropdown"
aria-label="Open comment type dropdown"> aria-label="Open comment type dropdown">
<i <i
......
...@@ -100,7 +100,7 @@ export default { ...@@ -100,7 +100,7 @@ export default {
: 'div'; : 'div';
}, },
wrapperClass() { wrapperClass() {
return this.isDiffDiscussion ? '' : 'panel panel-default'; return this.isDiffDiscussion ? '' : 'card';
}, },
}, },
mounted() { mounted() {
...@@ -263,7 +263,7 @@ Please check your network connection and try again.`; ...@@ -263,7 +263,7 @@ Please check your network connection and try again.`;
class="discussion-reply-holder"> class="discussion-reply-holder">
<template v-if="!isReplying && canReply"> <template v-if="!isReplying && canReply">
<div <div
class="btn-group-justified discussion-with-resolve-btn" class="btn-group d-flex discussion-with-resolve-btn"
role="group"> role="group">
<div <div
class="btn-group" class="btn-group"
......
...@@ -15,7 +15,7 @@ export default class NotificationsForm { ...@@ -15,7 +15,7 @@ export default class NotificationsForm {
toggleCheckbox(e) { toggleCheckbox(e) {
const $checkbox = $(e.currentTarget); const $checkbox = $(e.currentTarget);
const $parent = $checkbox.closest('.checkbox'); const $parent = $checkbox.closest('.form-check');
this.saveEvent($checkbox, $parent); this.saveEvent($checkbox, $parent);
} }
......
...@@ -25,7 +25,7 @@ export default function adminInit() { ...@@ -25,7 +25,7 @@ export default function adminInit() {
$('body').on('click', '.js-toggle-colors-link', (e) => { $('body').on('click', '.js-toggle-colors-link', (e) => {
e.preventDefault(); e.preventDefault();
$('.js-toggle-colors-container').toggle(); $('.js-toggle-colors-container').toggleClass('hide');
}); });
$('.log-tabs a').on('click', function logTabsClick(e) { $('.log-tabs a').on('click', function logTabsClick(e) {
......
...@@ -5,7 +5,7 @@ document.addEventListener('DOMContentLoaded', () => { ...@@ -5,7 +5,7 @@ document.addEventListener('DOMContentLoaded', () => {
const twoFactorNode = document.querySelector('.js-two-factor-auth'); const twoFactorNode = document.querySelector('.js-two-factor-auth');
const skippable = twoFactorNode.dataset.twoFactorSkippable === 'true'; const skippable = twoFactorNode.dataset.twoFactorSkippable === 'true';
if (skippable) { if (skippable) {
const button = `<a class="btn btn-xs btn-warning pull-right" data-method="patch" href="${twoFactorNode.dataset.two_factor_skip_url}">Configure it later</a>`; const button = `<a class="btn btn-sm btn-warning float-right" data-method="patch" href="${twoFactorNode.dataset.two_factor_skip_url}">Configure it later</a>`;
const flashAlert = document.querySelector('.flash-alert .container-fluid'); const flashAlert = document.querySelector('.flash-alert .container-fluid');
if (flashAlert) flashAlert.insertAdjacentHTML('beforeend', button); if (flashAlert) flashAlert.insertAdjacentHTML('beforeend', button);
} }
......
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
</label> </label>
<span <span
v-if="helpText" v-if="helpText"
class="help-block" class="form-text text-muted"
> >
{{ helpText }} {{ helpText }}
</span> </span>
......
...@@ -181,7 +181,7 @@ export default class UserTabs { ...@@ -181,7 +181,7 @@ export default class UserTabs {
toggleLoading(status) { toggleLoading(status) {
return this.$parentEl.find('.loading-status .loading') return this.$parentEl.find('.loading-status .loading')
.toggle(status); .toggleClass('hidden', status);
} }
setCurrentAction(source) { setCurrentAction(source) {
...@@ -195,6 +195,6 @@ export default class UserTabs { ...@@ -195,6 +195,6 @@ export default class UserTabs {
} }
getCurrentAction() { getCurrentAction() {
return this.$parentEl.find('.nav-links .active a').data('action'); return this.$parentEl.find('.nav-links a.active').data('action');
} }
} }
...@@ -37,7 +37,7 @@ export default { ...@@ -37,7 +37,7 @@ export default {
<template> <template>
<div <div
id="peek-request-selector" id="peek-request-selector"
class="pull-right" class="float-right"
> >
<select v-model="currentRequestId"> <select v-model="currentRequestId">
<option <option
......
...@@ -17,13 +17,13 @@ ...@@ -17,13 +17,13 @@
<template> <template>
<div class="row empty-state"> <div class="row empty-state">
<div class="col-xs-12"> <div class="col-12">
<div class="svg-content"> <div class="svg-content">
<img :src="svgPath" /> <img :src="svgPath" />
</div> </div>
</div> </div>
<div class="col-xs-12 text-center"> <div class="col-12 text-center">
<div class="text-content"> <div class="text-content">
<h4>{{ message }}</h4> <h4>{{ message }}</h4>
</div> </div>
......
...@@ -19,13 +19,13 @@ ...@@ -19,13 +19,13 @@
</script> </script>
<template> <template>
<div class="row empty-state js-empty-state"> <div class="row empty-state js-empty-state">
<div class="col-xs-12"> <div class="col-12">
<div class="svg-content svg-250"> <div class="svg-content svg-250">
<img :src="emptyStateSvgPath" /> <img :src="emptyStateSvgPath" />
</div> </div>
</div> </div>
<div class="col-xs-12"> <div class="col-12">
<div class="text-content"> <div class="text-content">
<template v-if="canSetCi"> <template v-if="canSetCi">
......
...@@ -96,6 +96,7 @@ export default { ...@@ -96,6 +96,7 @@ export default {
:class="cssClassJobName" :class="cssClassJobName"
data-container="body" data-container="body"
data-html="true" data-html="true"
data-boundary="viewport"
class="js-pipeline-graph-job-link" class="js-pipeline-graph-job-link"
> >
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
}; };
</script> </script>
<template> <template>
<div class="table-section section-15 hidden-xs hidden-sm pipeline-tags"> <div class="table-section section-15 d-none d-sm-none d-md-block pipeline-tags">
<a <a
:href="pipeline.path" :href="pipeline.path"
class="js-pipeline-url-link"> class="js-pipeline-url-link">
...@@ -69,35 +69,35 @@ ...@@ -69,35 +69,35 @@
<span <span
v-if="pipeline.flags.latest" v-if="pipeline.flags.latest"
v-tooltip v-tooltip
class="js-pipeline-url-latest label label-success" class="js-pipeline-url-latest badge badge-success"
title="Latest pipeline for this branch"> title="Latest pipeline for this branch">
latest latest
</span> </span>
<span <span
v-if="pipeline.flags.yaml_errors" v-if="pipeline.flags.yaml_errors"
v-tooltip v-tooltip
class="js-pipeline-url-yaml label label-danger" class="js-pipeline-url-yaml badge badge-danger"
:title="pipeline.yaml_errors"> :title="pipeline.yaml_errors">
yaml invalid yaml invalid
</span> </span>
<span <span
v-if="pipeline.flags.failure_reason" v-if="pipeline.flags.failure_reason"
v-tooltip v-tooltip
class="js-pipeline-url-failure label label-danger" class="js-pipeline-url-failure badge badge-danger"
:title="pipeline.failure_reason"> :title="pipeline.failure_reason">
error error
</span> </span>
<a <a
v-if="pipeline.flags.auto_devops" v-if="pipeline.flags.auto_devops"
tabindex="0" tabindex="0"
class="js-pipeline-url-autodevops label label-info autodevops-badge" class="js-pipeline-url-autodevops badge badge-info autodevops-badge"
v-popover="popoverOptions" v-popover="popoverOptions"
role="button"> role="button">
Auto DevOps Auto DevOps
</a> </a>
<span <span
v-if="pipeline.flags.stuck" v-if="pipeline.flags.stuck"
class="js-pipeline-url-stuck label label-warning"> class="js-pipeline-url-stuck badge badge-warning">
stuck stuck
</span> </span>
</div> </div>
......
...@@ -63,7 +63,7 @@ ...@@ -63,7 +63,7 @@
<loading-icon v-if="isLoading" /> <loading-icon v-if="isLoading" />
</button> </button>
<ul class="dropdown-menu dropdown-menu-align-right"> <ul class="dropdown-menu dropdown-menu-right">
<li <li
v-for="(action, i) in actions" v-for="(action, i) in actions"
:key="i" :key="i"
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
> >
</i> </i>
</button> </button>
<ul class="dropdown-menu dropdown-menu-align-right"> <ul class="dropdown-menu dropdown-menu-right">
<li <li
v-for="(artifact, i) in artifacts" v-for="(artifact, i) in artifacts"
:key="i"> :key="i">
......
...@@ -331,7 +331,7 @@ ...@@ -331,7 +331,7 @@
<pipelines-artifacts-component <pipelines-artifacts-component
v-if="pipeline.details.artifacts.length" v-if="pipeline.details.artifacts.length"
class="hidden-xs hidden-sm" class="d-none d-sm-none d-md-block"
:artifacts="pipeline.details.artifacts" :artifacts="pipeline.details.artifacts"
/> />
......
...@@ -75,7 +75,7 @@ ...@@ -75,7 +75,7 @@
</p> </p>
<p <p
class="finished-at hidden-xs hidden-sm" class="finished-at d-none d-sm-none d-md-block"
v-if="hasFinishedTime" v-if="hasFinishedTime"
> >
......
...@@ -86,7 +86,11 @@ Please update your Git repository remotes as soon as possible.`), ...@@ -86,7 +86,11 @@ Please update your Git repository remotes as soon as possible.`),
<div class="form-group"> <div class="form-group">
<label :for="$options.inputId">{{ s__('Profiles|Path') }}</label> <label :for="$options.inputId">{{ s__('Profiles|Path') }}</label>
<div class="input-group"> <div class="input-group">
<div class="input-group-addon">{{ rootUrl }}</div> <div class="input-group-prepend">
<div class="input-group-text">
{{ rootUrl }}
</div>
</div>
<input <input
:id="$options.inputId" :id="$options.inputId"
class="form-control" class="form-control"
......
...@@ -4,6 +4,6 @@ export default () => { ...@@ -4,6 +4,6 @@ export default () => {
$('.js-fork-thumbnail').on('click', function forkThumbnailClicked() { $('.js-fork-thumbnail').on('click', function forkThumbnailClicked() {
if ($(this).hasClass('disabled')) return false; if ($(this).hasClass('disabled')) return false;
return $('.js-fork-content').toggle(); return $('.js-fork-content').toggleClass('hidden');
}); });
}; };
...@@ -42,7 +42,7 @@ export default class ProjectLabelSubscription { ...@@ -42,7 +42,7 @@ export default class ProjectLabelSubscription {
const $button = $(button); const $button = $(button);
if ($button.attr('data-original-title')) { if ($button.attr('data-original-title')) {
$button.tooltip('hide').attr('data-original-title', newAction).tooltip('fixTitle'); $button.tooltip('hide').attr('data-original-title', newAction).tooltip('_fixTitle');
} }
return button; return button;
......
...@@ -7,7 +7,7 @@ function setVisibilityOptions(namespaceSelector) { ...@@ -7,7 +7,7 @@ function setVisibilityOptions(namespaceSelector) {
const selectedNamespace = namespaceSelector.options[namespaceSelector.selectedIndex]; const selectedNamespace = namespaceSelector.options[namespaceSelector.selectedIndex];
const { name, visibility, visibilityLevel, showPath, editPath } = selectedNamespace.dataset; const { name, visibility, visibilityLevel, showPath, editPath } = selectedNamespace.dataset;
document.querySelectorAll('.visibility-level-setting .radio').forEach((option) => { document.querySelectorAll('.visibility-level-setting .form-check').forEach((option) => {
const optionInput = option.querySelector('input[type=radio]'); const optionInput = option.querySelector('input[type=radio]');
const optionValue = optionInput ? optionInput.value : 0; const optionValue = optionInput ? optionInput.value : 0;
const optionTitle = option.querySelector('.option-title'); const optionTitle = option.querySelector('.option-title');
......
...@@ -66,8 +66,8 @@ const bindEvents = () => { ...@@ -66,8 +66,8 @@ const bindEvents = () => {
.on('click', (e) => { e.preventDefault(); }) .on('click', (e) => { e.preventDefault(); })
.popover({ .popover({
title: $pushNewProjectTipTrigger.data('title'), title: $pushNewProjectTipTrigger.data('title'),
placement: 'auto bottom', placement: 'bottom',
html: 'true', html: true,
content: $('.push-new-project-tip-template').html(), content: $('.push-new-project-tip-template').html(),
}) })
.on('shown.bs.popover', () => { .on('shown.bs.popover', () => {
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
<template> <template>
<div <div
class="search-input-container hidden-xs" class="search-input-container d-none d-sm-block"
> >
<input <input
type="search" type="search"
......
...@@ -31,7 +31,7 @@ export default class PrometheusMetrics { ...@@ -31,7 +31,7 @@ export default class PrometheusMetrics {
/* eslint-disable class-methods-use-this */ /* eslint-disable class-methods-use-this */
handlePanelToggle(e) { handlePanelToggle(e) {
const $toggleBtn = $(e.currentTarget); const $toggleBtn = $(e.currentTarget);
const $currentPanelBody = $toggleBtn.closest('.panel').find('.panel-body'); const $currentPanelBody = $toggleBtn.closest('.card').find('.card-body');
$currentPanelBody.toggleClass('hidden'); $currentPanelBody.toggleClass('hidden');
if ($toggleBtn.hasClass('fa-caret-down')) { if ($toggleBtn.hasClass('fa-caret-down')) {
$toggleBtn.removeClass('fa-caret-down').addClass('fa-caret-right'); $toggleBtn.removeClass('fa-caret-down').addClass('fa-caret-right');
......
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,7 @@
css-class="btn-default btn-transparent btn-clipboard" css-class="btn-default btn-transparent btn-clipboard"
/> />
<div class="controls hidden-xs pull-right"> <div class="controls d-none d-sm-block float-right">
<button <button
v-if="repo.canDelete" v-if="repo.canDelete"
type="button" type="button"
......
...@@ -120,7 +120,7 @@ ...@@ -120,7 +120,7 @@
<button <button
v-if="item.canDelete" v-if="item.canDelete"
type="button" type="button"
class="js-delete-registry btn btn-danger hidden-xs pull-right" class="js-delete-registry btn btn-danger d-none d-sm-block float-right"
:title="s__('ContainerRegistry|Remove tag')" :title="s__('ContainerRegistry|Remove tag')"
:aria-label="s__('ContainerRegistry|Remove tag')" :aria-label="s__('ContainerRegistry|Remove tag')"
data-container="body" data-container="body"
......
...@@ -108,7 +108,7 @@ Sidebar.prototype.todoUpdateDone = function(data) { ...@@ -108,7 +108,7 @@ Sidebar.prototype.todoUpdateDone = function(data) {
.attr('title', $el.data(`${attrPrefix}Text`)); .attr('title', $el.data(`${attrPrefix}Text`));
if ($el.hasClass('has-tooltip')) { if ($el.hasClass('has-tooltip')) {
$el.tooltip('fixTitle'); $el.tooltip('_fixTitle');
} }
if ($el.data(`${attrPrefix}Icon`)) { if ($el.data(`${attrPrefix}Icon`)) {
......
...@@ -41,7 +41,7 @@ export default { ...@@ -41,7 +41,7 @@ export default {
</i> </i>
<a <a
v-if="editable" v-if="editable"
class="js-sidebar-dropdown-toggle edit-link pull-right" class="js-sidebar-dropdown-toggle edit-link float-right"
href="#" href="#"
> >
{{ __('Edit') }} {{ __('Edit') }}
...@@ -49,7 +49,7 @@ export default { ...@@ -49,7 +49,7 @@ export default {
<a <a
v-if="showToggle" v-if="showToggle"
aria-label="Toggle sidebar" aria-label="Toggle sidebar"
class="gutter-toggle pull-right js-sidebar-toggle" class="gutter-toggle float-right js-sidebar-toggle"
href="#" href="#"
role="button" role="button"
> >
......
...@@ -130,6 +130,7 @@ export default { ...@@ -130,6 +130,7 @@ export default {
v-tooltip v-tooltip
data-container="body" data-container="body"
data-placement="left" data-placement="left"
data-boundary="viewport"
:title="collapsedTooltipTitle" :title="collapsedTooltipTitle"
> >
<i <i
......
...@@ -75,6 +75,7 @@ export default { ...@@ -75,6 +75,7 @@ export default {
v-tooltip v-tooltip
data-container="body" data-container="body"
data-placement="left" data-placement="left"
data-boundary="viewport"
:title="tooltipLabel" :title="tooltipLabel"
> >
<icon <icon
...@@ -86,7 +87,7 @@ export default { ...@@ -86,7 +87,7 @@ export default {
{{ __('Confidentiality') }} {{ __('Confidentiality') }}
<a <a
v-if="isEditable" v-if="isEditable"
class="pull-right confidential-edit" class="float-right confidential-edit"
href="#" href="#"
@click.prevent="toggleForm" @click.prevent="toggleForm"
> >
......
...@@ -32,7 +32,7 @@ export default { ...@@ -32,7 +32,7 @@ export default {
</script> </script>
<template> <template>
<div class="dropdown open"> <div class="dropdown show">
<div class="dropdown-menu sidebar-item-warning-message"> <div class="dropdown-menu sidebar-item-warning-message">
<div> <div>
<p <p
......
...@@ -41,7 +41,7 @@ export default { ...@@ -41,7 +41,7 @@ export default {
</script> </script>
<template> <template>
<div class="dropdown open"> <div class="dropdown show">
<div class="dropdown-menu sidebar-item-warning-message"> <div class="dropdown-menu sidebar-item-warning-message">
<p <p
class="text" class="text"
......
...@@ -99,6 +99,7 @@ export default { ...@@ -99,6 +99,7 @@ export default {
v-tooltip v-tooltip
data-container="body" data-container="body"
data-placement="left" data-placement="left"
data-boundary="viewport"
:title="tooltipLabel" :title="tooltipLabel"
> >
<icon <icon
...@@ -112,7 +113,7 @@ export default { ...@@ -112,7 +113,7 @@ export default {
{{ sprintf(__('Lock %{issuableDisplayName}'), { issuableDisplayName: issuableDisplayName }) }} {{ sprintf(__('Lock %{issuableDisplayName}'), { issuableDisplayName: issuableDisplayName }) }}
<button <button
v-if="isEditable" v-if="isEditable"
class="pull-right lock-edit" class="float-right lock-edit"
type="button" type="button"
@click.prevent="toggleForm" @click.prevent="toggleForm"
> >
......
...@@ -84,6 +84,7 @@ ...@@ -84,6 +84,7 @@
v-tooltip v-tooltip
data-container="body" data-container="body"
data-placement="left" data-placement="left"
data-boundary="viewport"
:title="participantLabel" :title="participantLabel"
@click="onClickCollapsedIcon" @click="onClickCollapsedIcon"
> >
......
...@@ -82,6 +82,7 @@ ...@@ -82,6 +82,7 @@
:title="notificationTooltip" :title="notificationTooltip"
data-container="body" data-container="body"
data-placement="left" data-placement="left"
data-boundary="viewport"
> >
<icon <icon
:name="notificationIcon" :name="notificationIcon"
...@@ -91,12 +92,12 @@ ...@@ -91,12 +92,12 @@
/> />
</span> </span>
</div> </div>
<span class="issuable-header-text hide-collapsed pull-left"> <span class="issuable-header-text hide-collapsed float-left">
{{ __('Notifications') }} {{ __('Notifications') }}
</span> </span>
<toggle-button <toggle-button
ref="toggleButton" ref="toggleButton"
class="pull-right hide-collapsed js-issuable-subscribe-button" class="float-right hide-collapsed js-issuable-subscribe-button"
:is-loading="showLoadingState" :is-loading="showLoadingState"
:value="subscribed" :value="subscribed"
@change="toggleSubscription" @change="toggleSubscription"
......
...@@ -114,6 +114,7 @@ ...@@ -114,6 +114,7 @@
v-tooltip v-tooltip
data-container="body" data-container="body"
data-placement="left" data-placement="left"
data-boundary="viewport"
:title="tooltipText" :title="tooltipText"
> >
<icon name="timer" /> <icon name="timer" />
......
...@@ -71,7 +71,7 @@ export default { ...@@ -71,7 +71,7 @@ export default {
</div> </div>
</div> </div>
<div class="compare-display-container"> <div class="compare-display-container">
<div class="compare-display pull-left"> <div class="compare-display float-left">
<span class="compare-label"> <span class="compare-label">
{{ s__('TimeTracking|Spent') }} {{ s__('TimeTracking|Spent') }}
</span> </span>
...@@ -79,7 +79,7 @@ export default { ...@@ -79,7 +79,7 @@ export default {
{{ timeSpentHumanReadable }} {{ timeSpentHumanReadable }}
</span> </span>
</div> </div>
<div class="compare-display estimated pull-right"> <div class="compare-display estimated float-right">
<span class="compare-label"> <span class="compare-label">
{{ s__('TimeTrackingEstimated|Est') }} {{ s__('TimeTrackingEstimated|Est') }}
</span> </span>
......
...@@ -116,7 +116,7 @@ export default { ...@@ -116,7 +116,7 @@ export default {
<div class="title hide-collapsed"> <div class="title hide-collapsed">
{{ __('Time tracking') }} {{ __('Time tracking') }}
<div <div
class="help-button pull-right" class="help-button float-right"
v-if="!showHelpState" v-if="!showHelpState"
@click="toggleHelpState(true)" @click="toggleHelpState(true)"
> >
...@@ -127,7 +127,7 @@ export default { ...@@ -127,7 +127,7 @@ export default {
</i> </i>
</div> </div>
<div <div
class="close-help-button pull-right" class="close-help-button float-right"
v-if="showHelpState" v-if="showHelpState"
@click="toggleHelpState(false)" @click="toggleHelpState(false)"
> >
......
...@@ -202,7 +202,7 @@ function UsersSelect(currentUser, els, options = {}) { ...@@ -202,7 +202,7 @@ function UsersSelect(currentUser, els, options = {}) {
tooltipTitle = __('Assignee'); tooltipTitle = __('Assignee');
} }
$value.html(assigneeTemplate(user)); $value.html(assigneeTemplate(user));
$collapsedSidebar.attr('title', tooltipTitle).tooltip('fixTitle'); $collapsedSidebar.attr('title', tooltipTitle).tooltip('_fixTitle');
return $collapsedSidebar.html(collapsedAssigneeTemplate(user)); return $collapsedSidebar.html(collapsedAssigneeTemplate(user));
}); });
}; };
......
...@@ -127,7 +127,7 @@ export default { ...@@ -127,7 +127,7 @@ export default {
</span> </span>
<loading-button <loading-button
v-if="deployment.stop_url" v-if="deployment.stop_url"
container-class="btn btn-default btn-xs prepend-left-default" container-class="btn btn-default btn-sm prepend-left-default"
label="Stop environment" label="Stop environment"
:loading="isStopping" :loading="isStopping"
@click="stopEnvironment" @click="stopEnvironment"
......
...@@ -131,7 +131,7 @@ export default { ...@@ -131,7 +131,7 @@ export default {
aria-hidden="true"> aria-hidden="true">
</i> </i>
</button> </button>
<ul class="dropdown-menu dropdown-menu-align-right"> <ul class="dropdown-menu dropdown-menu-right">
<li> <li>
<a <a
class="js-download-email-patches" class="js-download-email-patches"
......
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
@click="refreshWidget" @click="refreshWidget"
:disabled="isRefreshing" :disabled="isRefreshing"
type="button" type="button"
class="btn btn-xs btn-default" class="btn btn-sm btn-default"
> >
<loading-icon <loading-icon
v-if="isRefreshing" v-if="isRefreshing"
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment