Commit 33c31950 authored by Stan Hu's avatar Stan Hu

Merge branch 'master' into sh-support-bitbucket-server-import

parents 69fe32a5 38736175
This diff is collapsed.
...@@ -133,7 +133,7 @@ Most issues will have labels for at least one of the following: ...@@ -133,7 +133,7 @@ Most issues will have labels for at least one of the following:
- Type: ~"feature proposal", ~bug, ~customer, etc. - Type: ~"feature proposal", ~bug, ~customer, etc.
- Subject: ~wiki, ~"container registry", ~ldap, ~api, ~frontend, etc. - Subject: ~wiki, ~"container registry", ~ldap, ~api, ~frontend, etc.
- Team: ~"CI/CD", ~Discussion, ~Quality, ~Platform, etc. - Team: ~"CI/CD", ~Plan, ~Quality, ~Platform, etc.
- Release Scoping: ~Deliverable, ~Stretch, ~"Next Patch Release" - Release Scoping: ~Deliverable, ~Stretch, ~"Next Patch Release"
- Priority: ~P1, ~P2, ~P3, ~P4 - Priority: ~P1, ~P2, ~P3, ~P4
- Severity: ~S1, ~S2, ~S3, ~S4 - Severity: ~S1, ~S2, ~S3, ~S4
...@@ -187,12 +187,13 @@ The current team labels are: ...@@ -187,12 +187,13 @@ The current team labels are:
- ~Configuration - ~Configuration
- ~"CI/CD" - ~"CI/CD"
- ~Discussion - ~Create
- ~Distribution - ~Distribution
- ~Documentation - ~Documentation
- ~Geo - ~Geo
- ~Gitaly - ~Gitaly
- ~Monitoring - ~Monitoring
- ~Plan
- ~Platform - ~Platform
- ~Quality - ~Quality
- ~Release - ~Release
......
...@@ -323,6 +323,7 @@ group :development do ...@@ -323,6 +323,7 @@ group :development do
end end
group :development, :test do group :development, :test do
gem 'bootsnap', '~> 1.3'
gem 'bullet', '~> 5.5.0', require: !!ENV['ENABLE_BULLET'] gem 'bullet', '~> 5.5.0', require: !!ENV['ENABLE_BULLET']
gem 'pry-byebug', '~> 3.4.1', platform: :mri gem 'pry-byebug', '~> 3.4.1', platform: :mri
gem 'pry-rails', '~> 0.3.4' gem 'pry-rails', '~> 0.3.4'
......
...@@ -87,6 +87,8 @@ GEM ...@@ -87,6 +87,8 @@ 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)
bootsnap (1.3.1)
msgpack (~> 1.0)
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)
...@@ -500,6 +502,7 @@ GEM ...@@ -500,6 +502,7 @@ GEM
mini_portile2 (2.3.0) mini_portile2 (2.3.0)
minitest (5.7.0) minitest (5.7.0)
mousetrap-rails (1.4.6) mousetrap-rails (1.4.6)
msgpack (1.2.4)
multi_json (1.13.1) multi_json (1.13.1)
multi_xml (0.6.0) multi_xml (0.6.0)
multipart-post (2.0.0) multipart-post (2.0.0)
...@@ -986,6 +989,7 @@ DEPENDENCIES ...@@ -986,6 +989,7 @@ 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)
bootsnap (~> 1.3)
bootstrap_form (~> 2.7.0) bootstrap_form (~> 2.7.0)
brakeman (~> 4.2) brakeman (~> 4.2)
browser (~> 2.2) browser (~> 2.2)
......
...@@ -90,6 +90,8 @@ GEM ...@@ -90,6 +90,8 @@ 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)
bootsnap (1.3.1)
msgpack (~> 1.0)
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)
...@@ -503,6 +505,7 @@ GEM ...@@ -503,6 +505,7 @@ GEM
mini_portile2 (2.3.0) mini_portile2 (2.3.0)
minitest (5.7.0) minitest (5.7.0)
mousetrap-rails (1.4.6) mousetrap-rails (1.4.6)
msgpack (1.2.4)
multi_json (1.13.1) multi_json (1.13.1)
multi_xml (0.6.0) multi_xml (0.6.0)
multipart-post (2.0.0) multipart-post (2.0.0)
...@@ -996,6 +999,7 @@ DEPENDENCIES ...@@ -996,6 +999,7 @@ 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)
bootsnap (~> 1.3)
bootstrap_form (~> 2.7.0) bootstrap_form (~> 2.7.0)
brakeman (~> 4.2) brakeman (~> 4.2)
browser (~> 2.2) browser (~> 2.2)
......
11.1.0-pre 11.2.0-pre
...@@ -105,7 +105,7 @@ export default { ...@@ -105,7 +105,7 @@ export default {
</div> </div>
<label <label
:for="list.id + '-title'" :for="list.id + '-title'"
class="label-light" class="label-bold"
> >
Title Title
</label> </label>
......
...@@ -68,7 +68,7 @@ export default { ...@@ -68,7 +68,7 @@ export default {
<template> <template>
<div> <div>
<label class="label-light prepend-top-10"> <label class="label-bold prepend-top-10">
Project Project
</label> </label>
<div <div
......
...@@ -14,6 +14,7 @@ import 'core-js/es6/weak-map'; ...@@ -14,6 +14,7 @@ import 'core-js/es6/weak-map';
// Browser polyfills // Browser polyfills
import 'classlist-polyfill'; import 'classlist-polyfill';
import 'formdata-polyfill';
import './polyfills/custom_event'; import './polyfills/custom_event';
import './polyfills/element'; import './polyfills/element';
import './polyfills/event'; import './polyfills/event';
......
...@@ -30,6 +30,7 @@ export default { ...@@ -30,6 +30,7 @@ export default {
:render-header="false" :render-header="false"
:render-diff-file="false" :render-diff-file="false"
:always-expanded="true" :always-expanded="true"
:discussions-by-diff-order="true"
/> />
</ul> </ul>
</div> </div>
......
...@@ -66,7 +66,7 @@ export default { ...@@ -66,7 +66,7 @@ export default {
<div <div
class="form-group row" class="form-group row"
> >
<label class="label-light col-form-label col-sm-3"> <label class="label-bold col-form-label col-sm-3">
{{ __('Name') }} {{ __('Name') }}
</label> </label>
<div class="col-sm-9"> <div class="col-sm-9">
......
import Vue from 'vue'; import Vue from 'vue';
import VueRouter from 'vue-router'; import VueRouter from 'vue-router';
import { join as joinPath } from 'path';
import flash from '~/flash'; import flash from '~/flash';
import store from './stores'; import store from './stores';
import { activityBarViews } from './constants'; import { activityBarViews } from './constants';
...@@ -37,17 +38,29 @@ const router = new VueRouter({ ...@@ -37,17 +38,29 @@ const router = new VueRouter({
base: `${gon.relative_url_root}/-/ide/`, base: `${gon.relative_url_root}/-/ide/`,
routes: [ routes: [
{ {
path: '/project/:namespace/:project+', path: '/project/:namespace+/:project',
component: EmptyRouterComponent, component: EmptyRouterComponent,
children: [ children: [
{ {
path: ':targetmode(edit|tree|blob)/*', path: ':targetmode(edit|tree|blob)/:branchid+/-/*',
component: EmptyRouterComponent, component: EmptyRouterComponent,
}, },
{
path: ':targetmode(edit|tree|blob)/:branchid+/',
redirect: to => joinPath(to.path, '/-/'),
},
{
path: ':targetmode(edit|tree|blob)',
redirect: to => joinPath(to.path, '/master/-/'),
},
{ {
path: 'merge_requests/:mrid', path: 'merge_requests/:mrid',
component: EmptyRouterComponent, component: EmptyRouterComponent,
}, },
{
path: '',
redirect: to => joinPath(to.path, '/edit/master/-/'),
},
], ],
}, },
], ],
...@@ -63,11 +76,10 @@ router.beforeEach((to, from, next) => { ...@@ -63,11 +76,10 @@ router.beforeEach((to, from, next) => {
.then(() => { .then(() => {
const fullProjectId = `${to.params.namespace}/${to.params.project}`; const fullProjectId = `${to.params.namespace}/${to.params.project}`;
const baseSplit = (to.params[0] && to.params[0].split('/-/')) || ['']; const branchId = to.params.branchid;
const branchId = baseSplit[0].slice(-1) === '/' ? baseSplit[0].slice(0, -1) : baseSplit[0];
if (branchId) { if (branchId) {
const basePath = baseSplit.length > 1 ? baseSplit[1] : ''; const basePath = to.params[0] || '';
store.dispatch('setCurrentBranchId', branchId); store.dispatch('setCurrentBranchId', branchId);
......
...@@ -5,19 +5,20 @@ import resolvedSvg from 'icons/_icon_status_success_solid.svg'; ...@@ -5,19 +5,20 @@ import resolvedSvg from 'icons/_icon_status_success_solid.svg';
import mrIssueSvg from 'icons/_icon_mr_issue.svg'; import mrIssueSvg from 'icons/_icon_mr_issue.svg';
import nextDiscussionSvg from 'icons/_next_discussion.svg'; import nextDiscussionSvg from 'icons/_next_discussion.svg';
import { pluralize } from '../../lib/utils/text_utility'; import { pluralize } from '../../lib/utils/text_utility';
import { scrollToElement } from '../../lib/utils/common_utils'; import discussionNavigation from '../mixins/discussion_navigation';
import tooltip from '../../vue_shared/directives/tooltip'; import tooltip from '../../vue_shared/directives/tooltip';
export default { export default {
directives: { directives: {
tooltip, tooltip,
}, },
mixins: [discussionNavigation],
computed: { computed: {
...mapGetters([ ...mapGetters([
'getUserData', 'getUserData',
'getNoteableData', 'getNoteableData',
'discussionCount', 'discussionCount',
'unresolvedDiscussions', 'firstUnresolvedDiscussionId',
'resolvedDiscussionCount', 'resolvedDiscussionCount',
]), ]),
isLoggedIn() { isLoggedIn() {
...@@ -35,11 +36,6 @@ export default { ...@@ -35,11 +36,6 @@ export default {
resolveAllDiscussionsIssuePath() { resolveAllDiscussionsIssuePath() {
return this.getNoteableData.create_issue_to_resolve_discussions_path; return this.getNoteableData.create_issue_to_resolve_discussions_path;
}, },
firstUnresolvedDiscussionId() {
const item = this.unresolvedDiscussions[0] || {};
return item.id;
},
}, },
created() { created() {
this.resolveSvg = resolveSvg; this.resolveSvg = resolveSvg;
...@@ -50,22 +46,10 @@ export default { ...@@ -50,22 +46,10 @@ export default {
methods: { methods: {
...mapActions(['expandDiscussion']), ...mapActions(['expandDiscussion']),
jumpToFirstUnresolvedDiscussion() { jumpToFirstUnresolvedDiscussion() {
const discussionId = this.firstUnresolvedDiscussionId; const diffTab = window.mrTabs.currentAction === 'diffs';
if (!discussionId) { const discussionId = this.firstUnresolvedDiscussionId(diffTab);
return;
}
const el = document.querySelector(`[data-discussion-id="${discussionId}"]`);
const activeTab = window.mrTabs.currentAction;
if (activeTab === 'commits' || activeTab === 'pipelines') {
window.mrTabs.activateTab('show');
}
if (el) { this.jumpToDiscussion(discussionId);
this.expandDiscussion({ discussionId });
scrollToElement(el);
}
}, },
}, },
}; };
......
<script> <script>
import _ from 'underscore';
import { mapActions, mapGetters } from 'vuex'; import { mapActions, mapGetters } from 'vuex';
import resolveDiscussionsSvg from 'icons/_icon_mr_issue.svg'; import resolveDiscussionsSvg from 'icons/_icon_mr_issue.svg';
import nextDiscussionsSvg from 'icons/_next_discussion.svg'; import nextDiscussionsSvg from 'icons/_next_discussion.svg';
import { convertObjectPropsToCamelCase, scrollToElement } from '~/lib/utils/common_utils'; import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import { truncateSha } from '~/lib/utils/text_utility'; import { truncateSha } from '~/lib/utils/text_utility';
import systemNote from '~/vue_shared/components/notes/system_note.vue'; import systemNote from '~/vue_shared/components/notes/system_note.vue';
import { s__ } from '~/locale'; import { s__ } from '~/locale';
...@@ -21,6 +20,7 @@ import placeholderSystemNote from '../../vue_shared/components/notes/placeholder ...@@ -21,6 +20,7 @@ import placeholderSystemNote from '../../vue_shared/components/notes/placeholder
import autosave from '../mixins/autosave'; import autosave from '../mixins/autosave';
import noteable from '../mixins/noteable'; import noteable from '../mixins/noteable';
import resolvable from '../mixins/resolvable'; import resolvable from '../mixins/resolvable';
import discussionNavigation from '../mixins/discussion_navigation';
import tooltip from '../../vue_shared/directives/tooltip'; import tooltip from '../../vue_shared/directives/tooltip';
export default { export default {
...@@ -40,7 +40,7 @@ export default { ...@@ -40,7 +40,7 @@ export default {
directives: { directives: {
tooltip, tooltip,
}, },
mixins: [autosave, noteable, resolvable], mixins: [autosave, noteable, resolvable, discussionNavigation],
props: { props: {
discussion: { discussion: {
type: Object, type: Object,
...@@ -61,6 +61,11 @@ export default { ...@@ -61,6 +61,11 @@ export default {
required: false, required: false,
default: false, default: false,
}, },
discussionsByDiffOrder: {
type: Boolean,
required: false,
default: false,
},
}, },
data() { data() {
return { return {
...@@ -75,7 +80,12 @@ export default { ...@@ -75,7 +80,12 @@ export default {
'discussionCount', 'discussionCount',
'resolvedDiscussionCount', 'resolvedDiscussionCount',
'allDiscussions', 'allDiscussions',
'unresolvedDiscussionsIdsByDiff',
'unresolvedDiscussionsIdsByDate',
'unresolvedDiscussions', 'unresolvedDiscussions',
'unresolvedDiscussionsIdsOrdered',
'nextUnresolvedDiscussionId',
'isLastUnresolvedDiscussion',
]), ]),
transformedDiscussion() { transformedDiscussion() {
return { return {
...@@ -126,6 +136,10 @@ export default { ...@@ -126,6 +136,10 @@ export default {
hasMultipleUnresolvedDiscussions() { hasMultipleUnresolvedDiscussions() {
return this.unresolvedDiscussions.length > 1; return this.unresolvedDiscussions.length > 1;
}, },
showJumpToNextDiscussion() {
return this.hasMultipleUnresolvedDiscussions &&
!this.isLastUnresolvedDiscussion(this.discussion.id, this.discussionsByDiffOrder);
},
shouldRenderDiffs() { shouldRenderDiffs() {
const { diffDiscussion, diffFile } = this.transformedDiscussion; const { diffDiscussion, diffFile } = this.transformedDiscussion;
...@@ -242,21 +256,10 @@ Please check your network connection and try again.`; ...@@ -242,21 +256,10 @@ Please check your network connection and try again.`;
}); });
}, },
jumpToNextDiscussion() { jumpToNextDiscussion() {
const discussionIds = this.allDiscussions.map(d => d.id); const nextId =
const unresolvedIds = this.unresolvedDiscussions.map(d => d.id); this.nextUnresolvedDiscussionId(this.discussion.id, this.discussionsByDiffOrder);
const currentIndex = discussionIds.indexOf(this.discussion.id);
const remainingAfterCurrent = discussionIds.slice(currentIndex + 1);
const nextIndex = _.findIndex(remainingAfterCurrent, id => unresolvedIds.indexOf(id) > -1);
if (nextIndex > -1) {
const nextId = remainingAfterCurrent[nextIndex];
const el = document.querySelector(`[data-discussion-id="${nextId}"]`);
if (el) { this.jumpToDiscussion(nextId);
this.expandDiscussion({ discussionId: nextId });
scrollToElement(el);
}
}
}, },
}, },
}; };
...@@ -398,7 +401,7 @@ Please check your network connection and try again.`; ...@@ -398,7 +401,7 @@ Please check your network connection and try again.`;
</a> </a>
</div> </div>
<div <div
v-if="hasMultipleUnresolvedDiscussions" v-if="showJumpToNextDiscussion"
class="btn-group" class="btn-group"
role="group"> role="group">
<button <button
......
import { scrollToElement } from '~/lib/utils/common_utils';
export default {
methods: {
jumpToDiscussion(id) {
if (id) {
const activeTab = window.mrTabs.currentAction;
const selector =
activeTab === 'diffs'
? `ul.notes[data-discussion-id="${id}"]`
: `div.discussion[data-discussion-id="${id}"]`;
const el = document.querySelector(selector);
if (activeTab === 'commits' || activeTab === 'pipelines') {
window.mrTabs.activateTab('show');
}
if (el) {
this.expandDiscussion({ discussionId: id });
scrollToElement(el);
return true;
}
}
return false;
},
},
};
...@@ -70,6 +70,9 @@ export const allDiscussions = (state, getters) => { ...@@ -70,6 +70,9 @@ export const allDiscussions = (state, getters) => {
return Object.values(resolved).concat(unresolved); return Object.values(resolved).concat(unresolved);
}; };
export const allResolvableDiscussions = (state, getters) =>
getters.allDiscussions.filter(d => !d.individual_note && d.resolvable);
export const resolvedDiscussionsById = state => { export const resolvedDiscussionsById = state => {
const map = {}; const map = {};
...@@ -86,6 +89,51 @@ export const resolvedDiscussionsById = state => { ...@@ -86,6 +89,51 @@ export const resolvedDiscussionsById = state => {
return map; return map;
}; };
// Gets Discussions IDs ordered by the date of their initial note
export const unresolvedDiscussionsIdsByDate = (state, getters) =>
getters.allResolvableDiscussions
.filter(d => !d.resolved)
.sort((a, b) => {
const aDate = new Date(a.notes[0].created_at);
const bDate = new Date(b.notes[0].created_at);
if (aDate < bDate) {
return -1;
}
return aDate === bDate ? 0 : 1;
})
.map(d => d.id);
// Gets Discussions IDs ordered by their position in the diff
//
// Sorts the array of resolvable yet unresolved discussions by
// comparing file names first. If file names are the same, compares
// line numbers.
export const unresolvedDiscussionsIdsByDiff = (state, getters) =>
getters.allResolvableDiscussions
.filter(d => !d.resolved)
.sort((a, b) => {
if (!a.diff_file || !b.diff_file) {
return 0;
}
// Get file names comparison result
const filenameComparison = a.diff_file.file_path.localeCompare(b.diff_file.file_path);
// Get the line numbers, to compare within the same file
const aLines = [a.position.formatter.new_line, a.position.formatter.old_line];
const bLines = [b.position.formatter.new_line, b.position.formatter.old_line];
return filenameComparison < 0 ||
(filenameComparison === 0 &&
// .max() because one of them might be zero (if removed/added)
Math.max(aLines[0], aLines[1]) < Math.max(bLines[0], bLines[1]))
? -1
: 1;
})
.map(d => d.id);
export const resolvedDiscussionCount = (state, getters) => { export const resolvedDiscussionCount = (state, getters) => {
const resolvedMap = getters.resolvedDiscussionsById; const resolvedMap = getters.resolvedDiscussionsById;
...@@ -102,5 +150,42 @@ export const discussionTabCounter = state => { ...@@ -102,5 +150,42 @@ export const discussionTabCounter = state => {
return all.length; return all.length;
}; };
// Returns the list of discussion IDs ordered according to given parameter
// @param {Boolean} diffOrder - is ordered by diff?
export const unresolvedDiscussionsIdsOrdered = (state, getters) => diffOrder => {
if (diffOrder) {
return getters.unresolvedDiscussionsIdsByDiff;
}
return getters.unresolvedDiscussionsIdsByDate;
};
// Checks if a given discussion is the last in the current order (diff or date)
// @param {Boolean} discussionId - id of the discussion
// @param {Boolean} diffOrder - is ordered by diff?
export const isLastUnresolvedDiscussion = (state, getters) => (discussionId, diffOrder) => {
const idsOrdered = getters.unresolvedDiscussionsIdsOrdered(diffOrder);
const lastDiscussionId = idsOrdered[idsOrdered.length - 1];
return lastDiscussionId === discussionId;
};
// Gets the ID of the discussion following the one provided, respecting order (diff or date)
// @param {Boolean} discussionId - id of the current discussion
// @param {Boolean} diffOrder - is ordered by diff?
export const nextUnresolvedDiscussionId = (state, getters) => (discussionId, diffOrder) => {
const idsOrdered = getters.unresolvedDiscussionsIdsOrdered(diffOrder);
const currentIndex = idsOrdered.indexOf(discussionId);
return idsOrdered.slice(currentIndex + 1, currentIndex + 2)[0];
};
// @param {Boolean} diffOrder - is ordered by diff?
export const firstUnresolvedDiscussionId = (state, getters) => diffOrder => {
if (diffOrder) {
return getters.unresolvedDiscussionsIdsByDiff[0];
}
return getters.unresolvedDiscussionsIdsByDate[0];
};
// prevent babel-plugin-rewire from generating an invalid default during karma tests // prevent babel-plugin-rewire from generating an invalid default during karma tests
export default () => {}; export default () => {};
...@@ -68,7 +68,7 @@ ...@@ -68,7 +68,7 @@
:name="inputNameAttribute" :name="inputNameAttribute"
:value="cronInterval" :value="cronInterval"
:checked="isEditable" :checked="isEditable"
class="label-light" class="label-bold"
type="radio" type="radio"
@click="toggleCustomInput(true)" @click="toggleCustomInput(true)"
/> />
...@@ -93,13 +93,13 @@ ...@@ -93,13 +93,13 @@
v-model="cronInterval" v-model="cronInterval"
:name="inputNameAttribute" :name="inputNameAttribute"
:value="cronIntervalPresets.everyDay" :value="cronIntervalPresets.everyDay"
class="label-light" class="label-bold"
type="radio" type="radio"
@click="toggleCustomInput(false)" @click="toggleCustomInput(false)"
/> />
<label <label
class="label-light" class="label-bold"
for="every-day" for="every-day"
> >
{{ __('Every day (at 4:00am)') }} {{ __('Every day (at 4:00am)') }}
...@@ -112,13 +112,13 @@ ...@@ -112,13 +112,13 @@
v-model="cronInterval" v-model="cronInterval"
:name="inputNameAttribute" :name="inputNameAttribute"
:value="cronIntervalPresets.everyWeek" :value="cronIntervalPresets.everyWeek"
class="label-light" class="label-bold"
type="radio" type="radio"
@click="toggleCustomInput(false)" @click="toggleCustomInput(false)"
/> />
<label <label
class="label-light" class="label-bold"
for="every-week" for="every-week"
> >
{{ __('Every week (Sundays at 4:00am)') }} {{ __('Every week (Sundays at 4:00am)') }}
...@@ -131,13 +131,13 @@ ...@@ -131,13 +131,13 @@
v-model="cronInterval" v-model="cronInterval"
:name="inputNameAttribute" :name="inputNameAttribute"
:value="cronIntervalPresets.everyMonth" :value="cronIntervalPresets.everyMonth"
class="label-light" class="label-bold"
type="radio" type="radio"
@click="toggleCustomInput(false)" @click="toggleCustomInput(false)"
/> />
<label <label
class="label-light" class="label-bold"
for="every-month" for="every-month"
> >
{{ __('Every month (on the 1st at 4:00am)') }} {{ __('Every month (on the 1st at 4:00am)') }}
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
<div class="project-feature-row"> <div class="project-feature-row">
<label <label
v-if="label" v-if="label"
class="label-light" class="label-bold"
> >
{{ label }} {{ label }}
<a <a
......
...@@ -49,13 +49,15 @@ export default class Profile { ...@@ -49,13 +49,15 @@ export default class Profile {
saveForm() { saveForm() {
const self = this; const self = this;
const formData = new FormData(this.form[0]); const formData = new FormData(this.form.get(0));
const avatarBlob = this.avatarGlCrop.getBlob(); const avatarBlob = this.avatarGlCrop.getBlob();
if (avatarBlob != null) { if (avatarBlob != null) {
formData.append('user[avatar]', avatarBlob, 'avatar.png'); formData.append('user[avatar]', avatarBlob, 'avatar.png');
} }
formData.delete('user[avatar]-trigger');
axios({ axios({
method: this.form.attr('method'), method: this.form.attr('method'),
url: this.form.attr('action'), url: this.form.attr('action'),
......
...@@ -822,7 +822,7 @@ header.header-content .dropdown-menu.frequent-items-dropdown-menu { ...@@ -822,7 +822,7 @@ header.header-content .dropdown-menu.frequent-items-dropdown-menu {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
width: 500px; width: 500px;
height: 334px; height: 354px;
.frequent-items-dropdown-sidebar, .frequent-items-dropdown-sidebar,
.frequent-items-dropdown-content { .frequent-items-dropdown-content {
...@@ -868,6 +868,7 @@ header.header-content .dropdown-menu.frequent-items-dropdown-menu { ...@@ -868,6 +868,7 @@ header.header-content .dropdown-menu.frequent-items-dropdown-menu {
} }
.frequent-items-list-container { .frequent-items-list-container {
height: 304px;
padding: 8px 0; padding: 8px 0;
overflow-y: auto; overflow-y: auto;
...@@ -897,10 +898,6 @@ header.header-content .dropdown-menu.frequent-items-dropdown-menu { ...@@ -897,10 +898,6 @@ header.header-content .dropdown-menu.frequent-items-dropdown-menu {
margin-top: 8px; margin-top: 8px;
} }
.frequent-items-search-container {
height: 284px;
}
@include media-breakpoint-down(xs) { @include media-breakpoint-down(xs) {
.frequent-items-list-container { .frequent-items-list-container {
width: auto; width: auto;
......
...@@ -31,7 +31,7 @@ label { ...@@ -31,7 +31,7 @@ label {
margin: 0; margin: 0;
} }
&.label-light { &.label-bold {
font-weight: $gl-font-weight-bold; font-weight: $gl-font-weight-bold;
} }
} }
......
.split-report-section {
border-bottom: 1px solid $gray-darker;
.report-block-container {
max-height: 500px;
overflow: auto;
}
.space-children,
.space-children > span {
display: flex;
align-self: center;
}
.media {
align-items: center;
padding: 10px;
line-height: 20px;
/*
This fixes the wrapping div of the icon in the report header.
Apparently the borderless status icons are half the size of the status icons with border.
This means we have to double the size of the wrapping div for borderless icons.
*/
.space-children:first-child {
width: 32px;
height: 32px;
align-items: center;
justify-content: center;
margin-right: 5px;
margin-left: 1px;
}
}
.code-text {
width: 100%;
flex: 1;
}
}
.mr-widget-grouped-section {
.report-block-container {
max-height: 170px;
overflow: auto;
}
.report-block-list-issue-parent {
padding: $gl-padding-top $gl-padding;
border-top: 1px solid $border-color;
}
.report-block-list-icon .loading-container {
position: relative;
left: -2px;
// needed to make the next element align with the
// elements below that have a svg with 16px width
.fa-spinner {
width: 16px;
}
}
}
.report-block-container {
border-top: 1px solid $border-color;
padding: $gl-padding-top;
background-color: $gray-light;
// Clean MR widget CSS
line-height: 20px;
}
.report-block-list {
list-style: none;
padding: 0 1px;
margin: 0;
.license-item {
line-height: $gl-padding-24;
.license-dependencies {
color: $gl-text-color-tertiary;
}
.btn-show-all-packages {
line-height: $gl-btn-line-height;
margin-bottom: 2px;
}
}
}
.report-block-list-icon {
display: flex;
&.failed {
color: $red-500;
}
&.success {
color: $green-500;
}
&.neutral {
color: $theme-gray-700;
}
.ci-status-icon {
svg {
width: 16px;
height: 16px;
left: -2px;
}
}
}
.report-block-list-issue {
display: flex;
align-items: flex-start;
align-content: flex-start;
}
.is-dismissed .report-block-list-issue-description,
.is-dismissed .vulnerability-name-button {
text-decoration: line-through;
}
.report-block-list-issue-description-text::after {
content: '\00a0';
}
.report-block-list-issue-description {
align-content: space-around;
align-items: flex-start;
flex-wrap: wrap;
display: flex;
align-self: center;
}
.report-block {
.break-link {
word-wrap: break-word;
word-break: break-all;
}
}
.report-block-issue-code {
width: 600px;
}
.modal-security-report-dast {
.modal-dialog {
width: $modal-lg;
max-width: $modal-lg;
}
// This is temporary till we get the new modals hooked up
&.modal-hide-footer .modal-footer {
display: none;
}
}
...@@ -10,7 +10,6 @@ class Projects::RawController < Projects::ApplicationController ...@@ -10,7 +10,6 @@ class Projects::RawController < Projects::ApplicationController
def show def show
@blob = @repository.blob_at(@commit.id, @path) @blob = @repository.blob_at(@commit.id, @path)
if @blob if @blob
headers['X-Content-Type-Options'] = 'nosniff' headers['X-Content-Type-Options'] = 'nosniff'
...@@ -19,7 +18,7 @@ class Projects::RawController < Projects::ApplicationController ...@@ -19,7 +18,7 @@ class Projects::RawController < Projects::ApplicationController
if @blob.stored_externally? if @blob.stored_externally?
send_lfs_object send_lfs_object
else else
send_git_blob @repository, @blob send_git_blob @repository, @blob, inline: (params[:inline] != 'false')
end end
else else
render_404 render_404
......
...@@ -114,22 +114,22 @@ module BlobHelper ...@@ -114,22 +114,22 @@ module BlobHelper
icon("#{file_type_icon_class('file', mode, name)} fw") icon("#{file_type_icon_class('file', mode, name)} fw")
end end
def blob_raw_url(only_path: false) def blob_raw_url(**kwargs)
if @build && @entry if @build && @entry
raw_project_job_artifacts_url(@project, @build, path: @entry.path, only_path: only_path) raw_project_job_artifacts_url(@project, @build, path: @entry.path, **kwargs)
elsif @snippet elsif @snippet
if @snippet.project_id if @snippet.project_id
raw_project_snippet_url(@project, @snippet, only_path: only_path) raw_project_snippet_url(@project, @snippet, **kwargs)
else else
raw_snippet_url(@snippet, only_path: only_path) raw_snippet_url(@snippet, **kwargs)
end end
elsif @blob elsif @blob
project_raw_url(@project, @id, only_path: only_path) project_raw_url(@project, @id, **kwargs)
end end
end end
def blob_raw_path def blob_raw_path(**kwargs)
blob_raw_url(only_path: true) blob_raw_url(**kwargs, only_path: true)
end end
# SVGs can contain malicious JavaScript; only include whitelisted # SVGs can contain malicious JavaScript; only include whitelisted
...@@ -226,16 +226,17 @@ module BlobHelper ...@@ -226,16 +226,17 @@ module BlobHelper
def open_raw_blob_button(blob) def open_raw_blob_button(blob)
return if blob.empty? return if blob.empty?
return if blob.raw_binary? || blob.stored_externally?
if blob.raw_binary? || blob.stored_externally? title = 'Open raw'
icon = sprite_icon('download') link_to icon('file-code-o'), blob_raw_path, class: 'btn btn-sm has-tooltip', target: '_blank', rel: 'noopener noreferrer', title: title, data: { container: 'body' }
title = 'Download' end
else
icon = icon('file-code-o') def download_blob_button(blob)
title = 'Open raw' return if blob.empty?
end
link_to icon, blob_raw_path, class: 'btn btn-sm has-tooltip', target: '_blank', rel: 'noopener noreferrer', title: title, data: { container: 'body' } title = 'Download'
link_to sprite_icon('download'), blob_raw_path(inline: false), download: @path, class: 'btn btn-sm has-tooltip', target: '_blank', rel: 'noopener noreferrer', title: title, data: { container: 'body' }
end end
def blob_render_error_reason(viewer) def blob_render_error_reason(viewer)
......
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
# Workhorse will also serve files when using `send_file`. # Workhorse will also serve files when using `send_file`.
module WorkhorseHelper module WorkhorseHelper
# Send a Git blob through Workhorse # Send a Git blob through Workhorse
def send_git_blob(repository, blob) def send_git_blob(repository, blob, inline: true)
headers.store(*Gitlab::Workhorse.send_git_blob(repository, blob)) headers.store(*Gitlab::Workhorse.send_git_blob(repository, blob))
headers['Content-Disposition'] = 'inline' headers['Content-Disposition'] = inline ? 'inline' : 'attachment'
headers['Content-Type'] = safe_content_type(blob) headers['Content-Type'] = safe_content_type(blob)
render plain: "" render plain: ""
end end
......
...@@ -67,7 +67,7 @@ module Projects ...@@ -67,7 +67,7 @@ module Projects
else else
gitlab_shell.import_repository(project.repository_storage, project.disk_path, project.import_url) gitlab_shell.import_repository(project.repository_storage, project.disk_path, project.import_url)
end end
rescue Gitlab::Shell::Error, Gitlab::Git::RepositoryMirroring::RemoteError => e rescue Gitlab::Shell::Error => e
# Expire cache to prevent scenarios such as: # Expire cache to prevent scenarios such as:
# 1. First import failed, but the repo was imported successfully, so +exists?+ returns true # 1. First import failed, but the repo was imported successfully, so +exists?+ returns true
# 2. Retried import, repo is broken or not imported but +exists?+ still returns true # 2. Retried import, repo is broken or not imported but +exists?+ still returns true
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
%fieldset %fieldset
.form-group .form-group
= f.label :admin_notification_email, 'Abuse reports notification email', class: 'label-light' = f.label :admin_notification_email, 'Abuse reports notification email', class: 'label-bold'
= f.text_field :admin_notification_email, class: 'form-control' = f.text_field :admin_notification_email, class: 'form-control'
.form-text.text-muted .form-text.text-muted
Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area. Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area.
......
...@@ -8,23 +8,23 @@ ...@@ -8,23 +8,23 @@
= f.label :gravatar_enabled, class: 'form-check-label' do = f.label :gravatar_enabled, class: 'form-check-label' do
Gravatar enabled Gravatar enabled
.form-group .form-group
= f.label :default_projects_limit, class: 'label-light' = f.label :default_projects_limit, class: 'label-bold'
= f.number_field :default_projects_limit, class: 'form-control' = f.number_field :default_projects_limit, class: 'form-control'
.form-group .form-group
= f.label :max_attachment_size, 'Maximum attachment size (MB)', class: 'label-light' = f.label :max_attachment_size, 'Maximum attachment size (MB)', class: 'label-bold'
= f.number_field :max_attachment_size, class: 'form-control' = f.number_field :max_attachment_size, class: 'form-control'
.form-group .form-group
= f.label :session_expire_delay, 'Session duration (minutes)', class: 'label-light' = f.label :session_expire_delay, 'Session duration (minutes)', class: 'label-bold'
= f.number_field :session_expire_delay, class: 'form-control' = f.number_field :session_expire_delay, class: 'form-control'
%span.form-text.text-muted#session_expire_delay_help_block GitLab restart is required to apply changes %span.form-text.text-muted#session_expire_delay_help_block GitLab restart is required to apply changes
.form-group .form-group
= f.label :user_oauth_applications, 'User OAuth applications', class: 'label-light' = f.label :user_oauth_applications, 'User OAuth applications', class: 'label-bold'
.form-check .form-check
= f.check_box :user_oauth_applications, class: 'form-check-input' = f.check_box :user_oauth_applications, class: 'form-check-input'
= f.label :user_oauth_applications, class: 'form-check-label' do = f.label :user_oauth_applications, class: 'form-check-label' do
Allow users to register any application to use GitLab as an OAuth provider Allow users to register any application to use GitLab as an OAuth provider
.form-group .form-group
= f.label :user_default_external, 'New users set to external', class: 'label-light' = f.label :user_default_external, 'New users set to external', class: 'label-bold'
.form-check .form-check
= f.check_box :user_default_external, class: 'form-check-input' = f.check_box :user_default_external, class: 'form-check-input'
= f.label :user_default_external, class: 'form-check-label' do = f.label :user_default_external, class: 'form-check-label' do
......
...@@ -14,12 +14,12 @@ ...@@ -14,12 +14,12 @@
.form-text.text-muted .form-text.text-muted
Limit the amount of resources slow running jobs are assigned. Limit the amount of resources slow running jobs are assigned.
.form-group .form-group
= f.label :sidekiq_throttling_queues, 'Sidekiq queues to throttle', class: 'label-light' = f.label :sidekiq_throttling_queues, 'Sidekiq queues to throttle', class: 'label-bold'
= f.select :sidekiq_throttling_queues, sidekiq_queue_options_for_select, { include_hidden: false }, multiple: true, class: 'select2 select-wide', data: { field: 'sidekiq_throttling_queues' } = f.select :sidekiq_throttling_queues, sidekiq_queue_options_for_select, { include_hidden: false }, multiple: true, class: 'select2 select-wide', data: { field: 'sidekiq_throttling_queues' }
.form-text.text-muted .form-text.text-muted
Choose which queues you wish to throttle. Choose which queues you wish to throttle.
.form-group .form-group
= f.label :sidekiq_throttling_factor, 'Throttling Factor', class: 'label-light' = f.label :sidekiq_throttling_factor, 'Throttling Factor', class: 'label-bold'
= f.number_field :sidekiq_throttling_factor, class: 'form-control', min: '0.01', max: '0.99', step: '0.01' = f.number_field :sidekiq_throttling_factor, class: 'form-control', min: '0.01', max: '0.99', step: '0.01'
.form-text.text-muted .form-text.text-muted
The factor by which the queues should be throttled. A value between 0.0 and 1.0, exclusive. The factor by which the queues should be throttled. A value between 0.0 and 1.0, exclusive.
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
It will automatically build, test, and deploy applications based on a predefined CI/CD configuration It will automatically build, test, and deploy applications based on a predefined CI/CD configuration
= link_to icon('question-circle'), help_page_path('topics/autodevops/index.md') = link_to icon('question-circle'), help_page_path('topics/autodevops/index.md')
.form-group .form-group
= f.label :auto_devops_domain, class: 'label-light' = f.label :auto_devops_domain, class: 'label-bold'
= f.text_field :auto_devops_domain, class: 'form-control', placeholder: 'domain.com' = f.text_field :auto_devops_domain, class: 'form-control', placeholder: 'domain.com'
.form-text.text-muted .form-text.text-muted
= s_("AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages.") = s_("AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages.")
...@@ -21,17 +21,17 @@ ...@@ -21,17 +21,17 @@
= f.label :shared_runners_enabled, class: 'form-check-label' do = f.label :shared_runners_enabled, class: 'form-check-label' do
Enable shared runners for new projects Enable shared runners for new projects
.form-group .form-group
= f.label :shared_runners_text, class: 'label-light' = f.label :shared_runners_text, class: 'label-bold'
= f.text_area :shared_runners_text, class: 'form-control', rows: 4 = f.text_area :shared_runners_text, class: 'form-control', rows: 4
.form-text.text-muted Markdown enabled .form-text.text-muted Markdown enabled
.form-group .form-group
= f.label :max_artifacts_size, 'Maximum artifacts size (MB)', class: 'label-light' = f.label :max_artifacts_size, 'Maximum artifacts size (MB)', class: 'label-bold'
= f.number_field :max_artifacts_size, class: 'form-control' = f.number_field :max_artifacts_size, class: 'form-control'
.form-text.text-muted .form-text.text-muted
Set the maximum file size for each job's artifacts Set the maximum file size for each job's artifacts
= link_to icon('question-circle'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'maximum-artifacts-size') = link_to icon('question-circle'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'maximum-artifacts-size')
.form-group .form-group
= f.label :default_artifacts_expire_in, 'Default artifacts expiration', class: 'label-light' = f.label :default_artifacts_expire_in, 'Default artifacts expiration', class: 'label-bold'
= f.text_field :default_artifacts_expire_in, class: 'form-control' = f.text_field :default_artifacts_expire_in, class: 'form-control'
.form-text.text-muted .form-text.text-muted
Set the default expiration time for each job's artifacts. Set the default expiration time for each job's artifacts.
......
...@@ -3,20 +3,20 @@ ...@@ -3,20 +3,20 @@
%fieldset %fieldset
.form-group .form-group
= f.label :gitaly_timeout_default, 'Default Timeout Period', class: 'label-light' = f.label :gitaly_timeout_default, 'Default Timeout Period', class: 'label-bold'
= f.number_field :gitaly_timeout_default, class: 'form-control' = f.number_field :gitaly_timeout_default, class: 'form-control'
.form-text.text-muted .form-text.text-muted
Timeout for Gitaly calls from the GitLab application (in seconds). This timeout is not enforced Timeout for Gitaly calls from the GitLab application (in seconds). This timeout is not enforced
for git fetch/push operations or Sidekiq jobs. for git fetch/push operations or Sidekiq jobs.
.form-group .form-group
= f.label :gitaly_timeout_fast, 'Fast Timeout Period', class: 'label-light' = f.label :gitaly_timeout_fast, 'Fast Timeout Period', class: 'label-bold'
= f.number_field :gitaly_timeout_fast, class: 'form-control' = f.number_field :gitaly_timeout_fast, class: 'form-control'
.form-text.text-muted .form-text.text-muted
Fast operation timeout (in seconds). Some Gitaly operations are expected to be fast. Fast operation timeout (in seconds). Some Gitaly operations are expected to be fast.
If they exceed this threshold, there may be a problem with a storage shard and 'failing fast' If they exceed this threshold, there may be a problem with a storage shard and 'failing fast'
can help maintain the stability of the GitLab instance. can help maintain the stability of the GitLab instance.
.form-group .form-group
= f.label :gitaly_timeout_medium, 'Medium Timeout Period', class: 'label-light' = f.label :gitaly_timeout_medium, 'Medium Timeout Period', class: 'label-bold'
= f.number_field :gitaly_timeout_medium, class: 'form-control' = f.number_field :gitaly_timeout_medium, class: 'form-control'
.form-text.text-muted .form-text.text-muted
Medium operation timeout (in seconds). This should be a value between the Fast and the Default timeout. Medium operation timeout (in seconds). This should be a value between the Fast and the Default timeout.
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
%fieldset %fieldset
.form-group .form-group
= f.label :help_page_text, class: 'label-light' = f.label :help_page_text, class: 'label-bold'
= f.text_area :help_page_text, class: 'form-control', rows: 4 = f.text_area :help_page_text, class: 'form-control', rows: 4
.form-text.text-muted Markdown enabled .form-text.text-muted Markdown enabled
.form-group .form-group
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
= f.label :help_page_hide_commercial_content, class: 'form-check-label' do = f.label :help_page_hide_commercial_content, class: 'form-check-label' do
Hide marketing-related entries from help Hide marketing-related entries from help
.form-group .form-group
= f.label :help_page_support_url, 'Support page URL', class: 'label-light' = f.label :help_page_support_url, 'Support page URL', class: 'label-bold'
= f.text_field :help_page_support_url, class: 'form-control', placeholder: 'http://company.example.com/getting-help', :'aria-describedby' => 'support_help_block' = f.text_field :help_page_support_url, class: 'form-control', placeholder: 'http://company.example.com/getting-help', :'aria-describedby' => 'support_help_block'
%span.form-text.text-muted#support_help_block Alternate support URL for help page %span.form-text.text-muted#support_help_block Alternate support URL for help page
......
...@@ -14,10 +14,10 @@ ...@@ -14,10 +14,10 @@
= f.label :metrics_enabled, class: 'form-check-label' do = f.label :metrics_enabled, class: 'form-check-label' do
Enable InfluxDB Metrics Enable InfluxDB Metrics
.form-group .form-group
= f.label :metrics_host, 'InfluxDB host', class: 'label-light' = f.label :metrics_host, 'InfluxDB host', class: 'label-bold'
= f.text_field :metrics_host, class: 'form-control', placeholder: 'influxdb.example.com' = f.text_field :metrics_host, class: 'form-control', placeholder: 'influxdb.example.com'
.form-group .form-group
= f.label :metrics_port, 'InfluxDB port', class: 'label-light' = f.label :metrics_port, 'InfluxDB port', class: 'label-bold'
= f.text_field :metrics_port, class: 'form-control', placeholder: '8089' = f.text_field :metrics_port, class: 'form-control', placeholder: '8089'
.form-text.text-muted .form-text.text-muted
The UDP port to use for connecting to InfluxDB. InfluxDB requires that The UDP port to use for connecting to InfluxDB. InfluxDB requires that
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
sending messages to this port, without it metrics data will not be sending messages to this port, without it metrics data will not be
saved. saved.
.form-group .form-group
= f.label :metrics_pool_size, 'Connection pool size', class: 'label-light' = f.label :metrics_pool_size, 'Connection pool size', class: 'label-bold'
= f.number_field :metrics_pool_size, class: 'form-control' = f.number_field :metrics_pool_size, class: 'form-control'
.form-text.text-muted .form-text.text-muted
The amount of InfluxDB connections to open. Connections are opened The amount of InfluxDB connections to open. Connections are opened
...@@ -33,25 +33,25 @@ ...@@ -33,25 +33,25 @@
enough connections are available (at minimum the amount of application enough connections are available (at minimum the amount of application
server threads). server threads).
.form-group .form-group
= f.label :metrics_timeout, 'Connection timeout', class: 'label-light' = f.label :metrics_timeout, 'Connection timeout', class: 'label-bold'
= f.number_field :metrics_timeout, class: 'form-control' = f.number_field :metrics_timeout, class: 'form-control'
.form-text.text-muted .form-text.text-muted
The amount of seconds after which an InfluxDB connection will time The amount of seconds after which an InfluxDB connection will time
out. out.
.form-group .form-group
= f.label :metrics_method_call_threshold, 'Method Call Threshold (ms)', class: 'label-light' = f.label :metrics_method_call_threshold, 'Method Call Threshold (ms)', class: 'label-bold'
= f.number_field :metrics_method_call_threshold, class: 'form-control' = f.number_field :metrics_method_call_threshold, class: 'form-control'
.form-text.text-muted .form-text.text-muted
A method call is only tracked when it takes longer to complete than A method call is only tracked when it takes longer to complete than
the given amount of milliseconds. the given amount of milliseconds.
.form-group .form-group
= f.label :metrics_sample_interval, 'Sampler Interval (sec)', class: 'label-light' = f.label :metrics_sample_interval, 'Sampler Interval (sec)', class: 'label-bold'
= f.number_field :metrics_sample_interval, class: 'form-control' = f.number_field :metrics_sample_interval, class: 'form-control'
.form-text.text-muted .form-text.text-muted
The sampling interval in seconds. Sampled data includes memory usage, The sampling interval in seconds. Sampled data includes memory usage,
retained Ruby objects, file descriptors and so on. retained Ruby objects, file descriptors and so on.
.form-group .form-group
= f.label :metrics_packet_size, 'Metrics per packet', class: 'label-light' = f.label :metrics_packet_size, 'Metrics per packet', class: 'label-bold'
= f.number_field :metrics_packet_size, class: 'form-control' = f.number_field :metrics_packet_size, class: 'form-control'
.form-text.text-muted .form-text.text-muted
The amount of points to store in a single UDP packet. More points The amount of points to store in a single UDP packet. More points
......
...@@ -10,10 +10,10 @@ ...@@ -10,10 +10,10 @@
%span.form-text.text-muted %span.form-text.text-muted
Helps reduce request volume (e.g. from crawlers or abusive bots) Helps reduce request volume (e.g. from crawlers or abusive bots)
.form-group .form-group
= f.label :throttle_unauthenticated_requests_per_period, 'Max requests per period per IP', class: 'label-light' = f.label :throttle_unauthenticated_requests_per_period, 'Max requests per period per IP', class: 'label-bold'
= f.number_field :throttle_unauthenticated_requests_per_period, class: 'form-control' = f.number_field :throttle_unauthenticated_requests_per_period, class: 'form-control'
.form-group .form-group
= f.label :throttle_unauthenticated_period_in_seconds, 'Rate limit period in seconds', class: 'label-light' = f.label :throttle_unauthenticated_period_in_seconds, 'Rate limit period in seconds', class: 'label-bold'
= f.number_field :throttle_unauthenticated_period_in_seconds, class: 'form-control' = f.number_field :throttle_unauthenticated_period_in_seconds, class: 'form-control'
.form-group .form-group
.form-check .form-check
...@@ -23,10 +23,10 @@ ...@@ -23,10 +23,10 @@
%span.form-text.text-muted %span.form-text.text-muted
Helps reduce request volume (e.g. from crawlers or abusive bots) Helps reduce request volume (e.g. from crawlers or abusive bots)
.form-group .form-group
= f.label :throttle_authenticated_api_requests_per_period, 'Max requests per period per user', class: 'label-light' = f.label :throttle_authenticated_api_requests_per_period, 'Max requests per period per user', class: 'label-bold'
= f.number_field :throttle_authenticated_api_requests_per_period, class: 'form-control' = f.number_field :throttle_authenticated_api_requests_per_period, class: 'form-control'
.form-group .form-group
= f.label :throttle_authenticated_api_period_in_seconds, 'Rate limit period in seconds', class: 'label-light' = f.label :throttle_authenticated_api_period_in_seconds, 'Rate limit period in seconds', class: 'label-bold'
= f.number_field :throttle_authenticated_api_period_in_seconds, class: 'form-control' = f.number_field :throttle_authenticated_api_period_in_seconds, class: 'form-control'
.form-group .form-group
.form-check .form-check
...@@ -36,10 +36,10 @@ ...@@ -36,10 +36,10 @@
%span.form-text.text-muted %span.form-text.text-muted
Helps reduce request volume (e.g. from crawlers or abusive bots) Helps reduce request volume (e.g. from crawlers or abusive bots)
.form-group .form-group
= f.label :throttle_authenticated_web_requests_per_period, 'Max requests per period per user', class: 'label-light' = f.label :throttle_authenticated_web_requests_per_period, 'Max requests per period per user', class: 'label-bold'
= f.number_field :throttle_authenticated_web_requests_per_period, class: 'form-control' = f.number_field :throttle_authenticated_web_requests_per_period, class: 'form-control'
.form-group .form-group
= f.label :throttle_authenticated_web_period_in_seconds, 'Rate limit period in seconds', class: 'label-light' = f.label :throttle_authenticated_web_period_in_seconds, 'Rate limit period in seconds', class: 'label-bold'
= f.number_field :throttle_authenticated_web_period_in_seconds, class: 'form-control' = f.number_field :throttle_authenticated_web_period_in_seconds, class: 'form-control'
= f.submit 'Save changes', class: "btn btn-success" = f.submit 'Save changes', class: "btn btn-success"
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
.form-text.text-muted .form-text.text-muted
Koding integration has been deprecated since GitLab 10.0. If you disable your Koding integration, you will not be able to enable it again. Koding integration has been deprecated since GitLab 10.0. If you disable your Koding integration, you will not be able to enable it again.
.form-group .form-group
= f.label :koding_url, 'Koding URL', class: 'label-light' = f.label :koding_url, 'Koding URL', class: 'label-bold'
= f.text_field :koding_url, class: 'form-control', placeholder: 'http://gitlab.your-koding-instance.com:8090' = f.text_field :koding_url, class: 'form-control', placeholder: 'http://gitlab.your-koding-instance.com:8090'
.form-text.text-muted .form-text.text-muted
Koding has integration enabled out of the box for the Koding has integration enabled out of the box for the
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
%a{ href: 'https://getsentry.com', target: '_blank', rel: 'noopener noreferrer' } https://getsentry.com %a{ href: 'https://getsentry.com', target: '_blank', rel: 'noopener noreferrer' } https://getsentry.com
.form-group .form-group
= f.label :sentry_dsn, 'Sentry DSN', class: 'label-light' = f.label :sentry_dsn, 'Sentry DSN', class: 'label-bold'
= f.text_field :sentry_dsn, class: 'form-control' = f.text_field :sentry_dsn, class: 'form-control'
.form-group .form-group
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
%a{ href: 'https://sentry.io/for/javascript/', target: '_blank', rel: 'noopener noreferrer' } https://sentry.io/for/javascript/ %a{ href: 'https://sentry.io/for/javascript/', target: '_blank', rel: 'noopener noreferrer' } https://sentry.io/for/javascript/
.form-group .form-group
= f.label :clientside_sentry_dsn, 'Clientside Sentry DSN', class: 'label-light' = f.label :clientside_sentry_dsn, 'Clientside Sentry DSN', class: 'label-bold'
= f.text_field :clientside_sentry_dsn, class: 'form-control' = f.text_field :clientside_sentry_dsn, class: 'form-control'
= f.submit 'Save changes', class: "btn btn-success" = f.submit 'Save changes', class: "btn btn-success"
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
%fieldset %fieldset
.form-group .form-group
= f.label :max_pages_size, 'Maximum size of pages (MB)', class: 'label-light' = f.label :max_pages_size, 'Maximum size of pages (MB)', class: 'label-bold'
= f.number_field :max_pages_size, class: 'form-control' = f.number_field :max_pages_size, class: 'form-control'
.form-text.text-muted 0 for unlimited .form-text.text-muted 0 for unlimited
.form-group .form-group
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
= f.label :performance_bar_enabled, class: 'form-check-label' do = f.label :performance_bar_enabled, class: 'form-check-label' do
Enable the Performance Bar Enable the Performance Bar
.form-group .form-group
= f.label :performance_bar_allowed_group_path, 'Allowed group', class: 'label-light' = f.label :performance_bar_allowed_group_path, 'Allowed group', class: 'label-bold'
= f.text_field :performance_bar_allowed_group_path, class: 'form-control', placeholder: 'my-org/my-group', value: @application_setting.performance_bar_allowed_group&.full_path = f.text_field :performance_bar_allowed_group_path, class: 'form-control', placeholder: 'my-org/my-group', value: @application_setting.performance_bar_allowed_group&.full_path
= f.submit 'Save changes', class: "btn btn-success" = f.submit 'Save changes', class: "btn btn-success"
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
= f.label :plantuml_enabled, class: 'form-check-label' do = f.label :plantuml_enabled, class: 'form-check-label' do
Enable PlantUML Enable PlantUML
.form-group .form-group
= f.label :plantuml_url, 'PlantUML URL', class: 'label-light' = f.label :plantuml_url, 'PlantUML URL', class: 'label-bold'
= f.text_field :plantuml_url, class: 'form-control', placeholder: 'http://gitlab.your-plantuml-instance.com:8080' = f.text_field :plantuml_url, class: 'form-control', placeholder: 'http://gitlab.your-plantuml-instance.com:8080'
.form-text.text-muted .form-text.text-muted
Allow rendering of Allow rendering of
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
%fieldset %fieldset
.form-group .form-group
= f.label :polling_interval_multiplier, 'Polling interval multiplier', class: 'label-light' = f.label :polling_interval_multiplier, 'Polling interval multiplier', class: 'label-bold'
= f.text_field :polling_interval_multiplier, class: 'form-control' = f.text_field :polling_interval_multiplier, class: 'form-control'
.form-text.text-muted .form-text.text-muted
Change this value to influence how frequently the GitLab UI polls for updates. Change this value to influence how frequently the GitLab UI polls for updates.
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
%fieldset %fieldset
.form-group .form-group
= f.label :container_registry_token_expire_delay, 'Authorization token duration (minutes)', class: 'label-light' = f.label :container_registry_token_expire_delay, 'Authorization token duration (minutes)', class: 'label-bold'
= f.number_field :container_registry_token_expire_delay, class: 'form-control' = f.number_field :container_registry_token_expire_delay, class: 'form-control'
= f.submit 'Save changes', class: "btn btn-success" = f.submit 'Save changes', class: "btn btn-success"
...@@ -38,17 +38,17 @@ ...@@ -38,17 +38,17 @@
Creating pack file bitmaps makes housekeeping take a little longer but Creating pack file bitmaps makes housekeeping take a little longer but
bitmaps should accelerate 'git clone' performance. bitmaps should accelerate 'git clone' performance.
.form-group .form-group
= f.label :housekeeping_incremental_repack_period, 'Incremental repack period', class: 'label-light' = f.label :housekeeping_incremental_repack_period, 'Incremental repack period', class: 'label-bold'
= f.number_field :housekeeping_incremental_repack_period, class: 'form-control' = f.number_field :housekeeping_incremental_repack_period, class: 'form-control'
.form-text.text-muted .form-text.text-muted
Number of Git pushes after which an incremental 'git repack' is run. Number of Git pushes after which an incremental 'git repack' is run.
.form-group .form-group
= f.label :housekeeping_full_repack_period, 'Full repack period', class: 'label-light' = f.label :housekeeping_full_repack_period, 'Full repack period', class: 'label-bold'
= f.number_field :housekeeping_full_repack_period, class: 'form-control' = f.number_field :housekeeping_full_repack_period, class: 'form-control'
.form-text.text-muted .form-text.text-muted
Number of Git pushes after which a full 'git repack' is run. Number of Git pushes after which a full 'git repack' is run.
.form-group .form-group
= f.label :housekeeping_gc_period, 'Git GC period', class: 'label-light' = f.label :housekeeping_gc_period, 'Git GC period', class: 'label-bold'
= f.number_field :housekeeping_gc_period, class: 'form-control' = f.number_field :housekeeping_gc_period, class: 'form-control'
.form-text.text-muted .form-text.text-muted
Number of Git pushes after which 'git gc' is run. Number of Git pushes after which 'git gc' is run.
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
%fieldset %fieldset
.form-group .form-group
= f.label :mirror_available, 'Enable mirror configuration', class: 'label-light' = f.label :mirror_available, 'Enable mirror configuration', class: 'label-bold'
.form-check .form-check
= f.check_box :mirror_available, class: 'form-check-input' = f.check_box :mirror_available, class: 'form-check-input'
= f.label :mirror_available, class: 'form-check-label' do = f.label :mirror_available, class: 'form-check-label' do
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
repositories from having to be moved or renamed when the Project URL changes and may improve disk I/O performance. repositories from having to be moved or renamed when the Project URL changes and may improve disk I/O performance.
%em (EXPERIMENTAL) %em (EXPERIMENTAL)
.form-group .form-group
= f.label :repository_storages, 'Storage paths for new projects', class: 'label-light' = f.label :repository_storages, 'Storage paths for new projects', class: 'label-bold'
= f.select :repository_storages, repository_storages_options_for_select(@application_setting.repository_storages), = f.select :repository_storages, repository_storages_options_for_select(@application_setting.repository_storages),
{include_hidden: false}, multiple: true, class: 'form-control' {include_hidden: false}, multiple: true, class: 'form-control'
.form-text.text-muted .form-text.text-muted
...@@ -23,27 +23,27 @@ ...@@ -23,27 +23,27 @@
.sub-section .sub-section
%h4 Circuit breaker %h4 Circuit breaker
.form-group .form-group
= f.label :circuitbreaker_check_interval, _('Check interval'), class: 'label-light' = f.label :circuitbreaker_check_interval, _('Check interval'), class: 'label-bold'
= f.number_field :circuitbreaker_check_interval, class: 'form-control' = f.number_field :circuitbreaker_check_interval, class: 'form-control'
.form-text.text-muted .form-text.text-muted
= circuitbreaker_check_interval_help_text = circuitbreaker_check_interval_help_text
.form-group .form-group
= f.label :circuitbreaker_access_retries, _('Number of access attempts'), class: 'label-light' = f.label :circuitbreaker_access_retries, _('Number of access attempts'), class: 'label-bold'
= f.number_field :circuitbreaker_access_retries, class: 'form-control' = f.number_field :circuitbreaker_access_retries, class: 'form-control'
.form-text.text-muted .form-text.text-muted
= circuitbreaker_access_retries_help_text = circuitbreaker_access_retries_help_text
.form-group .form-group
= f.label :circuitbreaker_storage_timeout, _('Seconds to wait for a storage access attempt'), class: 'label-light' = f.label :circuitbreaker_storage_timeout, _('Seconds to wait for a storage access attempt'), class: 'label-bold'
= f.number_field :circuitbreaker_storage_timeout, class: 'form-control' = f.number_field :circuitbreaker_storage_timeout, class: 'form-control'
.form-text.text-muted .form-text.text-muted
= circuitbreaker_storage_timeout_help_text = circuitbreaker_storage_timeout_help_text
.form-group .form-group
= f.label :circuitbreaker_failure_count_threshold, _('Maximum git storage failures'), class: 'label-light' = f.label :circuitbreaker_failure_count_threshold, _('Maximum git storage failures'), class: 'label-bold'
= f.number_field :circuitbreaker_failure_count_threshold, class: 'form-control' = f.number_field :circuitbreaker_failure_count_threshold, class: 'form-control'
.form-text.text-muted .form-text.text-muted
= circuitbreaker_failure_count_help_text = circuitbreaker_failure_count_help_text
.form-group .form-group
= f.label :circuitbreaker_failure_reset_time, _('Seconds before reseting failure information'), class: 'label-light' = f.label :circuitbreaker_failure_reset_time, _('Seconds before reseting failure information'), class: 'label-bold'
= f.number_field :circuitbreaker_failure_reset_time, class: 'form-control' = f.number_field :circuitbreaker_failure_reset_time, class: 'form-control'
.form-text.text-muted .form-text.text-muted
= circuitbreaker_failure_reset_time_help_text = circuitbreaker_failure_reset_time_help_text
......
...@@ -21,31 +21,31 @@ ...@@ -21,31 +21,31 @@
must be used to authenticate. must be used to authenticate.
- if omniauth_enabled? && button_based_providers.any? - if omniauth_enabled? && button_based_providers.any?
.form-group .form-group
= f.label :enabled_oauth_sign_in_sources, 'Enabled OAuth sign-in sources', class: 'label-light' = f.label :enabled_oauth_sign_in_sources, 'Enabled OAuth sign-in sources', class: 'label-bold'
= hidden_field_tag 'application_setting[enabled_oauth_sign_in_sources][]' = hidden_field_tag 'application_setting[enabled_oauth_sign_in_sources][]'
.btn-group{ data: { toggle: 'buttons' } } .btn-group{ data: { toggle: 'buttons' } }
- oauth_providers_checkboxes.each do |source| - oauth_providers_checkboxes.each do |source|
= source = source
.form-group .form-group
= f.label :two_factor_authentication, 'Two-factor authentication', class: 'label-light' = f.label :two_factor_authentication, 'Two-factor authentication', class: 'label-bold'
.form-check .form-check
= f.check_box :require_two_factor_authentication, class: 'form-check-input' = f.check_box :require_two_factor_authentication, class: 'form-check-input'
= f.label :require_two_factor_authentication, class: 'form-check-label' do = f.label :require_two_factor_authentication, class: 'form-check-label' do
Require all users to setup Two-factor authentication Require all users to setup Two-factor authentication
.form-group .form-group
= f.label :two_factor_authentication, 'Two-factor grace period (hours)', class: 'label-light' = f.label :two_factor_authentication, 'Two-factor grace period (hours)', class: 'label-bold'
= f.number_field :two_factor_grace_period, min: 0, class: 'form-control', placeholder: '0' = f.number_field :two_factor_grace_period, min: 0, class: 'form-control', placeholder: '0'
.form-text.text-muted Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication .form-text.text-muted Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication
.form-group .form-group
= f.label :home_page_url, 'Home page URL', class: 'label-light' = f.label :home_page_url, 'Home page URL', class: 'label-bold'
= f.text_field :home_page_url, class: 'form-control', placeholder: 'http://company.example.com', :'aria-describedby' => 'home_help_block' = f.text_field :home_page_url, class: 'form-control', placeholder: 'http://company.example.com', :'aria-describedby' => 'home_help_block'
%span.form-text.text-muted#home_help_block We will redirect non-logged in users to this page %span.form-text.text-muted#home_help_block We will redirect non-logged in users to this page
.form-group .form-group
= f.label :after_sign_out_path, class: 'label-light' = f.label :after_sign_out_path, class: 'label-bold'
= f.text_field :after_sign_out_path, class: 'form-control', placeholder: 'http://company.example.com', :'aria-describedby' => 'after_sign_out_path_help_block' = f.text_field :after_sign_out_path, class: 'form-control', placeholder: 'http://company.example.com', :'aria-describedby' => 'after_sign_out_path_help_block'
%span.form-text.text-muted#after_sign_out_path_help_block We will redirect users to this page after they sign out %span.form-text.text-muted#after_sign_out_path_help_block We will redirect users to this page after they sign out
.form-group .form-group
= f.label :sign_in_text, class: 'label-light' = f.label :sign_in_text, class: 'label-bold'
= f.text_area :sign_in_text, class: 'form-control', rows: 4 = f.text_area :sign_in_text, class: 'form-control', rows: 4
.form-text.text-muted Markdown enabled .form-text.text-muted Markdown enabled
......
...@@ -13,11 +13,11 @@ ...@@ -13,11 +13,11 @@
= f.label :send_user_confirmation_email, class: 'form-check-label' do = f.label :send_user_confirmation_email, class: 'form-check-label' do
Send confirmation email on sign-up Send confirmation email on sign-up
.form-group .form-group
= f.label :domain_whitelist, 'Whitelisted domains for sign-ups', class: 'label-light' = f.label :domain_whitelist, 'Whitelisted domains for sign-ups', class: 'label-bold'
= f.text_area :domain_whitelist_raw, placeholder: 'domain.com', class: 'form-control', rows: 8 = f.text_area :domain_whitelist_raw, placeholder: 'domain.com', class: 'form-control', rows: 8
.form-text.text-muted ONLY users with e-mail addresses that match these domain(s) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com .form-text.text-muted ONLY users with e-mail addresses that match these domain(s) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com
.form-group .form-group
= f.label :domain_blacklist_enabled, 'Domain Blacklist', class: 'label-light' = f.label :domain_blacklist_enabled, 'Domain Blacklist', class: 'label-bold'
.form-check .form-check
= f.check_box :domain_blacklist_enabled, class: 'form-check-input' = f.check_box :domain_blacklist_enabled, class: 'form-check-input'
= f.label :domain_blacklist_enabled, class: 'form-check-label' do = f.label :domain_blacklist_enabled, class: 'form-check-label' do
...@@ -34,16 +34,16 @@ ...@@ -34,16 +34,16 @@
.option-title .option-title
Enter blacklist manually Enter blacklist manually
.form-group.blacklist-file .form-group.blacklist-file
= f.label :domain_blacklist_file, 'Blacklist file', class: 'label-light' = f.label :domain_blacklist_file, 'Blacklist file', class: 'label-bold'
= f.file_field :domain_blacklist_file, class: 'form-control', accept: '.txt,.conf' = f.file_field :domain_blacklist_file, class: 'form-control', accept: '.txt,.conf'
.form-text.text-muted Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries. .form-text.text-muted Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries.
.form-group.blacklist-raw .form-group.blacklist-raw
= f.label :domain_blacklist, 'Blacklisted domains for sign-ups', class: 'label-light' = f.label :domain_blacklist, 'Blacklisted domains for sign-ups', class: 'label-bold'
= f.text_area :domain_blacklist_raw, placeholder: 'domain.com', class: 'form-control', rows: 8 = f.text_area :domain_blacklist_raw, placeholder: 'domain.com', class: 'form-control', rows: 8
.form-text.text-muted Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com .form-text.text-muted Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com
.form-group .form-group
= f.label :after_sign_up_text, class: 'label-light' = f.label :after_sign_up_text, class: 'label-bold'
= f.text_area :after_sign_up_text, class: 'form-control', rows: 4 = f.text_area :after_sign_up_text, class: 'form-control', rows: 4
.form-text.text-muted Markdown enabled .form-text.text-muted Markdown enabled
......
...@@ -10,14 +10,14 @@ ...@@ -10,14 +10,14 @@
%span.form-text.text-muted#recaptcha_help_block Helps prevent bots from creating accounts %span.form-text.text-muted#recaptcha_help_block Helps prevent bots from creating accounts
.form-group .form-group
= f.label :recaptcha_site_key, 'reCAPTCHA Site Key', class: 'label-light' = f.label :recaptcha_site_key, 'reCAPTCHA Site Key', class: 'label-bold'
= f.text_field :recaptcha_site_key, class: 'form-control' = f.text_field :recaptcha_site_key, class: 'form-control'
.form-text.text-muted .form-text.text-muted
Generate site and private keys at Generate site and private keys at
%a{ href: 'http://www.google.com/recaptcha', target: 'blank' } http://www.google.com/recaptcha %a{ href: 'http://www.google.com/recaptcha', target: 'blank' } http://www.google.com/recaptcha
.form-group .form-group
= f.label :recaptcha_private_key, 'reCAPTCHA Private Key', class: 'label-light' = f.label :recaptcha_private_key, 'reCAPTCHA Private Key', class: 'label-bold'
= f.text_field :recaptcha_private_key, class: 'form-control' = f.text_field :recaptcha_private_key, class: 'form-control'
.form-group .form-group
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
%span.form-text.text-muted#akismet_help_block Helps prevent bots from creating issues %span.form-text.text-muted#akismet_help_block Helps prevent bots from creating issues
.form-group .form-group
= f.label :akismet_api_key, 'Akismet API Key', class: 'label-light' = f.label :akismet_api_key, 'Akismet API Key', class: 'label-bold'
= f.text_field :akismet_api_key, class: 'form-control' = f.text_field :akismet_api_key, class: 'form-control'
.form-text.text-muted .form-text.text-muted
Generate API key at Generate API key at
...@@ -43,13 +43,13 @@ ...@@ -43,13 +43,13 @@
Helps prevent malicious users hide their activity Helps prevent malicious users hide their activity
.form-group .form-group
= f.label :unique_ips_limit_per_user, 'IPs per user', class: 'label-light' = f.label :unique_ips_limit_per_user, 'IPs per user', class: 'label-bold'
= f.number_field :unique_ips_limit_per_user, class: 'form-control' = f.number_field :unique_ips_limit_per_user, class: 'form-control'
.form-text.text-muted .form-text.text-muted
Maximum number of unique IPs per user Maximum number of unique IPs per user
.form-group .form-group
= f.label :unique_ips_limit_time_window, 'IP expiration time', class: 'label-light' = f.label :unique_ips_limit_time_window, 'IP expiration time', class: 'label-bold'
= f.number_field :unique_ips_limit_time_window, class: 'form-control' = f.number_field :unique_ips_limit_time_window, class: 'form-control'
.form-text.text-muted .form-text.text-muted
How many seconds an IP will be counted towards the limit How many seconds an IP will be counted towards the limit
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
%fieldset %fieldset
.form-group .form-group
= f.label :terminal_max_session_time, 'Max session time', class: 'label-light' = f.label :terminal_max_session_time, 'Max session time', class: 'label-bold'
= f.number_field :terminal_max_session_time, class: 'form-control' = f.number_field :terminal_max_session_time, class: 'form-control'
.form-text.text-muted .form-text.text-muted
Maximum time for web terminal websocket connection (in seconds). Maximum time for web terminal websocket connection (in seconds).
......
...@@ -3,19 +3,19 @@ ...@@ -3,19 +3,19 @@
%fieldset %fieldset
.form-group .form-group
= f.label :default_branch_protection, class: 'label-light' = f.label :default_branch_protection, class: 'label-bold'
= f.select :default_branch_protection, options_for_select(Gitlab::Access.protection_options, @application_setting.default_branch_protection), {}, class: 'form-control' = f.select :default_branch_protection, options_for_select(Gitlab::Access.protection_options, @application_setting.default_branch_protection), {}, class: 'form-control'
.form-group.visibility-level-setting .form-group.visibility-level-setting
= f.label :default_project_visibility, class: 'label-light' = f.label :default_project_visibility, class: 'label-bold'
= render('shared/visibility_radios', model_method: :default_project_visibility, form: f, selected_level: @application_setting.default_project_visibility, form_model: Project.new) = render('shared/visibility_radios', model_method: :default_project_visibility, form: f, selected_level: @application_setting.default_project_visibility, form_model: Project.new)
.form-group.visibility-level-setting .form-group.visibility-level-setting
= f.label :default_snippet_visibility, class: 'label-light' = f.label :default_snippet_visibility, class: 'label-bold'
= render('shared/visibility_radios', model_method: :default_snippet_visibility, form: f, selected_level: @application_setting.default_snippet_visibility, form_model: ProjectSnippet.new) = render('shared/visibility_radios', model_method: :default_snippet_visibility, form: f, selected_level: @application_setting.default_snippet_visibility, form_model: ProjectSnippet.new)
.form-group.visibility-level-setting .form-group.visibility-level-setting
= f.label :default_group_visibility, class: 'label-light' = f.label :default_group_visibility, class: 'label-bold'
= render('shared/visibility_radios', model_method: :default_group_visibility, form: f, selected_level: @application_setting.default_group_visibility, form_model: Group.new) = render('shared/visibility_radios', model_method: :default_group_visibility, form: f, selected_level: @application_setting.default_group_visibility, form_model: Group.new)
.form-group .form-group
= f.label :restricted_visibility_levels, class: 'label-light' = f.label :restricted_visibility_levels, class: 'label-bold'
- checkbox_name = 'application_setting[restricted_visibility_levels][]' - checkbox_name = 'application_setting[restricted_visibility_levels][]'
= hidden_field_tag(checkbox_name) = hidden_field_tag(checkbox_name)
- restricted_level_checkboxes('restricted-visibility-help', checkbox_name, class: 'form-check-input').each do |level| - restricted_level_checkboxes('restricted-visibility-help', checkbox_name, class: 'form-check-input').each do |level|
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
Selected levels cannot be used by non-admin users for groups, projects or snippets. Selected levels cannot be used by non-admin users for groups, projects or snippets.
If the public level is restricted, user profiles are only visible to logged in users. If the public level is restricted, user profiles are only visible to logged in users.
.form-group .form-group
= f.label :import_sources, class: 'label-light' = f.label :import_sources, class: 'label-bold'
= hidden_field_tag 'application_setting[import_sources][]' = hidden_field_tag 'application_setting[import_sources][]'
- import_sources_checkboxes('import-sources-help', class: 'form-check-input').each do |source| - import_sources_checkboxes('import-sources-help', class: 'form-check-input').each do |source|
.form-check= source .form-check= source
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
Project export enabled Project export enabled
.form-group .form-group
%label.label-light Enabled Git access protocols %label.label-bold Enabled Git access protocols
= select(:application_setting, :enabled_git_access_protocol, [['Both SSH and HTTP(S)', nil], ['Only SSH', 'ssh'], ['Only HTTP(S)', 'http']], {}, class: 'form-control') = select(:application_setting, :enabled_git_access_protocol, [['Both SSH and HTTP(S)', nil], ['Only SSH', 'ssh'], ['Only HTTP(S)', 'http']], {}, class: 'form-control')
%span.form-text.text-muted#clone-protocol-help %span.form-text.text-muted#clone-protocol-help
Allow only the selected protocols to be used for Git access. Allow only the selected protocols to be used for Git access.
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
- ApplicationSetting::SUPPORTED_KEY_TYPES.each do |type| - ApplicationSetting::SUPPORTED_KEY_TYPES.each do |type|
- field_name = :"#{type}_key_restriction" - field_name = :"#{type}_key_restriction"
.form-group .form-group
= f.label field_name, "#{type.upcase} SSH keys", class: 'label-light' = f.label field_name, "#{type.upcase} SSH keys", class: 'label-bold'
= f.select field_name, key_restriction_options_for_select(type), {}, class: 'form-control' = f.select field_name, key_restriction_options_for_select(type), {}, class: 'form-control'
= f.submit 'Save changes', class: "btn btn-success" = f.submit 'Save changes', class: "btn btn-success"
= form_errors(hook) = form_errors(hook)
.form-group .form-group
= form.label :url, 'URL', class: 'label-light' = form.label :url, 'URL', class: 'label-bold'
= form.text_field :url, class: 'form-control' = form.text_field :url, class: 'form-control'
.form-group .form-group
= form.label :token, 'Secret Token', class: 'label-light' = form.label :token, 'Secret Token', class: 'label-bold'
= form.text_field :token, class: 'form-control' = form.text_field :token, class: 'form-control'
%p.form-text.text-muted %p.form-text.text-muted
Use this token to validate received payloads Use this token to validate received payloads
.form-group .form-group
= form.label :url, 'Trigger', class: 'label-light' = form.label :url, 'Trigger', class: 'label-bold'
%ul.list-unstyled %ul.list-unstyled
%li %li
.form-text.text-muted .form-text.text-muted
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
%p.light %p.light
This URL will be triggered when a merge request is created/updated/merged This URL will be triggered when a merge request is created/updated/merged
.form-group .form-group
= form.label :enable_ssl_verification, 'SSL verification', class: 'label-light checkbox' = form.label :enable_ssl_verification, 'SSL verification', class: 'label-bold checkbox'
.form-check .form-check
= form.check_box :enable_ssl_verification, class: 'form-check-input' = form.check_box :enable_ssl_verification, class: 'form-check-input'
= form.label :enable_ssl_verification, class: 'form-check-label' do = form.label :enable_ssl_verification, class: 'form-check-label' do
......
...@@ -2,11 +2,11 @@ ...@@ -2,11 +2,11 @@
= form_errors(application) = form_errors(application)
.form-group .form-group
= f.label :name, class: 'label-light' = f.label :name, class: 'label-bold'
= f.text_field :name, class: 'form-control', required: true = f.text_field :name, class: 'form-control', required: true
.form-group .form-group
= f.label :redirect_uri, class: 'label-light' = f.label :redirect_uri, class: 'label-bold'
= f.text_area :redirect_uri, class: 'form-control', required: true = f.text_area :redirect_uri, class: 'form-control', required: true
%span.form-text.text-muted %span.form-text.text-muted
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
= _('Use <code>%{native_redirect_uri}</code> for local tests').html_safe % { native_redirect_uri: Doorkeeper.configuration.native_redirect_uri } = _('Use <code>%{native_redirect_uri}</code> for local tests').html_safe % { native_redirect_uri: Doorkeeper.configuration.native_redirect_uri }
.form-group .form-group
= f.label :scopes, class: 'label-light' = f.label :scopes, class: 'label-bold'
= render 'shared/tokens/scopes_form', prefix: 'doorkeeper_application', token: application, scopes: @scopes = render 'shared/tokens/scopes_form', prefix: 'doorkeeper_application', token: application, scopes: @scopes
.prepend-top-default .prepend-top-default
......
...@@ -4,17 +4,17 @@ ...@@ -4,17 +4,17 @@
%fieldset %fieldset
.row .row
.form-group.col-md-9 .form-group.col-md-9
= f.label :name, class: 'label-light' do = f.label :name, class: 'label-bold' do
Group name Group name
= f.text_field :name, class: 'form-control' = f.text_field :name, class: 'form-control'
.form-group.col-md-3 .form-group.col-md-3
= f.label :id, class: 'label-light' do = f.label :id, class: 'label-bold' do
Group ID Group ID
= f.text_field :id, class: 'form-control', readonly: true = f.text_field :id, class: 'form-control', readonly: true
.form-group .form-group
= f.label :description, class: 'label-light' do = f.label :description, class: 'label-bold' do
Group description Group description
%span.light (optional) %span.light (optional)
= f.text_area :description, class: 'form-control', rows: 3, maxlength: 250 = f.text_area :description, class: 'form-control', rows: 3, maxlength: 250
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
= form_tag import_gitlab_project_path, class: 'new_project', multipart: true do = form_tag import_gitlab_project_path, class: 'new_project', multipart: true do
.row .row
.form-group.col-12.col-sm-6 .form-group.col-12.col-sm-6
= label_tag :namespace_id, 'Project path', class: 'label-light' = label_tag :namespace_id, 'Project path', class: 'label-bold'
.form-group .form-group
.input-group .input-group
- if current_user.can_select_namespace? - if current_user.can_select_namespace?
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#{user_url(current_user.username)}/ #{user_url(current_user.username)}/
= hidden_field_tag :namespace_id, value: current_user.namespace_id = hidden_field_tag :namespace_id, value: current_user.namespace_id
.form-group.col-12.col-sm-6.project-path .form-group.col-12.col-sm-6.project-path
= label_tag :path, _('Project name'), class: 'label-light' = label_tag :path, _('Project name'), class: 'label-bold'
= text_field_tag :path, @path, placeholder: "my-awesome-project", class: "js-path-name form-control", tabindex: 2, autofocus: true, required: true = text_field_tag :path, @path, placeholder: "my-awesome-project", class: "js-path-name form-control", tabindex: 2, autofocus: true, required: true
.row .row
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
.row .row
.form-group.col-sm-12 .form-group.col-sm-12
= hidden_field_tag :namespace_id, @namespace.id = hidden_field_tag :namespace_id, @namespace.id
= label_tag :file, _('GitLab project export'), class: 'label-light' = label_tag :file, _('GitLab project export'), class: 'label-bold'
.form-group .form-group
= file_field_tag :file, class: '' = file_field_tag :file, class: ''
.row .row
......
= form_tag upload_import_manifest_path, multipart: true do = form_tag upload_import_manifest_path, multipart: true do
.form-group .form-group
= label_tag :group_id, nil, class: 'label-light' do = label_tag :group_id, nil, class: 'label-bold' do
= _('Group') = _('Group')
.input-group .input-group
.input-group-prepend.has-tooltip{ title: root_url } .input-group-prepend.has-tooltip{ title: root_url }
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
= _('Choose the top-level group for your repository imports.') = _('Choose the top-level group for your repository imports.')
.form-group .form-group
= label_tag :manifest, class: 'label-light' do = label_tag :manifest, class: 'label-bold' do
= _('Manifest') = _('Manifest')
= file_field_tag :manifest, class: 'form-control-file', required: true = file_field_tag :manifest, class: 'form-control-file', required: true
.form-text.text-muted .form-text.text-muted
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
%p %p
Activate signin with one of the following services Activate signin with one of the following services
.col-lg-8 .col-lg-8
%label.label-light %label.label-bold
Connected Accounts Connected Accounts
%p Click on icon to activate signin with one of the following services %p Click on icon to activate signin with one of the following services
- button_based_providers.each do |provider| - button_based_providers.each do |provider|
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
Add email address Add email address
= form_for 'email', url: profile_emails_path do |f| = form_for 'email', url: profile_emails_path do |f|
.form-group .form-group
= f.label :email, class: 'label-light' = f.label :email, class: 'label-bold'
= f.text_field :email, class: 'form-control' = f.text_field :email, class: 'form-control'
.prepend-top-default .prepend-top-default
= f.submit 'Add email address', class: 'btn btn-create' = f.submit 'Add email address', class: 'btn btn-create'
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
= form_errors(@gpg_key) = form_errors(@gpg_key)
.form-group .form-group
= f.label :key, class: 'label-light' = f.label :key, class: 'label-bold'
= f.text_area :key, class: "form-control", rows: 8, required: true, placeholder: "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'." = f.text_area :key, class: "form-control", rows: 8, required: true, placeholder: "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
.prepend-top-default .prepend-top-default
......
...@@ -3,11 +3,11 @@ ...@@ -3,11 +3,11 @@
= form_errors(@key) = form_errors(@key)
.form-group .form-group
= f.label :key, class: 'label-light' = f.label :key, class: 'label-bold'
%p= _("Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key.") %p= _("Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key.")
= f.text_area :key, class: "form-control js-add-ssh-key-validation-input", rows: 8, required: true, placeholder: s_('Profiles|Typically starts with "ssh-rsa …"') = f.text_area :key, class: "form-control js-add-ssh-key-validation-input", rows: 8, required: true, placeholder: s_('Profiles|Typically starts with "ssh-rsa …"')
.form-group .form-group
= f.label :title, class: 'label-light' = f.label :title, class: 'label-bold'
= f.text_field :title, class: "form-control input-lg", required: true, placeholder: s_('Profiles|e.g. My MacBook key') = f.text_field :title, class: "form-control input-lg", required: true, placeholder: s_('Profiles|e.g. My MacBook key')
%p.form-text.text-muted= _('Name your individual key via a title') %p.form-text.text-muted= _('Name your individual key via a title')
......
...@@ -23,10 +23,10 @@ ...@@ -23,10 +23,10 @@
= form_for @user, url: profile_notifications_path, method: :put, html: { class: 'update-notifications prepend-top-default' } do |f| = form_for @user, url: profile_notifications_path, method: :put, html: { class: 'update-notifications prepend-top-default' } do |f|
.form-group .form-group
= f.label :notification_email, class: "label-light" = f.label :notification_email, class: "label-bold"
= f.select :notification_email, @user.all_emails, { include_blank: false }, class: "select2" = f.select :notification_email, @user.all_emails, { include_blank: false }, class: "select2"
= label_tag :global_notification_level, "Global notification level", class: "label-light" = label_tag :global_notification_level, "Global notification level", class: "label-bold"
%br %br
.clearfix .clearfix
.form-group.float-left.global-notification-setting .form-group.float-left.global-notification-setting
......
...@@ -18,15 +18,15 @@ ...@@ -18,15 +18,15 @@
- unless @user.password_automatically_set? - unless @user.password_automatically_set?
.form-group .form-group
= f.label :current_password, class: 'label-light' = f.label :current_password, class: 'label-bold'
= f.password_field :current_password, required: true, class: 'form-control' = f.password_field :current_password, required: true, class: 'form-control'
%p.form-text.text-muted %p.form-text.text-muted
You must provide your current password in order to change it. You must provide your current password in order to change it.
.form-group .form-group
= f.label :password, 'New password', class: 'label-light' = f.label :password, 'New password', class: 'label-bold'
= f.password_field :password, required: true, class: 'form-control' = f.password_field :password, required: true, class: 'form-control'
.form-group .form-group
= f.label :password_confirmation, class: 'label-light' = f.label :password_confirmation, class: 'label-bold'
= f.password_field :password_confirmation, required: true, class: 'form-control' = f.password_field :password_confirmation, required: true, class: 'form-control'
.prepend-top-default.append-bottom-default .prepend-top-default.append-bottom-default
= f.submit 'Save password', class: "btn btn-create append-right-10" = f.submit 'Save password', class: "btn btn-create append-right-10"
......
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
%p %p
It cannot be used to access any other data. It cannot be used to access any other data.
.col-lg-8.feed-token-reset .col-lg-8.feed-token-reset
= label_tag :feed_token, 'Feed token', class: "label-light" = label_tag :feed_token, 'Feed token', class: "label-bold"
= text_field_tag :feed_token, current_user.feed_token, class: 'form-control', readonly: true, onclick: 'this.select()' = text_field_tag :feed_token, current_user.feed_token, class: 'form-control', readonly: true, onclick: 'this.select()'
%p.form-text.text-muted %p.form-text.text-muted
Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you.
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
%p %p
It cannot be used to access any other data. It cannot be used to access any other data.
.col-lg-8.incoming-email-token-reset .col-lg-8.incoming-email-token-reset
= label_tag :incoming_email_token, 'Incoming email token', class: "label-light" = label_tag :incoming_email_token, 'Incoming email token', class: "label-bold"
= text_field_tag :incoming_email_token, current_user.incoming_email_token, class: 'form-control', readonly: true, onclick: 'this.select()' = text_field_tag :incoming_email_token, current_user.incoming_email_token, class: 'form-control', readonly: true, onclick: 'this.select()'
%p.form-text.text-muted %p.form-text.text-muted
Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. Keep this token secret. Anyone who gets ahold of it can create issues as if they were you.
......
...@@ -42,17 +42,17 @@ ...@@ -42,17 +42,17 @@
= link_to 'Learn more', help_page_path('user/profile/preferences', anchor: 'behavior'), target: '_blank' = link_to 'Learn more', help_page_path('user/profile/preferences', anchor: 'behavior'), target: '_blank'
.col-lg-8 .col-lg-8
.form-group .form-group
= f.label :layout, class: 'label-light' do = f.label :layout, class: 'label-bold' do
Layout width Layout width
= f.select :layout, layout_choices, {}, class: 'form-control' = f.select :layout, layout_choices, {}, class: 'form-control'
.form-text.text-muted .form-text.text-muted
Choose between fixed (max. 1200px) and fluid (100%) application layout. Choose between fixed (max. 1200px) and fluid (100%) application layout.
.form-group .form-group
= f.label :dashboard, class: 'label-light' do = f.label :dashboard, class: 'label-bold' do
Default dashboard Default dashboard
= f.select :dashboard, dashboard_choices, {}, class: 'form-control' = f.select :dashboard, dashboard_choices, {}, class: 'form-control'
.form-group .form-group
= f.label :project_view, class: 'label-light' do = f.label :project_view, class: 'label-bold' do
Project overview content Project overview content
= f.select :project_view, project_view_choices, {}, class: 'form-control' = f.select :project_view, project_view_choices, {}, class: 'form-control'
.form-text.text-muted .form-text.text-muted
......
...@@ -49,7 +49,7 @@ ...@@ -49,7 +49,7 @@
.alert.alert-danger .alert.alert-danger
= @error = @error
.form-group .form-group
= label_tag :pin_code, nil, class: "label-light" = label_tag :pin_code, nil, class: "label-bold"
= text_field_tag :pin_code, nil, class: "form-control", required: true = text_field_tag :pin_code, nil, class: "form-control", required: true
.prepend-top-default .prepend-top-default
= submit_tag 'Register with two-factor app', class: 'btn btn-success' = submit_tag 'Register with two-factor app', class: 'btn btn-success'
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
- project = local_assigns.fetch(:project) - project = local_assigns.fetch(:project)
.form-group .form-group
= label_tag :merge_method_merge, class: 'label-light' do = label_tag :merge_method_merge, class: 'label-bold' do
Merge method Merge method
.form-check .form-check
= form.radio_button :merge_method, :merge, class: "js-merge-method-radio form-check-input" = form.radio_button :merge_method, :merge, class: "js-merge-method-radio form-check-input"
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
.row{ id: project_name_id } .row{ id: project_name_id }
= f.hidden_field :ci_cd_only, value: ci_cd_only = f.hidden_field :ci_cd_only, value: ci_cd_only
.form-group.project-path.col-sm-6 .form-group.project-path.col-sm-6
= f.label :namespace_id, class: 'label-light' do = f.label :namespace_id, class: 'label-bold' do
%span %span
Project path Project path
.input-group .input-group
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#{user_url(current_user.username)}/ #{user_url(current_user.username)}/
= f.hidden_field :namespace_id, value: current_user.namespace_id = f.hidden_field :namespace_id, value: current_user.namespace_id
.form-group.project-path.col-sm-6 .form-group.project-path.col-sm-6
= f.label :path, class: 'label-light' do = f.label :path, class: 'label-bold' do
%span %span
Project name Project name
= f.text_field :path, placeholder: "my-awesome-project", class: "form-control", tabindex: 2, autofocus: true, required: true = f.text_field :path, placeholder: "my-awesome-project", class: "form-control", tabindex: 2, autofocus: true, required: true
...@@ -30,12 +30,12 @@ ...@@ -30,12 +30,12 @@
= link_to "Create a group", new_group_path = link_to "Create a group", new_group_path
.form-group .form-group
= f.label :description, class: 'label-light' do = f.label :description, class: 'label-bold' do
Project description Project description
%span (optional) %span (optional)
= f.text_area :description, placeholder: 'Description format', class: "form-control", rows: 3, maxlength: 250 = f.text_area :description, placeholder: 'Description format', class: "form-control", rows: 3, maxlength: 250
= f.label :visibility_level, class: 'label-light' do = f.label :visibility_level, class: 'label-bold' do
Visibility Level Visibility Level
= link_to icon('question-circle'), help_page_path("public_access/public_access"), aria: { label: 'Documentation for Visibility Level' }, target: '_blank', rel: 'noopener noreferrer' = link_to icon('question-circle'), help_page_path("public_access/public_access"), aria: { label: 'Documentation for Visibility Level' }, target: '_blank', rel: 'noopener noreferrer'
= render 'shared/visibility_level', f: f, visibility_level: visibility_level.to_i, can_change_visibility_level: true, form_model: @project, with_label: false = render 'shared/visibility_level', f: f, visibility_level: visibility_level.to_i, can_change_visibility_level: true, form_model: @project, with_label: false
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
.project-fields-form .project-fields-form
.row .row
.form-group.col-sm-12 .form-group.col-sm-12
%label.label-light %label.label-bold
Template Template
.input-group.template-input-group .input-group.template-input-group
.input-group-prepend .input-group-prepend
......
...@@ -27,6 +27,6 @@ ...@@ -27,6 +27,6 @@
.btn-group{ role: "group" }< .btn-group{ role: "group" }<
= copy_blob_source_button(blob) = copy_blob_source_button(blob)
= open_raw_blob_button(blob) = download_blob_button(blob)
= render 'projects/blob/content', blob: blob = render 'projects/blob/content', blob: blob
...@@ -8,8 +8,8 @@ ...@@ -8,8 +8,8 @@
.btn-group{ role: "group" }< .btn-group{ role: "group" }<
= copy_blob_source_button(blob) unless blame = copy_blob_source_button(blob) unless blame
= open_raw_blob_button(blob) = open_raw_blob_button(blob)
= download_blob_button(blob)
= view_on_environment_button(@commit.sha, @path, @environment) if @environment = view_on_environment_button(@commit.sha, @path, @environment) if @environment
.btn-group{ role: "group" }< .btn-group{ role: "group" }<
= render_if_exists 'projects/blob/header_file_locks_link' = render_if_exists 'projects/blob/header_file_locks_link'
= edit_blob_button = edit_blob_button
......
...@@ -15,15 +15,15 @@ ...@@ -15,15 +15,15 @@
= form_for @gcp_cluster, html: { class: 'js-gke-cluster-creation prepend-top-20', data: { token: token_in_session } }, url: create_gcp_namespace_project_clusters_path(@project.namespace, @project), as: :cluster do |field| = form_for @gcp_cluster, html: { class: 'js-gke-cluster-creation prepend-top-20', data: { token: token_in_session } }, url: create_gcp_namespace_project_clusters_path(@project.namespace, @project), as: :cluster do |field|
= form_errors(@gcp_cluster) = form_errors(@gcp_cluster)
.form-group .form-group
= field.label :name, s_('ClusterIntegration|Kubernetes cluster name'), class: 'label-light' = field.label :name, s_('ClusterIntegration|Kubernetes cluster name'), class: 'label-bold'
= field.text_field :name, class: 'form-control', placeholder: s_('ClusterIntegration|Kubernetes cluster name') = field.text_field :name, class: 'form-control', placeholder: s_('ClusterIntegration|Kubernetes cluster name')
.form-group .form-group
= field.label :environment_scope, s_('ClusterIntegration|Environment scope'), class: 'label-light' = field.label :environment_scope, s_('ClusterIntegration|Environment scope'), class: 'label-bold'
= field.text_field :environment_scope, class: 'form-control', readonly: !has_multiple_clusters?(@project), placeholder: s_('ClusterIntegration|Environment scope') = field.text_field :environment_scope, class: 'form-control', readonly: !has_multiple_clusters?(@project), placeholder: s_('ClusterIntegration|Environment scope')
= field.fields_for :provider_gcp, @gcp_cluster.provider_gcp do |provider_gcp_field| = field.fields_for :provider_gcp, @gcp_cluster.provider_gcp do |provider_gcp_field|
.form-group .form-group
= provider_gcp_field.label :gcp_project_id, s_('ClusterIntegration|Google Cloud Platform project'), class: 'label-light' = provider_gcp_field.label :gcp_project_id, s_('ClusterIntegration|Google Cloud Platform project'), class: 'label-bold'
.js-gcp-project-id-dropdown-entry-point{ data: { docsUrl: 'https://console.cloud.google.com/home/dashboard' } } .js-gcp-project-id-dropdown-entry-point{ data: { docsUrl: 'https://console.cloud.google.com/home/dashboard' } }
= provider_gcp_field.hidden_field :gcp_project_id = provider_gcp_field.hidden_field :gcp_project_id
.dropdown .dropdown
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
%span.form-text.text-muted &nbsp; %span.form-text.text-muted &nbsp;
.form-group .form-group
= provider_gcp_field.label :zone, s_('ClusterIntegration|Zone'), class: 'label-light' = provider_gcp_field.label :zone, s_('ClusterIntegration|Zone'), class: 'label-bold'
.js-gcp-zone-dropdown-entry-point .js-gcp-zone-dropdown-entry-point
= provider_gcp_field.hidden_field :zone = provider_gcp_field.hidden_field :zone
.dropdown .dropdown
...@@ -46,11 +46,11 @@ ...@@ -46,11 +46,11 @@
= s_('ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}.').html_safe % { help_link_start: help_link_start % { url: zones_link_url }, help_link_end: help_link_end } = s_('ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}.').html_safe % { help_link_start: help_link_start % { url: zones_link_url }, help_link_end: help_link_end }
.form-group .form-group
= provider_gcp_field.label :num_nodes, s_('ClusterIntegration|Number of nodes'), class: 'label-light' = provider_gcp_field.label :num_nodes, s_('ClusterIntegration|Number of nodes'), class: 'label-bold'
= provider_gcp_field.text_field :num_nodes, class: 'form-control', placeholder: '3' = provider_gcp_field.text_field :num_nodes, class: 'form-control', placeholder: '3'
.form-group .form-group
= provider_gcp_field.label :machine_type, s_('ClusterIntegration|Machine type'), class: 'label-light' = provider_gcp_field.label :machine_type, s_('ClusterIntegration|Machine type'), class: 'label-bold'
.js-gcp-machine-type-dropdown-entry-point .js-gcp-machine-type-dropdown-entry-point
= provider_gcp_field.hidden_field :machine_type = provider_gcp_field.hidden_field :machine_type
.dropdown .dropdown
......
= form_for @user_cluster, url: create_user_namespace_project_clusters_path(@project.namespace, @project), as: :cluster do |field| = form_for @user_cluster, url: create_user_namespace_project_clusters_path(@project.namespace, @project), as: :cluster do |field|
= form_errors(@user_cluster) = form_errors(@user_cluster)
.form-group .form-group
= field.label :name, s_('ClusterIntegration|Kubernetes cluster name'), class: 'label-light' = field.label :name, s_('ClusterIntegration|Kubernetes cluster name'), class: 'label-bold'
= field.text_field :name, class: 'form-control', placeholder: s_('ClusterIntegration|Kubernetes cluster name') = field.text_field :name, class: 'form-control', placeholder: s_('ClusterIntegration|Kubernetes cluster name')
- if has_multiple_clusters?(@project) - if has_multiple_clusters?(@project)
.form-group .form-group
= field.label :environment_scope, s_('ClusterIntegration|Environment scope'), class: 'label-light' = field.label :environment_scope, s_('ClusterIntegration|Environment scope'), class: 'label-bold'
= field.text_field :environment_scope, class: 'form-control', placeholder: s_('ClusterIntegration|Environment scope') = field.text_field :environment_scope, class: 'form-control', placeholder: s_('ClusterIntegration|Environment scope')
= field.fields_for :platform_kubernetes, @user_cluster.platform_kubernetes do |platform_kubernetes_field| = field.fields_for :platform_kubernetes, @user_cluster.platform_kubernetes do |platform_kubernetes_field|
.form-group .form-group
= platform_kubernetes_field.label :api_url, s_('ClusterIntegration|API URL'), class: 'label-light' = platform_kubernetes_field.label :api_url, s_('ClusterIntegration|API URL'), class: 'label-bold'
= platform_kubernetes_field.text_field :api_url, class: 'form-control', placeholder: s_('ClusterIntegration|API URL') = platform_kubernetes_field.text_field :api_url, class: 'form-control', placeholder: s_('ClusterIntegration|API URL')
.form-group .form-group
= platform_kubernetes_field.label :ca_cert, s_('ClusterIntegration|CA Certificate'), class: 'label-light' = platform_kubernetes_field.label :ca_cert, s_('ClusterIntegration|CA Certificate'), class: 'label-bold'
= platform_kubernetes_field.text_area :ca_cert, class: 'form-control', placeholder: s_('ClusterIntegration|Certificate Authority bundle (PEM format)') = platform_kubernetes_field.text_area :ca_cert, class: 'form-control', placeholder: s_('ClusterIntegration|Certificate Authority bundle (PEM format)')
.form-group .form-group
= platform_kubernetes_field.label :token, s_('ClusterIntegration|Token'), class: 'label-light' = platform_kubernetes_field.label :token, s_('ClusterIntegration|Token'), class: 'label-bold'
= platform_kubernetes_field.text_field :token, class: 'form-control', placeholder: s_('ClusterIntegration|Service token'), autocomplete: 'off' = platform_kubernetes_field.text_field :token, class: 'form-control', placeholder: s_('ClusterIntegration|Service token'), autocomplete: 'off'
.form-group .form-group
= platform_kubernetes_field.label :namespace, s_('ClusterIntegration|Project namespace (optional, unique)'), class: 'label-light' = platform_kubernetes_field.label :namespace, s_('ClusterIntegration|Project namespace (optional, unique)'), class: 'label-bold'
= platform_kubernetes_field.text_field :namespace, class: 'form-control', placeholder: s_('ClusterIntegration|Project namespace') = platform_kubernetes_field.text_field :namespace, class: 'form-control', placeholder: s_('ClusterIntegration|Project namespace')
.form-group .form-group
......
= form_for @cluster, url: namespace_project_cluster_path(@project.namespace, @project, @cluster), as: :cluster do |field| = form_for @cluster, url: namespace_project_cluster_path(@project.namespace, @project, @cluster), as: :cluster do |field|
= form_errors(@cluster) = form_errors(@cluster)
.form-group .form-group
= field.label :name, s_('ClusterIntegration|Kubernetes cluster name'), class: 'label-light' = field.label :name, s_('ClusterIntegration|Kubernetes cluster name'), class: 'label-bold'
= field.text_field :name, class: 'form-control', placeholder: s_('ClusterIntegration|Kubernetes cluster name') = field.text_field :name, class: 'form-control', placeholder: s_('ClusterIntegration|Kubernetes cluster name')
= field.fields_for :platform_kubernetes, @cluster.platform_kubernetes do |platform_kubernetes_field| = field.fields_for :platform_kubernetes, @cluster.platform_kubernetes do |platform_kubernetes_field|
.form-group .form-group
= platform_kubernetes_field.label :api_url, s_('ClusterIntegration|API URL'), class: 'label-light' = platform_kubernetes_field.label :api_url, s_('ClusterIntegration|API URL'), class: 'label-bold'
= platform_kubernetes_field.text_field :api_url, class: 'form-control', placeholder: s_('ClusterIntegration|API URL') = platform_kubernetes_field.text_field :api_url, class: 'form-control', placeholder: s_('ClusterIntegration|API URL')
.form-group .form-group
= platform_kubernetes_field.label :ca_cert, s_('ClusterIntegration|CA Certificate'), class: 'label-light' = platform_kubernetes_field.label :ca_cert, s_('ClusterIntegration|CA Certificate'), class: 'label-bold'
= platform_kubernetes_field.text_area :ca_cert, class: 'form-control', placeholder: s_('ClusterIntegration|Certificate Authority bundle (PEM format)') = platform_kubernetes_field.text_area :ca_cert, class: 'form-control', placeholder: s_('ClusterIntegration|Certificate Authority bundle (PEM format)')
.form-group .form-group
= platform_kubernetes_field.label :token, s_('ClusterIntegration|Token'), class: 'label-light' = platform_kubernetes_field.label :token, s_('ClusterIntegration|Token'), class: 'label-bold'
.input-group .input-group
= platform_kubernetes_field.text_field :token, class: 'form-control js-cluster-token', type: 'password', placeholder: s_('ClusterIntegration|Token'), autocomplete: 'off' = platform_kubernetes_field.text_field :token, class: 'form-control js-cluster-token', type: 'password', placeholder: s_('ClusterIntegration|Token'), autocomplete: 'off'
%span.input-group-append.clipboard-addon %span.input-group-append.clipboard-addon
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
= s_('ClusterIntegration|Show') = s_('ClusterIntegration|Show')
.form-group .form-group
= platform_kubernetes_field.label :namespace, s_('ClusterIntegration|Project namespace (optional, unique)'), class: 'label-light' = platform_kubernetes_field.label :namespace, s_('ClusterIntegration|Project namespace (optional, unique)'), class: 'label-bold'
= platform_kubernetes_field.text_field :namespace, class: 'form-control', placeholder: s_('ClusterIntegration|Project namespace') = platform_kubernetes_field.text_field :namespace, class: 'form-control', placeholder: s_('ClusterIntegration|Project namespace')
.form-group .form-group
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
%p= description %p= description
= form_tag [type.underscore, @project.namespace.becomes(Namespace), @project, commit], method: :post, remote: false, class: "js-#{type}-form js-requires-input" do = form_tag [type.underscore, @project.namespace.becomes(Namespace), @project, commit], method: :post, remote: false, class: "js-#{type}-form js-requires-input" do
.form-group.branch .form-group.branch
= label_tag 'start_branch', branch_label, class: 'label-light' = label_tag 'start_branch', branch_label, class: 'label-bold'
= hidden_field_tag :start_branch, @project.default_branch, id: 'start_branch' = hidden_field_tag :start_branch, @project.default_branch, id: 'start_branch'
= dropdown_tag(@project.default_branch, options: { title: s_("BranchSwitcherTitle|Switch branch"), filter: true, placeholder: s_("BranchSwitcherPlaceholder|Search branches"), toggle_class: 'js-project-refs-dropdown dynamic', dropdown_class: 'dropdown-menu-selectable', data: { field_name: "start_branch", selected: @project.default_branch, start_branch: @project.default_branch, refs_url: project_branches_path(@project), submit_form_on_click: false } }) = dropdown_tag(@project.default_branch, options: { title: s_("BranchSwitcherTitle|Switch branch"), filter: true, placeholder: s_("BranchSwitcherPlaceholder|Search branches"), toggle_class: 'js-project-refs-dropdown dynamic', dropdown_class: 'dropdown-menu-selectable', data: { field_name: "start_branch", selected: @project.default_branch, start_branch: @project.default_branch, refs_url: project_branches_path(@project), submit_form_on_click: false } })
......
= form_for [@project.namespace.becomes(Namespace), @project, @deploy_keys.new_key], url: namespace_project_deploy_keys_path, html: { class: "js-requires-input container" } do |f| = form_for [@project.namespace.becomes(Namespace), @project, @deploy_keys.new_key], url: namespace_project_deploy_keys_path, html: { class: "js-requires-input container" } do |f|
= form_errors(@deploy_keys.new_key) = form_errors(@deploy_keys.new_key)
.form-group.row .form-group.row
= f.label :title, class: "label-light" = f.label :title, class: "label-bold"
= f.text_field :title, class: 'form-control', required: true = f.text_field :title, class: 'form-control', required: true
.form-group.row .form-group.row
= f.label :key, class: "label-light" = f.label :key, class: "label-bold"
= f.text_area :key, class: "form-control", rows: 5, required: true = f.text_area :key, class: "form-control", rows: 5, required: true
.form-group.row .form-group.row
%p.light.append-bottom-0 %p.light.append-bottom-0
......
...@@ -5,24 +5,24 @@ ...@@ -5,24 +5,24 @@
= form_errors(token) = form_errors(token)
.form-group .form-group
= f.label :name, class: 'label-light' = f.label :name, class: 'label-bold'
= f.text_field :name, class: 'form-control', required: true = f.text_field :name, class: 'form-control', required: true
.form-group .form-group
= f.label :expires_at, class: 'label-light' = f.label :expires_at, class: 'label-bold'
= f.text_field :expires_at, class: 'datepicker form-control', value: f.object.expires_at = f.text_field :expires_at, class: 'datepicker form-control', value: f.object.expires_at
.form-group .form-group
= f.label :scopes, class: 'label-light' = f.label :scopes, class: 'label-bold'
%fieldset.form-group.form-check %fieldset.form-group.form-check
= f.check_box :read_repository, class: 'form-check-input' = f.check_box :read_repository, class: 'form-check-input'
= label_tag ("deploy_token_read_repository"), 'read_repository', class: 'label-light form-check-label' = label_tag ("deploy_token_read_repository"), 'read_repository', class: 'label-bold form-check-label'
.text-secondary= s_('DeployTokens|Allows read-only access to the repository') .text-secondary= s_('DeployTokens|Allows read-only access to the repository')
- if container_registry_enabled?(project) - if container_registry_enabled?(project)
%fieldset.form-group.form-check %fieldset.form-group.form-check
= f.check_box :read_registry, class: 'form-check-input' = f.check_box :read_registry, class: 'form-check-input'
= label_tag ("deploy_token_read_registry"), 'read_registry', class: 'label-light form-check-label' = label_tag ("deploy_token_read_registry"), 'read_registry', class: 'label-bold form-check-label'
.text-secondary= s_('DeployTokens|Allows read-only access to the registry images') .text-secondary= s_('DeployTokens|Allows read-only access to the registry images')
.prepend-top-default .prepend-top-default
......
...@@ -18,17 +18,17 @@ ...@@ -18,17 +18,17 @@
%fieldset %fieldset
.row .row
.form-group.col-md-9 .form-group.col-md-9
= f.label :name, class: 'label-light', for: 'project_name_edit' do = f.label :name, class: 'label-bold', for: 'project_name_edit' do
Project name Project name
= f.text_field :name, class: "form-control", id: "project_name_edit" = f.text_field :name, class: "form-control", id: "project_name_edit"
.form-group.col-md-3 .form-group.col-md-3
= f.label :id, class: 'label-light' do = f.label :id, class: 'label-bold' do
Project ID Project ID
= f.text_field :id, class: 'form-control', readonly: true = f.text_field :id, class: 'form-control', readonly: true
.form-group .form-group
= f.label :description, class: 'label-light' do = f.label :description, class: 'label-bold' do
Project description Project description
%span.light (optional) %span.light (optional)
= f.text_area :description, class: "form-control", rows: 3, maxlength: 250 = f.text_area :description, class: "form-control", rows: 3, maxlength: 250
...@@ -37,13 +37,13 @@ ...@@ -37,13 +37,13 @@
- unless @project.empty_repo? - unless @project.empty_repo?
.form-group .form-group
= f.label :default_branch, "Default Branch", class: 'label-light' = f.label :default_branch, "Default Branch", class: 'label-bold'
= f.select(:default_branch, @project.repository.branch_names, {}, {class: 'select2 select-wide'}) = f.select(:default_branch, @project.repository.branch_names, {}, {class: 'select2 select-wide'})
= render_if_exists 'shared/repository_size_limit_setting', form: f, type: :project = render_if_exists 'shared/repository_size_limit_setting', form: f, type: :project
.form-group .form-group
= f.label :tag_list, "Tags", class: 'label-light' = f.label :tag_list, "Tags", class: 'label-bold'
= f.text_field :tag_list, value: @project.tag_list.sort.join(', '), maxlength: 2000, class: "form-control" = f.text_field :tag_list, value: @project.tag_list.sort.join(', '), maxlength: 2000, class: "form-control"
%p.form-text.text-muted Separate tags with commas. %p.form-text.text-muted Separate tags with commas.
%fieldset.features %fieldset.features
...@@ -144,12 +144,12 @@ ...@@ -144,12 +144,12 @@
= render 'projects/errors' = render 'projects/errors'
= form_for([@project.namespace.becomes(Namespace), @project]) do |f| = form_for([@project.namespace.becomes(Namespace), @project]) do |f|
.form-group.project_name_holder .form-group.project_name_holder
= f.label :name, class: 'label-light' do = f.label :name, class: 'label-bold' do
Project name Project name
.form-group .form-group
= f.text_field :name, class: "form-control" = f.text_field :name, class: "form-control"
.form-group .form-group
= f.label :path, class: 'label-light' do = f.label :path, class: 'label-bold' do
%span Path %span Path
.form-group .form-group
.input-group .input-group
...@@ -169,7 +169,7 @@ ...@@ -169,7 +169,7 @@
Transfer project Transfer project
= form_for([@project.namespace.becomes(Namespace), @project], url: transfer_project_path(@project), method: :put, remote: true, html: { class: 'js-project-transfer-form' } ) do |f| = form_for([@project.namespace.becomes(Namespace), @project], url: transfer_project_path(@project), method: :put, remote: true, html: { class: 'js-project-transfer-form' } ) do |f|
.form-group .form-group
= label_tag :new_namespace_id, nil, class: 'label-light' do = label_tag :new_namespace_id, nil, class: 'label-bold' do
%span Select a new namespace %span Select a new namespace
.form-group .form-group
= select_tag :new_namespace_id, namespaces_options(nil), include_blank: true, class: 'select2' = select_tag :new_namespace_id, namespaces_options(nil), include_blank: true, class: 'select2'
......
...@@ -11,10 +11,10 @@ ...@@ -11,10 +11,10 @@
= form_errors(@environment) = form_errors(@environment)
.form-group .form-group
= f.label :name, 'Name', class: 'label-light' = f.label :name, 'Name', class: 'label-bold'
= f.text_field :name, required: true, class: 'form-control' = f.text_field :name, required: true, class: 'form-control'
.form-group .form-group
= f.label :external_url, 'External URL', class: 'label-light' = f.label :external_url, 'External URL', class: 'label-bold'
= f.url_field :external_url, class: 'form-control' = f.url_field :external_url, class: 'form-control'
.form-actions .form-actions
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
.resolve-info .resolve-info
= translation.html_safe = translation.html_safe
.col-md-8 .col-md-8
%label.label-light{ "for" => "commit-message" } %label.label-bold{ "for" => "commit-message" }
#{ _('Commit message') } #{ _('Commit message') }
.commit-message-container .commit-message-container
.max-width-marker .max-width-marker
......
...@@ -32,11 +32,11 @@ ...@@ -32,11 +32,11 @@
.form-group .form-group
= rm_form.check_box :enabled, class: "float-left" = rm_form.check_box :enabled, class: "float-left"
.prepend-left-20 .prepend-left-20
= rm_form.label :enabled, "Remote mirror repository", class: "label-light append-bottom-0" = rm_form.label :enabled, "Remote mirror repository", class: "label-bold append-bottom-0"
%p.light.append-bottom-0 %p.light.append-bottom-0
Automatically update the remote mirror's branches, tags, and commits from this repository every time someone pushes to it. Automatically update the remote mirror's branches, tags, and commits from this repository every time someone pushes to it.
.form-group.has-feedback .form-group.has-feedback
= rm_form.label :url, "Git repository URL", class: "label-light" = rm_form.label :url, "Git repository URL", class: "label-bold"
= rm_form.text_field :url, class: "form-control", placeholder: 'https://username:password@gitlab.company.com/group/project.git' = rm_form.text_field :url, class: "form-control", placeholder: 'https://username:password@gitlab.company.com/group/project.git'
= render "projects/mirrors/instructions" = render "projects/mirrors/instructions"
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
.form-group .form-group
= rm_form.check_box :only_protected_branches, class: 'float-left' = rm_form.check_box :only_protected_branches, class: 'float-left'
.prepend-left-20 .prepend-left-20
= rm_form.label :only_protected_branches, class: 'label-light' = rm_form.label :only_protected_branches, class: 'label-bold'
= link_to icon('question-circle'), help_page_path('user/project/protected_branches') = link_to icon('question-circle'), help_page_path('user/project/protected_branches')
= f.submit 'Save changes', class: 'btn btn-create', name: 'update_remote_mirror' = f.submit 'Save changes', class: 'btn btn-create', name: 'update_remote_mirror'
...@@ -2,25 +2,25 @@ ...@@ -2,25 +2,25 @@
= form_errors(@schedule) = form_errors(@schedule)
.form-group.row .form-group.row
.col-md-9 .col-md-9
= f.label :description, _('Description'), class: 'label-light' = f.label :description, _('Description'), class: 'label-bold'
= f.text_field :description, class: 'form-control', required: true, autofocus: true, placeholder: s_('PipelineSchedules|Provide a short description for this pipeline') = f.text_field :description, class: 'form-control', required: true, autofocus: true, placeholder: s_('PipelineSchedules|Provide a short description for this pipeline')
.form-group.row .form-group.row
.col-md-9 .col-md-9
= f.label :cron, _('Interval Pattern'), class: 'label-light' = f.label :cron, _('Interval Pattern'), class: 'label-bold'
#interval-pattern-input{ data: { initial_interval: @schedule.cron } } #interval-pattern-input{ data: { initial_interval: @schedule.cron } }
.form-group.row .form-group.row
.col-md-9 .col-md-9
= f.label :cron_timezone, _('Cron Timezone'), class: 'label-light' = f.label :cron_timezone, _('Cron Timezone'), class: 'label-bold'
= dropdown_tag(_("Select a timezone"), options: { toggle_class: 'btn js-timezone-dropdown', title: _("Select a timezone"), filter: true, placeholder: s_("OfSearchInADropdown|Filter"), data: { data: timezone_data } } ) = dropdown_tag(_("Select a timezone"), options: { toggle_class: 'btn js-timezone-dropdown', title: _("Select a timezone"), filter: true, placeholder: s_("OfSearchInADropdown|Filter"), data: { data: timezone_data } } )
= f.text_field :cron_timezone, value: @schedule.cron_timezone, id: 'schedule_cron_timezone', class: 'hidden', name: 'schedule[cron_timezone]', required: true = f.text_field :cron_timezone, value: @schedule.cron_timezone, id: 'schedule_cron_timezone', class: 'hidden', name: 'schedule[cron_timezone]', required: true
.form-group.row .form-group.row
.col-md-9 .col-md-9
= f.label :ref, _('Target Branch'), class: 'label-light' = f.label :ref, _('Target Branch'), class: 'label-bold'
= dropdown_tag(_("Select target branch"), options: { toggle_class: 'btn js-target-branch-dropdown', dropdown_class: 'git-revision-dropdown', title: _("Select target branch"), filter: true, placeholder: s_("OfSearchInADropdown|Filter"), data: { data: @project.repository.branch_names, default_branch: @project.default_branch } } ) = dropdown_tag(_("Select target branch"), options: { toggle_class: 'btn js-target-branch-dropdown', dropdown_class: 'git-revision-dropdown', title: _("Select target branch"), filter: true, placeholder: s_("OfSearchInADropdown|Filter"), data: { data: @project.repository.branch_names, default_branch: @project.default_branch } } )
= f.text_field :ref, value: @schedule.ref, id: 'schedule_ref', class: 'hidden', name: 'schedule[ref]', required: true = f.text_field :ref, value: @schedule.ref, id: 'schedule_ref', class: 'hidden', name: 'schedule[ref]', required: true
.form-group.row.js-ci-variable-list-section .form-group.row.js-ci-variable-list-section
.col-md-9 .col-md-9
%label.label-light %label.label-bold
#{ s_('PipelineSchedules|Variables') } #{ s_('PipelineSchedules|Variables') }
%ul.ci-variable-list %ul.ci-variable-list
- @schedule.variables.each do |variable| - @schedule.variables.each do |variable|
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
= n_('Reveal value', 'Reveal values', @schedule.variables.size) = n_('Reveal value', 'Reveal values', @schedule.variables.size)
.form-group.row .form-group.row
.col-md-9 .col-md-9
= f.label :active, s_('PipelineSchedules|Activated'), class: 'label-light' = f.label :active, s_('PipelineSchedules|Activated'), class: 'label-bold'
%div %div
= f.check_box :active, required: false, value: @schedule.active? = f.check_box :active, required: false, value: @schedule.active?
= _('Active') = _('Active')
......
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
.col-sm-12 .col-sm-12
= form_for @project_member, as: :project_member, url: project_project_members_path(@project), html: { class: 'users-project-form' } do |f| = form_for @project_member, as: :project_member, url: project_project_members_path(@project), html: { class: 'users-project-form' } do |f|
.form-group .form-group
= label_tag :user_ids, "Select members to invite", class: "label-light" = label_tag :user_ids, "Select members to invite", class: "label-bold"
= users_select_tag(:user_ids, multiple: true, class: "input-clamp", scope: :all, email_user: true, placeholder: "Search for members to update or invite") = users_select_tag(:user_ids, multiple: true, class: "input-clamp", scope: :all, email_user: true, placeholder: "Search for members to update or invite")
.form-group .form-group
= label_tag :access_level, "Choose a role permission", class: "label-light" = label_tag :access_level, "Choose a role permission", class: "label-bold"
.select-wrapper .select-wrapper
= select_tag :access_level, options_for_select(ProjectMember.access_level_roles, @project_member.access_level), class: "form-control project-access-select select-control" = select_tag :access_level, options_for_select(ProjectMember.access_level_roles, @project_member.access_level), class: "form-control project-access-select select-control"
= icon('chevron-down') = icon('chevron-down')
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
about role permissions about role permissions
.form-group .form-group
.clearable-input .clearable-input
= label_tag :expires_at, 'Access expiration date', class: 'label-light' = label_tag :expires_at, 'Access expiration date', class: 'label-bold'
= text_field_tag :expires_at, nil, class: 'form-control js-access-expiration-date', placeholder: 'Expiration date' = text_field_tag :expires_at, nil, class: 'form-control js-access-expiration-date', placeholder: 'Expiration date'
%i.clear-icon.js-clear-input %i.clear-icon.js-clear-input
= f.submit "Add to project", class: "btn btn-create" = f.submit "Add to project", class: "btn btn-create"
......
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
.col-sm-12 .col-sm-12
= form_tag project_group_links_path(@project), class: 'js-requires-input', method: :post do = form_tag project_group_links_path(@project), class: 'js-requires-input', method: :post do
.form-group .form-group
= label_tag :link_group_id, "Select a group to share with", class: "label-light" = label_tag :link_group_id, "Select a group to share with", class: "label-bold"
= groups_select_tag(:link_group_id, data: { skip_groups: @skip_groups }, class: "input-clamp", required: true) = groups_select_tag(:link_group_id, data: { skip_groups: @skip_groups }, class: "input-clamp", required: true)
.form-group .form-group
= label_tag :link_group_access, "Max access level", class: "label-light" = label_tag :link_group_access, "Max access level", class: "label-bold"
.select-wrapper .select-wrapper
= select_tag :link_group_access, options_for_select(ProjectGroupLink.access_options, ProjectGroupLink.default_access), class: "form-control select-control" = select_tag :link_group_access, options_for_select(ProjectGroupLink.access_options, ProjectGroupLink.default_access), class: "form-control select-control"
= icon('chevron-down') = icon('chevron-down')
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
= link_to "Read more", help_page_path("user/permissions"), class: "vlink" = link_to "Read more", help_page_path("user/permissions"), class: "vlink"
about role permissions about role permissions
.form-group .form-group
= label_tag :expires_at, 'Access expiration date', class: 'label-light' = label_tag :expires_at, 'Access expiration date', class: 'label-bold'
.clearable-input .clearable-input
= text_field_tag :expires_at, nil, class: 'form-control js-access-expiration-date-groups', placeholder: 'Expiration date', id: 'expires_at_groups' = text_field_tag :expires_at, nil, class: 'form-control js-access-expiration-date-groups', placeholder: 'Expiration date', id: 'expires_at_groups'
%i.clear-icon.js-clear-input %i.clear-icon.js-clear-input
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
= form_errors(@project) = form_errors(@project)
%fieldset.builds-feature %fieldset.builds-feature
.form-group.append-bottom-default.js-secret-runner-token .form-group.append-bottom-default.js-secret-runner-token
= f.label :runners_token, _("Runner token"), class: 'label-light' = f.label :runners_token, _("Runner token"), class: 'label-bold'
.form-control.js-secret-value-placeholder .form-control.js-secret-value-placeholder
= '*' * 20 = '*' * 20
= f.text_field :runners_token, class: "form-control hide js-secret-value", placeholder: 'xEeFCaDAB89' = f.text_field :runners_token, class: "form-control hide js-secret-value", placeholder: 'xEeFCaDAB89'
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
%hr %hr
.form-group .form-group
= f.label :build_timeout_human_readable, _('Timeout'), class: 'label-light' = f.label :build_timeout_human_readable, _('Timeout'), class: 'label-bold'
= f.text_field :build_timeout_human_readable, class: 'form-control' = f.text_field :build_timeout_human_readable, class: 'form-control'
%p.form-text.text-muted %p.form-text.text-muted
= _("Per job. If a job passes this threshold, it will be marked as failed") = _("Per job. If a job passes this threshold, it will be marked as failed")
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
%hr %hr
.form-group .form-group
= f.label :ci_config_path, _('Custom CI config path'), class: 'label-light' = f.label :ci_config_path, _('Custom CI config path'), class: 'label-bold'
= f.text_field :ci_config_path, class: 'form-control', placeholder: '.gitlab-ci.yml' = f.text_field :ci_config_path, class: 'form-control', placeholder: '.gitlab-ci.yml'
%p.form-text.text-muted %p.form-text.text-muted
= _("The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>") = _("The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>")
...@@ -83,7 +83,7 @@ ...@@ -83,7 +83,7 @@
%hr %hr
.form-group .form-group
= f.label :build_coverage_regex, _("Test coverage parsing"), class: 'label-light' = f.label :build_coverage_regex, _("Test coverage parsing"), class: 'label-bold'
.input-group .input-group
%span.input-group-prepend %span.input-group-prepend
.input-group-text / .input-group-text /
......
...@@ -3,9 +3,9 @@ ...@@ -3,9 +3,9 @@
- if @trigger.token - if @trigger.token
.form-group .form-group
%label.label-light Token %label.label-bold Token
%p.form-control-plaintext= @trigger.token %p.form-control-plaintext= @trigger.token
.form-group .form-group
= f.label :key, "Description", class: "label-light" = f.label :key, "Description", class: "label-bold"
= f.text_field :description, class: "form-control", required: true, title: 'Trigger description is required.', placeholder: "Trigger description" = f.text_field :description, class: "form-control", required: true, title: 'Trigger description is required.', placeholder: "Trigger description"
= f.submit btn_text, class: "btn btn-save" = f.submit btn_text, class: "btn btn-save"
- ci_cd_only = local_assigns.fetch(:ci_cd_only, false) - ci_cd_only = local_assigns.fetch(:ci_cd_only, false)
.form-group.import-url-data .form-group.import-url-data
= f.label :import_url, class: 'label-light' do = f.label :import_url, class: 'label-bold' do
%span %span
= _('Git repository URL') = _('Git repository URL')
......
...@@ -11,18 +11,18 @@ ...@@ -11,18 +11,18 @@
.row .row
.form-group.col-md-6 .form-group.col-md-6
= f.label :name, class: 'label-light' = f.label :name, class: 'label-bold'
= f.text_field :name, class: "form-control", required: true = f.text_field :name, class: "form-control", required: true
.row .row
.form-group.col-md-6 .form-group.col-md-6
= f.label :expires_at, class: 'label-light' = f.label :expires_at, class: 'label-bold'
.input-icon-wrapper .input-icon-wrapper
= f.text_field :expires_at, class: "datepicker form-control", placeholder: 'YYYY-MM-DD' = f.text_field :expires_at, class: "datepicker form-control", placeholder: 'YYYY-MM-DD'
= icon('calendar', { class: 'input-icon-right' }) = icon('calendar', { class: 'input-icon-right' })
.form-group .form-group
= f.label :scopes, class: 'label-light' = f.label :scopes, class: 'label-bold'
= render 'shared/tokens/scopes_form', prefix: 'personal_access_token', token: token, scopes: scopes = render 'shared/tokens/scopes_form', prefix: 'personal_access_token', token: token, scopes: scopes
.prepend-top-default .prepend-top-default
......
...@@ -5,5 +5,5 @@ ...@@ -5,5 +5,5 @@
- scopes.each do |scope| - scopes.each do |scope|
%fieldset.form-group.form-check %fieldset.form-group.form-check
= check_box_tag "#{prefix}[scopes][]", scope, token.scopes.include?(scope), id: "#{prefix}_scopes_#{scope}", class: 'form-check-input' = check_box_tag "#{prefix}[scopes][]", scope, token.scopes.include?(scope), id: "#{prefix}_scopes_#{scope}", class: 'form-check-input'
= label_tag ("#{prefix}_scopes_#{scope}"), scope, class: 'label-light form-check-label' = label_tag ("#{prefix}_scopes_#{scope}"), scope, class: 'label-bold form-check-label'
.text-secondary= t scope, scope: [:doorkeeper, :scope_desc] .text-secondary= t scope, scope: [:doorkeeper, :scope_desc]
= form_errors(hook) = form_errors(hook)
.form-group .form-group
= form.label :url, 'URL', class: 'label-light' = form.label :url, 'URL', class: 'label-bold'
= form.text_field :url, class: 'form-control', placeholder: 'http://example.com/trigger-ci.json' = form.text_field :url, class: 'form-control', placeholder: 'http://example.com/trigger-ci.json'
.form-group .form-group
= form.label :token, 'Secret Token', class: 'label-light' = form.label :token, 'Secret Token', class: 'label-bold'
= form.text_field :token, class: 'form-control', placeholder: '' = form.text_field :token, class: 'form-control', placeholder: ''
%p.form-text.text-muted %p.form-text.text-muted
Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header. Use this token to validate received payloads. It will be sent with the request in the X-Gitlab-Token HTTP header.
.form-group .form-group
= form.label :url, 'Trigger', class: 'label-light' = form.label :url, 'Trigger', class: 'label-bold'
%ul.list-unstyled.prepend-left-20 %ul.list-unstyled.prepend-left-20
%li %li
= form.check_box :push_events, class: 'form-check-input' = form.check_box :push_events, class: 'form-check-input'
...@@ -72,7 +72,7 @@ ...@@ -72,7 +72,7 @@
%p.light.ml-1 %p.light.ml-1
This URL will be triggered when a wiki page is created/updated This URL will be triggered when a wiki page is created/updated
.form-group .form-group
= form.label :enable_ssl_verification, 'SSL verification', class: 'label-light checkbox' = form.label :enable_ssl_verification, 'SSL verification', class: 'label-bold checkbox'
.form-check .form-check
= form.check_box :enable_ssl_verification, class: 'form-check-input' = form.check_box :enable_ssl_verification, class: 'form-check-input'
= form.label :enable_ssl_verification, class: 'form-check-label ml-1' do = form.label :enable_ssl_verification, class: 'form-check-label ml-1' do
......
---
title: Use monospaced font for MR diff commit link ref on GFM
merge_request:
author:
type: other
---
title: Add SHA256 and HEAD on File API
merge_request: 19439
author: ahmet2mir
type: added
---
title: Add option to add README when creating a project
merge_request: 20335
author:
type: added
---
title: Fix double "in" in time to artifact deletion message
merge_request: 20357
author: "@bbodenmiller"
type: fixed
---
title: Add download button for single file (including raw files) in repository
merge_request: 20480
author: Kia Mei Somabes
type: added
---
title: Present state indication on GFM preview
merge_request:
author:
type: added
---
title: Expose visibility via Snippets API
merge_request: 19620
author: Jan Beckmann
type: added
---
title: Add dropdown to Groups link in top bar
merge_request: 18280
author:
type: added
---
title: Fix link to job when creating a new issue from a failed job
merge_request: 20328
author:
type: fixed
---
title: Allows settings sections to expand by default when linking to them
merge_request: 20211
author:
type: other
---
title: Milestone page list redesign
merge_request: 19832
author: Constance Okoghenun
type: changed
---
title: Change avatar image in the header when user updates their avatar.
merge_request: 20119
author: Jamie Schembri
type: added
---
title: Improve U2F workflow when using unsupported browsers
merge_request: 19938
author: Jan Beckmann
type: changed
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