Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
be2142bf5e
commit
6b5e293c6d
136 changed files with 1120 additions and 235 deletions
|
@ -1274,18 +1274,14 @@ Graphql/IDType:
|
|||
Exclude:
|
||||
- 'ee/app/graphql/ee/mutations/issues/update.rb'
|
||||
- 'ee/app/graphql/ee/types/boards/board_issue_input_base_type.rb'
|
||||
- 'ee/app/graphql/mutations/issues/set_epic.rb'
|
||||
- 'ee/app/graphql/mutations/iterations/update.rb'
|
||||
- 'ee/app/graphql/resolvers/iterations_resolver.rb'
|
||||
- 'app/graphql/mutations/boards/create.rb'
|
||||
- 'app/graphql/mutations/boards/issues/issue_move_list.rb'
|
||||
- 'app/graphql/mutations/boards/lists/update.rb'
|
||||
- 'app/graphql/mutations/issues/update.rb'
|
||||
- 'app/graphql/mutations/metrics/dashboard/annotations/delete.rb'
|
||||
- 'app/graphql/mutations/snippets/destroy.rb'
|
||||
- 'app/graphql/mutations/snippets/mark_as_spam.rb'
|
||||
- 'app/graphql/mutations/snippets/update.rb'
|
||||
- 'app/graphql/resolvers/board_lists_resolver.rb'
|
||||
- 'app/graphql/resolvers/boards_resolver.rb'
|
||||
- 'app/graphql/resolvers/design_management/design_at_version_resolver.rb'
|
||||
- 'app/graphql/resolvers/design_management/design_resolver.rb'
|
||||
|
|
|
@ -0,0 +1,92 @@
|
|||
<script>
|
||||
import { GlDatepicker } from '@gitlab/ui';
|
||||
import { mapActions } from 'vuex';
|
||||
import { getDateInFuture } from '~/lib/utils/datetime_utility';
|
||||
import { s__ } from '~/locale';
|
||||
|
||||
export default {
|
||||
name: 'ExpirationDatepicker',
|
||||
components: { GlDatepicker },
|
||||
props: {
|
||||
member: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
permissions: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
selectedDate: null,
|
||||
busy: false,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
minDate() {
|
||||
// Members expire at the beginning of the day.
|
||||
// The first selectable day should be tomorrow.
|
||||
const today = new Date();
|
||||
const beginningOfToday = new Date(today.setHours(0, 0, 0, 0));
|
||||
|
||||
return getDateInFuture(beginningOfToday, 1);
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
if (this.member.expiresAt) {
|
||||
this.selectedDate = new Date(this.member.expiresAt);
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
...mapActions(['updateMemberExpiration']),
|
||||
handleInput(date) {
|
||||
this.busy = true;
|
||||
this.updateMemberExpiration({
|
||||
memberId: this.member.id,
|
||||
expiresAt: date,
|
||||
})
|
||||
.then(() => {
|
||||
this.$toast.show(s__('Members|Expiration date updated successfully.'));
|
||||
this.busy = false;
|
||||
})
|
||||
.catch(() => {
|
||||
this.busy = false;
|
||||
});
|
||||
},
|
||||
handleClear() {
|
||||
this.busy = true;
|
||||
|
||||
this.updateMemberExpiration({
|
||||
memberId: this.member.id,
|
||||
expiresAt: null,
|
||||
})
|
||||
.then(() => {
|
||||
this.$toast.show(s__('Members|Expiration date removed successfully.'));
|
||||
this.selectedDate = null;
|
||||
this.busy = false;
|
||||
})
|
||||
.catch(() => {
|
||||
this.busy = false;
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<!-- `:target="null"` allows the datepicker to be opened on focus -->
|
||||
<!-- `:container="null"` renders the datepicker in the body to prevent conflicting CSS table styles -->
|
||||
<gl-datepicker
|
||||
v-model="selectedDate"
|
||||
class="gl-max-w-full"
|
||||
show-clear-button
|
||||
:target="null"
|
||||
:container="null"
|
||||
:min-date="minDate"
|
||||
:placeholder="__('Expiration date')"
|
||||
:disabled="!permissions.canUpdate || busy"
|
||||
@input="handleInput"
|
||||
@clear="handleClear"
|
||||
/>
|
||||
</template>
|
|
@ -11,6 +11,7 @@ import MemberActionButtons from './member_action_buttons.vue';
|
|||
import MembersTableCell from './members_table_cell.vue';
|
||||
import RoleDropdown from './role_dropdown.vue';
|
||||
import RemoveGroupLinkModal from '../modals/remove_group_link_modal.vue';
|
||||
import ExpirationDatepicker from './expiration_datepicker.vue';
|
||||
|
||||
export default {
|
||||
name: 'MembersTable',
|
||||
|
@ -25,6 +26,7 @@ export default {
|
|||
MemberActionButtons,
|
||||
RoleDropdown,
|
||||
RemoveGroupLinkModal,
|
||||
ExpirationDatepicker,
|
||||
},
|
||||
computed: {
|
||||
...mapState(['members', 'tableFields']),
|
||||
|
@ -90,6 +92,12 @@ export default {
|
|||
</members-table-cell>
|
||||
</template>
|
||||
|
||||
<template #cell(expiration)="{ item: member }">
|
||||
<members-table-cell #default="{ permissions }" :member="member">
|
||||
<expiration-datepicker :permissions="permissions" :member="member" />
|
||||
</members-table-cell>
|
||||
</template>
|
||||
|
||||
<template #cell(actions)="{ item: member }">
|
||||
<members-table-cell #default="{ memberType, isCurrentUser, permissions }" :member="member">
|
||||
<member-action-buttons
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
<script>
|
||||
import { GlDropdown, GlDropdownForm } from '@gitlab/ui';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
GlDropdownForm,
|
||||
GlDropdown,
|
||||
},
|
||||
props: {
|
||||
headerText: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
text: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<gl-dropdown class="show" :text="text" :header-text="headerText">
|
||||
<gl-dropdown-form>
|
||||
<slot name="items"></slot>
|
||||
</gl-dropdown-form>
|
||||
</gl-dropdown>
|
||||
</template>
|
|
@ -1,5 +1,6 @@
|
|||
import * as types from './mutation_types';
|
||||
import axios from '~/lib/utils/axios_utils';
|
||||
import { formatDate } from '~/lib/utils/datetime_utility';
|
||||
|
||||
export const updateMemberRole = async ({ state, commit }, { memberId, accessLevel }) => {
|
||||
try {
|
||||
|
@ -23,3 +24,21 @@ export const showRemoveGroupLinkModal = ({ commit }, groupLink) => {
|
|||
export const hideRemoveGroupLinkModal = ({ commit }) => {
|
||||
commit(types.HIDE_REMOVE_GROUP_LINK_MODAL);
|
||||
};
|
||||
|
||||
export const updateMemberExpiration = async ({ state, commit }, { memberId, expiresAt }) => {
|
||||
try {
|
||||
await axios.put(
|
||||
state.memberPath.replace(':id', memberId),
|
||||
state.requestFormatter({ expires_at: expiresAt ? formatDate(expiresAt, 'isoDate') : '' }),
|
||||
);
|
||||
|
||||
commit(types.RECEIVE_MEMBER_EXPIRATION_SUCCESS, {
|
||||
memberId,
|
||||
expiresAt: expiresAt ? formatDate(expiresAt, 'isoUtcDateTime') : null,
|
||||
});
|
||||
} catch (error) {
|
||||
commit(types.RECEIVE_MEMBER_EXPIRATION_ERROR);
|
||||
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
export const RECEIVE_MEMBER_ROLE_SUCCESS = 'RECEIVE_MEMBER_ROLE_SUCCESS';
|
||||
export const RECEIVE_MEMBER_ROLE_ERROR = 'RECEIVE_MEMBER_ROLE_ERROR';
|
||||
|
||||
export const RECEIVE_MEMBER_EXPIRATION_SUCCESS = 'RECEIVE_MEMBER_EXPIRATION_SUCCESS';
|
||||
export const RECEIVE_MEMBER_EXPIRATION_ERROR = 'RECEIVE_MEMBER_EXPIRATION_ERROR';
|
||||
|
||||
export const HIDE_ERROR = 'HIDE_ERROR';
|
||||
|
||||
export const SHOW_REMOVE_GROUP_LINK_MODAL = 'SHOW_REMOVE_GROUP_LINK_MODAL';
|
||||
|
|
|
@ -19,6 +19,21 @@ export default {
|
|||
);
|
||||
state.showError = true;
|
||||
},
|
||||
[types.RECEIVE_MEMBER_EXPIRATION_SUCCESS](state, { memberId, expiresAt }) {
|
||||
const member = findMember(state, memberId);
|
||||
|
||||
if (!member) {
|
||||
return;
|
||||
}
|
||||
|
||||
Vue.set(member, 'expiresAt', expiresAt);
|
||||
},
|
||||
[types.RECEIVE_MEMBER_EXPIRATION_ERROR](state) {
|
||||
state.errorMessage = s__(
|
||||
"Members|An error occurred while updating the member's expiration date, please try again.",
|
||||
);
|
||||
state.showError = true;
|
||||
},
|
||||
[types.HIDE_ERROR](state) {
|
||||
state.showError = false;
|
||||
state.errorMessage = '';
|
||||
|
|
|
@ -228,6 +228,11 @@
|
|||
width: px-to-rem(50px);
|
||||
}
|
||||
}
|
||||
|
||||
.gl-datepicker-input {
|
||||
width: px-to-rem(165px);
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.card-mobile {
|
||||
|
|
|
@ -28,7 +28,7 @@ module Mutations
|
|||
required: false,
|
||||
description: 'The ID of the user to be assigned to the board.'
|
||||
argument :milestone_id,
|
||||
GraphQL::ID_TYPE,
|
||||
Types::GlobalIDType[Milestone],
|
||||
required: false,
|
||||
description: 'The ID of the milestone to be assigned to the board.'
|
||||
argument :weight,
|
||||
|
@ -36,7 +36,7 @@ module Mutations
|
|||
required: false,
|
||||
description: 'The weight of the board.'
|
||||
argument :label_ids,
|
||||
[GraphQL::ID_TYPE],
|
||||
[Types::GlobalIDType[Label]],
|
||||
required: false,
|
||||
description: 'The IDs of labels to be added to the board.'
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ module Mutations
|
|||
class Update < BaseMutation
|
||||
graphql_name 'UpdateBoardList'
|
||||
|
||||
argument :list_id, GraphQL::ID_TYPE,
|
||||
argument :list_id, Types::GlobalIDType[List],
|
||||
required: true,
|
||||
loads: Types::BoardListType,
|
||||
description: 'Global ID of the list.'
|
||||
|
|
|
@ -7,7 +7,7 @@ module Resolvers
|
|||
|
||||
type Types::BoardListType, null: true
|
||||
|
||||
argument :id, GraphQL::ID_TYPE,
|
||||
argument :id, Types::GlobalIDType[List],
|
||||
required: false,
|
||||
description: 'Find a list by its global ID'
|
||||
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
# The BulkImport import model links together all the models required to for a
|
||||
# bulk import of groups and projects to a GitLab instance, and associates these
|
||||
# with the user that initiated the import.
|
||||
class BulkImport < ApplicationRecord
|
||||
belongs_to :user, optional: false
|
||||
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
# Stores the authentication data required to access another GitLab instance on
|
||||
# behalf of a user, to import Groups and Projects directly from that instance.
|
||||
class BulkImports::Configuration < ApplicationRecord
|
||||
self.table_name = 'bulk_import_configurations'
|
||||
|
||||
|
|
|
@ -1,5 +1,22 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
# The BulkImport::Entity represents a Group or Project that is going to be
|
||||
# imported during the bulk import process. An entity is nested under the a
|
||||
# parent group when it is not a top level group.
|
||||
#
|
||||
# A full bulk import entity structure might look like this, where the links are
|
||||
# parents:
|
||||
#
|
||||
# **Before Import** **After Import**
|
||||
#
|
||||
# GroupEntity Group
|
||||
# | | | |
|
||||
# GroupEntity ProjectEntity Group Project
|
||||
# | |
|
||||
# ProjectEntity Project
|
||||
#
|
||||
# The tree structure of the entities will result in the same structure for the
|
||||
# imported Groups and Projects.
|
||||
class BulkImports::Entity < ApplicationRecord
|
||||
self.table_name = 'bulk_import_entities'
|
||||
|
||||
|
@ -33,11 +50,17 @@ class BulkImports::Entity < ApplicationRecord
|
|||
|
||||
def validate_imported_entity_type
|
||||
if group.present? && project_entity?
|
||||
errors.add(:group, s_('BulkImport|expected an associated Project but has an associated Group'))
|
||||
errors.add(
|
||||
:group,
|
||||
s_('BulkImport|expected an associated Project but has an associated Group')
|
||||
)
|
||||
end
|
||||
|
||||
if project.present? && group_entity?
|
||||
errors.add(:project, s_('BulkImport|expected an associated Group but has an associated Project'))
|
||||
errors.add(
|
||||
:project,
|
||||
s_('BulkImport|expected an associated Group but has an associated Project')
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
6
app/models/csv_issue_import.rb
Normal file
6
app/models/csv_issue_import.rb
Normal file
|
@ -0,0 +1,6 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class CsvIssueImport < ApplicationRecord
|
||||
belongs_to :project, optional: false
|
||||
belongs_to :user, optional: false
|
||||
end
|
|
@ -10,6 +10,7 @@ module Issues
|
|||
end
|
||||
|
||||
def execute
|
||||
record_import_attempt
|
||||
process_csv
|
||||
email_results_to_user
|
||||
|
||||
|
@ -18,6 +19,10 @@ module Issues
|
|||
|
||||
private
|
||||
|
||||
def record_import_attempt
|
||||
CsvIssueImport.create!(user: @user, project: @project)
|
||||
end
|
||||
|
||||
def process_csv
|
||||
csv_data = @csv_io.open(&:read).force_encoding(Encoding::UTF_8)
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
= clipboard_button(target: '#registration_token', title: _("Copy token"), class: "btn-transparent btn-clipboard")
|
||||
.gl-mt-3.gl-mb-3
|
||||
= button_to _("Reset runners registration token"), reset_token_url,
|
||||
method: :put, class: 'btn btn-default',
|
||||
method: :put, class: 'gl-button btn btn-default',
|
||||
data: { confirm: _("Are you sure you want to reset registration token?") }
|
||||
%li
|
||||
= _("Start the Runner!")
|
||||
|
|
|
@ -19,4 +19,4 @@
|
|||
|
||||
= link_to _('Install Runner on Kubernetes'),
|
||||
clusters_path,
|
||||
class: 'btn btn-info'
|
||||
class: 'gl-button btn btn-info'
|
||||
|
|
|
@ -11,4 +11,4 @@
|
|||
|
||||
- if clusterable.can_add_cluster?
|
||||
.gl-text-center
|
||||
= link_to s_('ClusterIntegration|Integrate with a cluster certificate'), clusterable.new_path, class: 'btn btn-success'
|
||||
= link_to s_('ClusterIntegration|Integrate with a cluster certificate'), clusterable.new_path, class: 'gl-button btn btn-success'
|
||||
|
|
|
@ -55,4 +55,4 @@
|
|||
= render('clusters/clusters/namespace', platform_field: platform_field, field: field)
|
||||
|
||||
.form-group
|
||||
= field.submit s_('ClusterIntegration|Save changes'), class: 'btn btn-success'
|
||||
= field.submit s_('ClusterIntegration|Save changes'), class: 'gl-button btn btn-success'
|
||||
|
|
|
@ -86,4 +86,4 @@
|
|||
|
||||
.form-group.js-gke-cluster-creation-submit-container
|
||||
= field.submit s_('ClusterIntegration|Create Kubernetes cluster'),
|
||||
class: 'js-gke-cluster-creation-submit btn btn-success', disabled: true
|
||||
class: 'js-gke-cluster-creation-submit gl-button btn btn-success', disabled: true
|
||||
|
|
|
@ -60,4 +60,4 @@
|
|||
= render('clusters/clusters/namespace', platform_field: platform_kubernetes_field)
|
||||
|
||||
.form-group
|
||||
= field.submit s_('ClusterIntegration|Add Kubernetes cluster'), class: 'btn btn-success', data: { qa_selector: 'add_kubernetes_cluster_button' }
|
||||
= field.submit s_('ClusterIntegration|Add Kubernetes cluster'), class: 'gl-button btn btn-success', data: { qa_selector: 'add_kubernetes_cluster_button' }
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
- if current_user.can_create_group?
|
||||
.page-title-controls
|
||||
= link_to _("New group"), new_group_path, class: "btn btn-success"
|
||||
= link_to _("New group"), new_group_path, class: "gl-button btn btn-success"
|
||||
|
||||
.top-area
|
||||
%ul.nav-links.mobile-separator.nav.nav-tabs
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
- if current_user.can_create_project?
|
||||
.page-title-controls
|
||||
= link_to _("New project"), new_project_path, class: "btn btn-success"
|
||||
= link_to _("New project"), new_project_path, class: "gl-button btn btn-success"
|
||||
|
||||
.top-area.scrolling-tabs-container.inner-page-scroll-tabs
|
||||
.fade-left= sprite_icon('chevron-lg-left', size: 12)
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
- if current_user && current_user.snippets.any? || @snippets.any?
|
||||
.page-title-controls
|
||||
- if can?(current_user, :create_snippet)
|
||||
= link_to _("New snippet"), new_snippet_path, class: "btn btn-success", title: _("New snippet")
|
||||
= link_to _("New snippet"), new_snippet_path, class: "gl-button btn btn-success", title: _("New snippet")
|
||||
|
||||
.top-area
|
||||
%ul.nav-links.nav.nav-tabs
|
||||
|
|
|
@ -48,14 +48,14 @@
|
|||
|
||||
- if todo.pending?
|
||||
.todo-actions
|
||||
= link_to dashboard_todo_path(todo), method: :delete, class: 'btn btn-loading d-flex align-items-center js-done-todo', data: { href: dashboard_todo_path(todo) } do
|
||||
= link_to dashboard_todo_path(todo), method: :delete, class: 'gl-button btn btn-loading d-flex align-items-center js-done-todo', data: { href: dashboard_todo_path(todo) } do
|
||||
Done
|
||||
%span.spinner.ml-1
|
||||
= link_to restore_dashboard_todo_path(todo), method: :patch, class: 'btn btn-loading d-flex align-items-center js-undo-todo hidden', data: { href: restore_dashboard_todo_path(todo) } do
|
||||
= link_to restore_dashboard_todo_path(todo), method: :patch, class: 'gl-button btn btn-loading d-flex align-items-center js-undo-todo hidden', data: { href: restore_dashboard_todo_path(todo) } do
|
||||
Undo
|
||||
%span.spinner.ml-1
|
||||
- else
|
||||
.todo-actions
|
||||
= link_to restore_dashboard_todo_path(todo), method: :patch, class: 'btn btn-loading d-flex align-items-center js-add-todo', data: { href: restore_dashboard_todo_path(todo) } do
|
||||
= link_to restore_dashboard_todo_path(todo), method: :patch, class: 'gl-button btn btn-loading d-flex align-items-center js-add-todo', data: { href: restore_dashboard_todo_path(todo) } do
|
||||
Add a to do
|
||||
%span.spinner.ml-1
|
||||
|
|
|
@ -27,10 +27,10 @@
|
|||
.nav-controls
|
||||
- if @todos.any?(&:pending?)
|
||||
.gl-mr-3
|
||||
= link_to destroy_all_dashboard_todos_path(todos_filter_params), class: 'btn btn-loading align-items-center js-todos-mark-all', method: :delete, data: { href: destroy_all_dashboard_todos_path(todos_filter_params) } do
|
||||
= link_to destroy_all_dashboard_todos_path(todos_filter_params), class: 'gl-button btn btn-loading align-items-center js-todos-mark-all', method: :delete, data: { href: destroy_all_dashboard_todos_path(todos_filter_params) } do
|
||||
Mark all as done
|
||||
%span.spinner.ml-1
|
||||
= link_to bulk_restore_dashboard_todos_path, class: 'btn btn-loading align-items-center js-todos-undo-all hidden', method: :patch , data: { href: bulk_restore_dashboard_todos_path(todos_filter_params) } do
|
||||
= link_to bulk_restore_dashboard_todos_path, class: 'gl-button btn btn-loading align-items-center js-todos-undo-all hidden', method: :patch , data: { href: bulk_restore_dashboard_todos_path(todos_filter_params) } do
|
||||
Undo mark all as done
|
||||
%span.spinner.ml-1
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
= f.label :email
|
||||
= f.email_field :email, class: "form-control", required: true, title: 'Please provide a valid email address.'
|
||||
.clearfix
|
||||
= f.submit "Resend", class: 'btn btn-success'
|
||||
= f.submit "Resend", class: 'gl-button btn btn-success'
|
||||
|
||||
.clearfix.prepend-top-20
|
||||
= render 'devise/shared/sign_in_link'
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
= f.label 'Confirm new password', for: "user_password_confirmation"
|
||||
= f.password_field :password_confirmation, class: "form-control bottom", title: 'This field is required', data: { qa_selector: 'password_confirmation_field' }, required: true
|
||||
.clearfix
|
||||
= f.submit "Change your password", class: "btn btn-primary", data: { qa_selector: 'change_password_button' }
|
||||
= f.submit "Change your password", class: "gl-button btn btn-primary", data: { qa_selector: 'change_password_button' }
|
||||
|
||||
.clearfix.prepend-top-20
|
||||
%p
|
||||
|
|
|
@ -20,4 +20,4 @@
|
|||
= recaptcha_tags
|
||||
|
||||
.submit-container.move-submit-down
|
||||
= f.submit _('Sign in'), class: 'btn btn-success', data: { qa_selector: 'sign_in_button' }
|
||||
= f.submit _('Sign in'), class: 'gl-button btn btn-success', data: { qa_selector: 'sign_in_button' }
|
||||
|
|
|
@ -11,6 +11,6 @@
|
|||
= f.text_field :otp_attempt, class: 'form-control', required: true, autofocus: true, autocomplete: 'off', title: 'This field is required.', data: { qa_selector: 'two_fa_code_field' }
|
||||
%p.form-text.text-muted.hint Enter the code from the two-factor app on your mobile device. If you've lost your device, you may enter one of your recovery codes.
|
||||
.prepend-top-20
|
||||
= f.submit "Verify code", class: "btn btn-success", data: { qa_selector: 'verify_code_button' }
|
||||
= f.submit "Verify code", class: "gl-button btn btn-success", data: { qa_selector: 'verify_code_button' }
|
||||
- if @user.two_factor_webauthn_u2f_enabled?
|
||||
= render "authentication/authenticate", params: params, resource: resource, resource_name: resource_name, render_remember_me: true, target_path: new_user_session_path
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
- if show_recaptcha_sign_up?
|
||||
= recaptcha_tags
|
||||
.submit-container.mt-3
|
||||
= f.submit _("Register"), class: "btn-register btn btn-block btn-success mb-0 p-2", data: { qa_selector: 'new_user_register_button' }
|
||||
= f.submit _("Register"), class: "btn-register gl-button btn btn-block btn-success mb-0 p-2", data: { qa_selector: 'new_user_register_button' }
|
||||
= render 'devise/shared/terms_of_service_notice'
|
||||
- if omniauth_enabled? && button_based_providers_enabled?
|
||||
= render 'devise/shared/experimental_separate_sign_up_flow_omniauth_box'
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
.d-flex.justify-content-between.flex-wrap
|
||||
- providers.each do |provider|
|
||||
- has_icon = provider_has_icon?(provider)
|
||||
= link_to omniauth_authorize_path(:user, provider), method: :post, class: "btn d-flex align-items-center omniauth-btn text-left oauth-login mb-2 p-2 #{qa_class_for_provider(provider)}", id: "oauth-login-#{provider}" do
|
||||
= link_to omniauth_authorize_path(:user, provider), method: :post, class: "gl-button btn d-flex align-items-center omniauth-btn text-left oauth-login mb-2 p-2 #{qa_class_for_provider(provider)}", id: "oauth-login-#{provider}" do
|
||||
- if has_icon
|
||||
= provider_image_tag(provider)
|
||||
%span.ml-2
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
.d-flex.justify-content-between.flex-wrap
|
||||
- providers.each do |provider|
|
||||
- has_icon = provider_has_icon?(provider)
|
||||
= button_to omniauth_authorize_path(:user, provider), id: "oauth-login-#{provider}", class: "btn d-flex align-items-center omniauth-btn text-left oauth-login #{qa_class_for_provider(provider)}" do
|
||||
= button_to omniauth_authorize_path(:user, provider), id: "oauth-login-#{provider}", class: "gl-button btn d-flex align-items-center omniauth-btn text-left oauth-login #{qa_class_for_provider(provider)}" do
|
||||
- if has_icon
|
||||
= provider_image_tag(provider)
|
||||
%span
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
= f.label :email
|
||||
= f.email_field :email, class: 'form-control', autofocus: 'autofocus', autocapitalize: 'off', autocorrect: 'off', title: 'Please provide a valid email address.'
|
||||
.clearfix
|
||||
= f.submit 'Resend unlock instructions', class: 'btn btn-success'
|
||||
= f.submit 'Resend unlock instructions', class: 'gl-button btn btn-success'
|
||||
|
||||
.clearfix.prepend-top-20
|
||||
= render 'devise/shared/sign_in_link'
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
= form_tag oauth_application_path(application) do
|
||||
%input{ :name => "_method", :type => "hidden", :value => "delete" }/
|
||||
- if defined? small
|
||||
= button_tag type: "submit", class: "btn btn-transparent", data: { confirm: _("Are you sure?") } do
|
||||
= button_tag type: "submit", class: "gl-button btn btn-transparent", data: { confirm: _("Are you sure?") } do
|
||||
%span.sr-only
|
||||
= _('Destroy')
|
||||
= sprite_icon('remove')
|
||||
|
|
|
@ -23,4 +23,4 @@
|
|||
= render 'shared/tokens/scopes_form', prefix: 'doorkeeper_application', token: application, scopes: @scopes
|
||||
|
||||
.gl-mt-3
|
||||
= f.submit _('Save application'), class: "btn btn-success"
|
||||
= f.submit _('Save application'), class: "gl-button btn btn-success"
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
%div= uri
|
||||
%td= application.access_tokens.count
|
||||
%td
|
||||
= link_to edit_oauth_application_path(application), class: "btn btn-transparent gl-mr-2" do
|
||||
= link_to edit_oauth_application_path(application), class: "gl-button btn btn-transparent gl-mr-2" do
|
||||
%span.sr-only
|
||||
= _('Edit')
|
||||
= sprite_icon('pencil')
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
.input-group
|
||||
%input.label.label-monospace.monospace{ id: "application_id", type: "text", autocomplete: 'off', value: @application.uid, readonly: true }
|
||||
.input-group-append
|
||||
= clipboard_button(target: '#application_id', title: _("Copy ID"), class: "btn btn btn-default")
|
||||
= clipboard_button(target: '#application_id', title: _("Copy ID"), class: "gl-button btn btn-default")
|
||||
%tr
|
||||
%td
|
||||
= _('Secret')
|
||||
|
@ -25,7 +25,7 @@
|
|||
.input-group
|
||||
%input.label.label-monospace.monospace{ id: "secret", type: "text", autocomplete: 'off', value: @application.secret, readonly: true }
|
||||
.input-group-append
|
||||
= clipboard_button(target: '#secret', title: _("Copy secret"), class: "btn btn btn-default")
|
||||
= clipboard_button(target: '#secret', title: _("Copy secret"), class: "gl-button btn btn-default")
|
||||
%tr
|
||||
%td
|
||||
= _('Callback URL')
|
||||
|
@ -43,5 +43,5 @@
|
|||
= render "shared/tokens/scopes_list", token: @application
|
||||
|
||||
.form-actions
|
||||
= link_to _('Edit'), edit_oauth_application_path(@application), class: 'btn btn-primary wide float-left'
|
||||
= link_to _('Edit'), edit_oauth_application_path(@application), class: 'gl-button btn btn-primary wide float-left'
|
||||
= render 'delete_form', application: @application, submit_btn_css: 'btn btn-danger gl-ml-3'
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
= hidden_field_tag :response_type, @pre_auth.response_type
|
||||
= hidden_field_tag :scope, @pre_auth.scope
|
||||
= hidden_field_tag :nonce, @pre_auth.nonce
|
||||
= submit_tag _("Deny"), class: "btn btn-danger"
|
||||
= submit_tag _("Deny"), class: "gl-button btn btn-danger"
|
||||
= form_tag oauth_authorization_path, method: :post, class: 'inline' do
|
||||
= hidden_field_tag :client_id, @pre_auth.client.uid
|
||||
= hidden_field_tag :redirect_uri, @pre_auth.redirect_uri
|
||||
|
@ -46,4 +46,4 @@
|
|||
= hidden_field_tag :response_type, @pre_auth.response_type
|
||||
= hidden_field_tag :scope, @pre_auth.scope
|
||||
= hidden_field_tag :nonce, @pre_auth.nonce
|
||||
= submit_tag _("Authorize"), class: "btn btn-success gl-ml-3", data: { qa_selector: 'authorization_button' }
|
||||
= submit_tag _("Authorize"), class: "gl-button btn btn-success gl-ml-3", data: { qa_selector: 'authorization_button' }
|
||||
|
|
|
@ -11,6 +11,6 @@
|
|||
%p
|
||||
= s_('403|Please contact your GitLab administrator to get permission.')
|
||||
.action-container.js-go-back{ hidden: true }
|
||||
%button{ type: 'button', class: 'btn btn-success' }
|
||||
%button{ type: 'button', class: 'gl-button btn btn-success' }
|
||||
= s_('Go Back')
|
||||
= render "errors/footer"
|
||||
|
|
|
@ -11,5 +11,5 @@
|
|||
= form_tag search_path, method: :get, class: 'form-inline-flex' do |f|
|
||||
.field
|
||||
= search_field_tag :search, '', placeholder: _('Search for projects, issues, etc.'), class: 'form-control'
|
||||
= button_tag _('Search'), class: 'btn btn-sm btn-success', name: nil, type: 'submit'
|
||||
= button_tag _('Search'), class: 'gl-button btn btn-sm btn-success', name: nil, type: 'submit'
|
||||
= render 'errors/footer'
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
|
||||
%p Try logging in using your username or email. If you have forgotten your password, try recovering it
|
||||
|
||||
= link_to "Sign in", new_session_path(:user), class: 'btn primary'
|
||||
= link_to "Recover password", new_password_path(:user), class: 'btn secondary'
|
||||
= link_to "Sign in", new_session_path(:user), class: 'gl-button btn primary'
|
||||
= link_to "Recover password", new_password_path(:user), class: 'gl-button btn secondary'
|
||||
|
||||
%hr
|
||||
%p.light If none of the options work, try contacting a GitLab administrator.
|
||||
|
|
|
@ -18,4 +18,4 @@
|
|||
%h5= _("Maximum page reached")
|
||||
%p= _("Sorry, you have exceeded the maximum browsable page number. Please use the API to explore further.")
|
||||
|
||||
= link_to _("Back to page %{number}") % { number: @max_page_number }, request.params.merge(page: @max_page_number), class: 'btn btn-inverted'
|
||||
= link_to _("Back to page %{number}") % { number: @max_page_number }, request.params.merge(page: @max_page_number), class: 'gl-button btn btn-inverted'
|
||||
|
|
|
@ -50,10 +50,10 @@
|
|||
.table-action-buttons
|
||||
.btn-group
|
||||
- if can?(current_user, :read_build, @project)
|
||||
= link_to download_project_job_artifacts_path(@project, artifact.job), rel: 'nofollow', download: '', title: _('Download artifacts'), data: { placement: 'top', container: 'body' }, ref: 'tooltip', aria: { label: _('Download artifacts') }, class: 'btn btn-build has-tooltip ml-0' do
|
||||
= link_to download_project_job_artifacts_path(@project, artifact.job), rel: 'nofollow', download: '', title: _('Download artifacts'), data: { placement: 'top', container: 'body' }, ref: 'tooltip', aria: { label: _('Download artifacts') }, class: 'gl-button btn btn-build has-tooltip ml-0' do
|
||||
= sprite_icon('download')
|
||||
|
||||
= link_to browse_project_job_artifacts_path(@project, artifact.job), rel: 'nofollow', title: _('Browse artifacts'), data: { placement: 'top', container: 'body' }, ref: 'tooltip', aria: { label: _('Browse artifacts') }, class: 'btn btn-build has-tooltip' do
|
||||
= link_to browse_project_job_artifacts_path(@project, artifact.job), rel: 'nofollow', title: _('Browse artifacts'), data: { placement: 'top', container: 'body' }, ref: 'tooltip', aria: { label: _('Browse artifacts') }, class: 'gl-button btn btn-build has-tooltip' do
|
||||
= sprite_icon('folder-open')
|
||||
|
||||
- if can?(current_user, :destroy_artifacts, @project)
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
.tree-controls<
|
||||
= link_to download_project_job_artifacts_path(@project, @build),
|
||||
rel: 'nofollow', download: '', class: 'btn btn-default download' do
|
||||
rel: 'nofollow', download: '', class: 'gl-button btn btn-default download' do
|
||||
= sprite_icon('download')
|
||||
Download artifacts archive
|
||||
|
||||
|
|
|
@ -26,10 +26,10 @@
|
|||
class: 'btn'
|
||||
- else
|
||||
= link_to 'Blame', project_blame_path(@project, @id),
|
||||
class: 'btn js-blob-blame-link' unless blob.empty?
|
||||
class: 'gl-button btn js-blob-blame-link' unless blob.empty?
|
||||
|
||||
= link_to 'History', project_commits_path(@project, @id),
|
||||
class: 'btn'
|
||||
|
||||
= link_to 'Permalink', project_blob_path(@project,
|
||||
tree_join(@commit.sha, @path)), class: 'btn js-data-file-blob-permalink-url'
|
||||
tree_join(@commit.sha, @path)), class: 'gl-button btn js-data-file-blob-permalink-url'
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
.file-actions<
|
||||
= render 'projects/blob/viewer_switcher', blob: blob unless blame
|
||||
- if Feature.enabled?(:consolidated_edit_button)
|
||||
- if Feature.enabled?(:consolidated_edit_button, @project)
|
||||
= render 'shared/web_ide_button', blob: blob
|
||||
- else
|
||||
= edit_blob_button(@project, @ref, @path, blob: blob)
|
||||
|
|
|
@ -36,12 +36,12 @@
|
|||
%svg.s24
|
||||
|
||||
- if merge_project && create_mr_button?(@repository.root_ref, branch.name)
|
||||
= link_to create_mr_path(@repository.root_ref, branch.name), class: 'btn btn-default' do
|
||||
= link_to create_mr_path(@repository.root_ref, branch.name), class: 'gl-button btn btn-default' do
|
||||
= _('Merge request')
|
||||
|
||||
- if branch.name != @repository.root_ref
|
||||
= link_to project_compare_index_path(@project, from: @repository.root_ref, to: branch.name),
|
||||
class: "btn btn-default js-onboarding-compare-branches #{'gl-ml-3' unless merge_project}",
|
||||
class: "gl-button btn btn-default js-onboarding-compare-branches #{'gl-ml-3' unless merge_project}",
|
||||
method: :post,
|
||||
title: s_('Branches|Compare') do
|
||||
= s_('Branches|Compare')
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
.modal-footer
|
||||
%button.btn{ data: { dismiss: 'modal' } } Cancel
|
||||
= link_to s_('Branches|Delete protected branch'), '',
|
||||
class: "btn btn-danger js-delete-branch",
|
||||
class: "gl-button btn btn-danger js-delete-branch",
|
||||
title: s_('Branches|Delete branch'),
|
||||
method: :delete,
|
||||
'aria-label' => s_('Branches|Delete branch')
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
data: { confirm: s_('Branches|Deleting the merged branches cannot be undone. Are you sure?'),
|
||||
container: 'body' } do
|
||||
= s_('Branches|Delete merged branches')
|
||||
= link_to new_project_branch_path(@project), class: 'btn btn-success' do
|
||||
= link_to new_project_branch_path(@project), class: 'gl-button btn btn-success' do
|
||||
= s_('Branches|New branch')
|
||||
|
||||
= render_if_exists 'projects/commits/mirror_status'
|
||||
|
|
|
@ -26,6 +26,6 @@
|
|||
= render 'shared/ref_dropdown', dropdown_class: 'wide'
|
||||
.form-text.text-muted Existing branch name, tag, or commit SHA
|
||||
.form-actions
|
||||
= button_tag 'Create branch', class: 'btn btn-success', tabindex: 3
|
||||
= link_to 'Cancel', project_branches_path(@project), class: 'btn btn-cancel'
|
||||
= button_tag 'Create branch', class: 'gl-button btn btn-success', tabindex: 3
|
||||
= link_to 'Cancel', project_branches_path(@project), class: 'gl-button btn btn-cancel'
|
||||
%script#availableRefs{ type: "application/json" }= @project.repository.ref_names.to_json.html_safe
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
.btn-group.ml-0.w-100
|
||||
- Gitlab::Workhorse::ARCHIVE_FORMATS.each_with_index do |fmt, index|
|
||||
- archive_path = project_archive_path(project, id: tree_join(ref, archive_prefix), path: path, format: fmt)
|
||||
= link_to fmt, external_storage_url_or_path(archive_path), rel: 'nofollow', download: '', class: "btn btn-xs #{"btn-primary" if index == 0}"
|
||||
= link_to fmt, external_storage_url_or_path(archive_path), rel: 'nofollow', download: '', class: "gl-button btn btn-xs #{"btn-primary" if index == 0}"
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
- if current_user && can?(current_user, :fork_project, @project)
|
||||
.count-badge.d-inline-flex.align-item-stretch.gl-mr-3
|
||||
- if current_user.already_forked?(@project) && current_user.manageable_namespaces.size < 2
|
||||
= link_to namespace_project_path(current_user, current_user.fork_of(@project)), title: s_('ProjectOverview|Go to your fork'), class: 'btn btn-default has-tooltip count-badge-button d-flex align-items-center fork-btn' do
|
||||
= link_to namespace_project_path(current_user, current_user.fork_of(@project)), title: s_('ProjectOverview|Go to your fork'), class: 'gl-button btn btn-default has-tooltip count-badge-button d-flex align-items-center fork-btn' do
|
||||
= sprite_icon('fork', css_class: 'icon')
|
||||
%span= s_('ProjectOverview|Fork')
|
||||
- else
|
||||
- can_create_fork = current_user.can?(:create_fork)
|
||||
= link_to new_project_fork_path(@project),
|
||||
class: "btn btn-default btn-xs has-tooltip count-badge-button d-flex align-items-center fork-btn #{'has-tooltip disabled' unless can_create_fork}",
|
||||
class: "gl-button btn btn-default btn-xs has-tooltip count-badge-button d-flex align-items-center fork-btn #{'has-tooltip disabled' unless can_create_fork}",
|
||||
title: (s_('ProjectOverview|You have reached your project limit') unless can_create_fork) do
|
||||
= sprite_icon('fork', css_class: 'icon')
|
||||
%span= s_('ProjectOverview|Fork')
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
|
||||
- else
|
||||
.count-badge.d-inline-flex.align-item-stretch.gl-mr-3
|
||||
= link_to new_user_session_path, class: 'btn btn-default btn-xs has-tooltip count-badge-button d-flex align-items-center star-btn', title: s_('ProjectOverview|You must sign in to star a project') do
|
||||
= link_to new_user_session_path, class: 'gl-button btn btn-default btn-xs has-tooltip count-badge-button d-flex align-items-center star-btn', title: s_('ProjectOverview|You must sign in to star a project') do
|
||||
= sprite_icon('star-o', css_class: 'icon')
|
||||
%span= s_('ProjectOverview|Star')
|
||||
%span.star-count.count-badge-count.d-flex.align-items-center
|
||||
|
|
|
@ -20,13 +20,13 @@
|
|||
= text_area_tag(:content, @content, class: 'hidden form-control span1', rows: 7, require: true)
|
||||
.col-sm-12
|
||||
.float-left.gl-mt-3
|
||||
= submit_tag(_('Validate'), class: 'btn btn-success submit-yml')
|
||||
= submit_tag(_('Validate'), class: 'gl-button btn btn-success submit-yml')
|
||||
- if Gitlab::Ci::Features.lint_creates_pipeline_with_dry_run?(@project)
|
||||
= check_box_tag(:dry_run, 'true', params[:dry_run])
|
||||
= label_tag(:dry_run, _('Simulate a pipeline created for the default branch'))
|
||||
= link_to sprite_icon('question-o'), help_page_path('ci/lint', anchor: 'pipeline-simulation'), target: '_blank', rel: 'noopener noreferrer'
|
||||
.float-right.prepend-top-10
|
||||
= button_tag(_('Clear'), type: 'button', class: 'btn btn-default clear-yml')
|
||||
= button_tag(_('Clear'), type: 'button', class: 'gl-button btn btn-default clear-yml')
|
||||
|
||||
.row.prepend-top-20
|
||||
.col-sm-12
|
||||
|
|
|
@ -26,4 +26,4 @@
|
|||
.form-text.text-muted
|
||||
= _("The maximum file size allowed is %{size}.") % { size: number_to_human_size(Gitlab::CurrentSettings.max_attachment_size.megabytes) }
|
||||
|
||||
= f.submit _('Start cleanup'), class: 'btn btn-success'
|
||||
= f.submit _('Start cleanup'), class: 'gl-button btn btn-success'
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
- else
|
||||
= hidden_field_tag 'create_merge_request', 1, id: nil
|
||||
.form-actions
|
||||
= submit_tag label, class: 'btn btn-success'
|
||||
= link_to _("Cancel"), '#', class: "btn btn-cancel", "data-dismiss" => "modal"
|
||||
= submit_tag label, class: 'gl-button btn btn-success'
|
||||
= link_to _("Cancel"), '#', class: "gl-button btn btn-cancel", "data-dismiss" => "modal"
|
||||
|
||||
= render 'shared/projects/edit_information'
|
||||
|
|
|
@ -60,5 +60,5 @@
|
|||
.commit-sha-group.d-none.d-sm-flex
|
||||
.label.label-monospace.monospace
|
||||
= commit.short_id
|
||||
= clipboard_button(text: commit.id, title: _("Copy commit SHA"), class: "btn btn-default", container: "body")
|
||||
= clipboard_button(text: commit.id, title: _("Copy commit SHA"), class: "gl-button btn btn-default", container: "body")
|
||||
= link_to_browse_code(project, commit)
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
- wiki_confluence_epic_link_url = 'https://gitlab.com/groups/gitlab-org/-/epics/3629'
|
||||
- wiki_confluence_epic_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: wiki_confluence_epic_link_url }
|
||||
= s_("WikiEmpty|You've enabled the Confluence Workspace integration. Your wiki will be viewable directly within Confluence. We are hard at work integrating Confluence more seamlessly into GitLab. If you'd like to stay up to date, follow our %{wiki_confluence_epic_link_start}Confluence epic%{wiki_confluence_epic_link_end}.").html_safe % { wiki_confluence_epic_link_start: wiki_confluence_epic_link_start, wiki_confluence_epic_link_end: '</a>'.html_safe }
|
||||
= link_to @project.confluence_service.confluence_url, target: '_blank', rel: 'noopener noreferrer', class: 'btn btn-success external-url', title: s_('WikiEmpty|Go to Confluence') do
|
||||
= link_to @project.confluence_service.confluence_url, target: '_blank', rel: 'noopener noreferrer', class: 'gl-button btn btn-success external-url', title: s_('WikiEmpty|Go to Confluence') do
|
||||
= sprite_icon('external-link')
|
||||
= s_('WikiEmpty|Go to Confluence')
|
||||
|
||||
|
|
|
@ -28,4 +28,4 @@
|
|||
= _("Issues referenced by merge requests and commits within the default branch will be closed automatically")
|
||||
= link_to sprite_icon('question-o'), help_page_path('user/project/issues/managing_issues.md', anchor: 'disabling-automatic-issue-closing'), target: '_blank'
|
||||
|
||||
= f.submit _('Save changes'), class: "btn btn-success"
|
||||
= f.submit _('Save changes'), class: "gl-button btn btn-success"
|
||||
|
|
|
@ -7,4 +7,4 @@
|
|||
= render partial: 'shared/deploy_keys/form', locals: { form: f, deploy_key: @deploy_key }
|
||||
.form-actions
|
||||
= f.submit 'Save changes', class: 'btn-success btn'
|
||||
= link_to 'Cancel', project_settings_repository_path(@project), class: 'btn btn-cancel'
|
||||
= link_to 'Cancel', project_settings_repository_path(@project), class: 'gl-button btn btn-cancel'
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
.files-changed-inner
|
||||
.inline-parallel-buttons.d-none.d-md-block
|
||||
- if !diffs_expanded? && diff_files.any? { |diff_file| diff_file.collapsed? }
|
||||
= link_to _('Expand all'), url_for(safe_params.merge(expanded: 1, format: nil)), class: 'btn btn-default'
|
||||
= link_to _('Expand all'), url_for(safe_params.merge(expanded: 1, format: nil)), class: 'gl-button btn btn-default'
|
||||
- if show_whitespace_toggle
|
||||
- if current_controller?(:commit)
|
||||
= commit_diff_whitespace_link(diffs.project, @commit, class: 'd-none d-sm-inline-block')
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
- blob = diff_file.blob
|
||||
.file-actions.d-none.d-sm-block
|
||||
- if blob&.readable_text?
|
||||
= link_to '#', class: 'js-toggle-diff-comments btn active has-tooltip', title: _("Toggle comments for this file"), disabled: @diff_notes_disabled do
|
||||
= link_to '#', class: 'js-toggle-diff-comments gl-button btn active has-tooltip', title: _("Toggle comments for this file"), disabled: @diff_notes_disabled do
|
||||
= sprite_icon('comment')
|
||||
\
|
||||
- if editable_diff?(diff_file)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
- if environment.external_url && can?(current_user, :read_environment, environment)
|
||||
= link_to environment.external_url, target: '_blank', rel: 'noopener noreferrer', class: 'btn external-url has-tooltip qa-view-deployment', title: s_('Environments|Open live environment') do
|
||||
= link_to environment.external_url, target: '_blank', rel: 'noopener noreferrer', class: 'gl-button btn external-url has-tooltip qa-view-deployment', title: s_('Environments|Open live environment') do
|
||||
= sprite_icon('external-link')
|
||||
= _("View deployment")
|
||||
|
|
|
@ -17,5 +17,5 @@
|
|||
= f.url_field :external_url, class: 'form-control'
|
||||
|
||||
.form-actions
|
||||
= f.submit _('Save'), class: 'btn btn-success'
|
||||
= link_to _('Cancel'), project_environments_path(@project), class: 'btn btn-cancel'
|
||||
= f.submit _('Save'), class: 'gl-button btn btn-success'
|
||||
= link_to _('Cancel'), project_environments_path(@project), class: 'gl-button btn btn-cancel'
|
||||
|
|
|
@ -2,6 +2,6 @@
|
|||
|
||||
- return unless can?(current_user, :read_environment, environment)
|
||||
|
||||
= link_to environment_metrics_path(environment), title: _('See metrics'), class: 'btn metrics-button' do
|
||||
= link_to environment_metrics_path(environment), title: _('See metrics'), class: 'gl-button btn metrics-button' do
|
||||
= sprite_icon('chart')
|
||||
= _("Monitoring")
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
- if environment.auto_stop_at? && environment.available?
|
||||
= button_to cancel_auto_stop_project_environment_path(environment.project, environment), class: 'btn btn-secondary has-tooltip', title: _('Prevent environment from auto-stopping') do
|
||||
= button_to cancel_auto_stop_project_environment_path(environment.project, environment), class: 'gl-button btn btn-secondary has-tooltip', title: _('Prevent environment from auto-stopping') do
|
||||
= sprite_icon('thumbtack')
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
- if environment.has_terminals? && can?(current_user, :admin_environment, @project)
|
||||
= link_to terminal_project_environment_path(@project, environment), class: 'btn terminal-button' do
|
||||
= link_to terminal_project_environment_path(@project, environment), class: 'gl-button btn terminal-button' do
|
||||
= sprite_icon('terminal')
|
||||
|
|
|
@ -11,4 +11,4 @@
|
|||
%p.state-description
|
||||
= s_('Metrics|Check out the CI/CD documentation on deploying to an environment')
|
||||
.text-center
|
||||
= link_to s_("Environments|Learn about environments"), help_page_path('ci/environments/index.md'), class: 'btn btn-success'
|
||||
= link_to s_("Environments|Learn about environments"), help_page_path('ci/environments/index.md'), class: 'gl-button btn btn-success'
|
||||
|
|
|
@ -27,8 +27,8 @@
|
|||
rel: 'noopener noreferrer' }
|
||||
= s_('Environments|Learn more about stopping environments')
|
||||
.modal-footer
|
||||
= button_tag _('Cancel'), type: 'button', class: 'btn btn-cancel', data: { dismiss: 'modal' }
|
||||
= button_to stop_project_environment_path(@project, @environment), class: 'btn btn-danger has-tooltip', method: :post do
|
||||
= button_tag _('Cancel'), type: 'button', class: 'gl-button btn btn-cancel', data: { dismiss: 'modal' }
|
||||
= button_to stop_project_environment_path(@project, @environment), class: 'gl-button btn btn-danger has-tooltip', method: :post do
|
||||
= s_('Environments|Stop environment')
|
||||
|
||||
- if can_destroy_environment?(@environment)
|
||||
|
@ -48,12 +48,12 @@
|
|||
- if can?(current_user, :update_environment, @environment)
|
||||
= link_to _('Edit'), edit_project_environment_path(@project, @environment), class: 'btn'
|
||||
- if @environment.available? && can?(current_user, :stop_environment, @environment)
|
||||
= button_tag class: 'btn btn-danger', type: 'button', data: { toggle: 'modal',
|
||||
= button_tag class: 'gl-button btn btn-danger', type: 'button', data: { toggle: 'modal',
|
||||
target: '#stop-environment-modal' } do
|
||||
= sprite_icon('stop')
|
||||
= s_('Environments|Stop')
|
||||
- if can_destroy_environment?(@environment)
|
||||
= button_tag class: 'btn btn-danger', type: 'button', data: { toggle: 'modal',
|
||||
= button_tag class: 'gl-button btn btn-danger', type: 'button', data: { toggle: 'modal',
|
||||
target: '#delete-environment-modal' } do
|
||||
= s_('Environments|Delete')
|
||||
|
||||
|
@ -66,7 +66,7 @@
|
|||
%p.blank-state-text
|
||||
= html_escape(_("Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here.")) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
|
||||
.text-center
|
||||
= link_to _("Read more"), help_page_path("ci/environments/index.md"), class: "btn btn-success"
|
||||
= link_to _("Read more"), help_page_path("ci/environments/index.md"), class: "gl-button btn btn-success"
|
||||
- else
|
||||
.table-holder.gl-overflow-visible
|
||||
.ci-table.environments{ role: 'grid' }
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
.col-sm-6
|
||||
.nav-controls
|
||||
- if @environment.external_url.present?
|
||||
= link_to @environment.external_url, class: 'btn btn-default', target: '_blank', rel: 'noopener noreferrer nofollow' do
|
||||
= link_to @environment.external_url, class: 'gl-button btn btn-default', target: '_blank', rel: 'noopener noreferrer nofollow' do
|
||||
= sprite_icon('external-link')
|
||||
= render 'projects/deployments/actions', deployment: @environment.last_deployment
|
||||
|
||||
|
|
|
@ -9,6 +9,6 @@
|
|||
.col-lg-8.gl-mb-3
|
||||
= form_for @hook, as: :hook, url: polymorphic_path([@project, :hooks]) do |f|
|
||||
= render partial: 'shared/web_hooks/form', locals: { form: f, hook: @hook }
|
||||
= f.submit 'Add webhook', class: 'btn btn-success'
|
||||
= f.submit 'Add webhook', class: 'gl-button btn btn-success'
|
||||
|
||||
= render 'shared/web_hooks/index', hooks: @hooks, hook_class: @hook.class
|
||||
|
|
|
@ -16,4 +16,4 @@
|
|||
= render "shared/import_form", f: f
|
||||
|
||||
.form-actions
|
||||
= f.submit 'Start import', class: "btn btn-success", tabindex: 4
|
||||
= f.submit 'Start import', class: "gl-button btn btn-success", tabindex: 4
|
||||
|
|
|
@ -5,8 +5,8 @@
|
|||
|
||||
- content_for :note_actions do
|
||||
- if can?(current_user, :update_issue, @issue)
|
||||
= link_to 'Reopen issue', issue_path(@issue, issue: {state_event: :reopen}, format: 'json'), data: {original_text: "Reopen issue", alternative_text: "Comment & reopen issue"}, class: "btn btn-nr btn-reopen btn-comment js-note-target-reopen #{issue_button_visibility(@issue, false)}", title: 'Reopen issue'
|
||||
= link_to 'Close issue', issue_path(@issue, issue: {state_event: :close}, format: 'json'), data: {original_text: "Close issue", alternative_text: "Comment & close issue"}, class: "btn btn-nr btn-close btn-comment js-note-target-close #{issue_button_visibility(@issue, true)}", title: 'Close issue'
|
||||
= link_to 'Reopen issue', issue_path(@issue, issue: {state_event: :reopen}, format: 'json'), data: {original_text: "Reopen issue", alternative_text: "Comment & reopen issue"}, class: "gl-button btn btn-nr btn-reopen btn-comment js-note-target-reopen #{issue_button_visibility(@issue, false)}", title: 'Reopen issue'
|
||||
= link_to 'Close issue', issue_path(@issue, issue: {state_event: :close}, format: 'json'), data: {original_text: "Close issue", alternative_text: "Comment & close issue"}, class: "gl-button btn btn-nr btn-close btn-comment js-note-target-close #{issue_button_visibility(@issue, true)}", title: 'Close issue'
|
||||
|
||||
%section.issuable-discussion.js-vue-notes-event
|
||||
#js-vue-notes{ data: { notes_data: notes_data(@issue).to_json,
|
||||
|
|
|
@ -14,12 +14,12 @@
|
|||
= render 'projects/issues/import_csv/button'
|
||||
|
||||
- if @can_bulk_update
|
||||
= button_tag _("Edit issues"), class: "btn btn-default gl-mr-3 js-bulk-update-toggle"
|
||||
= button_tag _("Edit issues"), class: "gl-button btn btn-default gl-mr-3 js-bulk-update-toggle"
|
||||
- if show_new_issue_link?(@project)
|
||||
= link_to _("New issue"), new_project_issue_path(@project,
|
||||
issue: { assignee_id: finder.assignee.try(:id),
|
||||
milestone_id: finder.milestones.first.try(:id) }),
|
||||
class: "btn btn-success",
|
||||
class: "gl-button btn btn-success",
|
||||
id: "new_issue_link"
|
||||
|
||||
- if show_export_button
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
|
||||
- if can_edit_project_settings && !service_desk_enabled
|
||||
.text-center
|
||||
= link_to _("Turn on Service Desk"), edit_project_path(@project), class: 'btn btn-success'
|
||||
= link_to _("Turn on Service Desk"), edit_project_path(@project), class: 'gl-button btn btn-success'
|
||||
- else
|
||||
.empty-state
|
||||
.svg-content
|
||||
|
|
|
@ -20,4 +20,4 @@
|
|||
|
||||
- if can_edit_project_settings && !service_desk_enabled
|
||||
.gl-mt-3
|
||||
= link_to _("Turn on Service Desk"), edit_project_path(@project), class: 'btn btn-success'
|
||||
= link_to _("Turn on Service Desk"), edit_project_path(@project), class: 'gl-button btn btn-success'
|
||||
|
|
|
@ -20,5 +20,5 @@
|
|||
= _('It must have a header row and at least two columns: the first column is the issue title and the second column is the issue description. The separator is automatically detected.')
|
||||
= _('The maximum file size allowed is %{size}.') % { size: number_to_human_size(Gitlab::CurrentSettings.max_attachment_size.megabytes) }
|
||||
.modal-footer
|
||||
%button{ type: 'submit', class: 'btn btn-success', title: _('Import issues'), data: { track_label: "export_issues_csv", track_event: "click_button", track_value: ""} }
|
||||
%button{ type: 'submit', class: 'gl-button btn btn-success', title: _('Import issues'), data: { track_label: "export_issues_csv", track_event: "click_button", track_value: ""} }
|
||||
= _('Import issues')
|
||||
|
|
|
@ -58,9 +58,9 @@
|
|||
= render 'shared/issuable/close_reopen_button', issuable: @issue, can_update: can_update_issue, can_reopen: can_reopen_issue, warn_before_close: defined?(@issue.blocked?) && @issue.blocked?
|
||||
|
||||
- if can_report_spam
|
||||
= link_to 'Submit as spam', mark_as_spam_project_issue_path(@project, @issue), method: :post, class: 'd-none d-sm-none d-md-block btn btn-grouped btn-spam', title: 'Submit as spam'
|
||||
= link_to 'Submit as spam', mark_as_spam_project_issue_path(@project, @issue), method: :post, class: 'd-none d-sm-none d-md-block gl-button btn btn-grouped btn-spam', title: 'Submit as spam'
|
||||
- if can_create_issue
|
||||
= link_to new_project_issue_path(@project), class: 'd-none d-sm-none d-md-block btn btn-grouped btn-success btn-inverted', title: 'New issue', id: 'new_issue_link' do
|
||||
= link_to new_project_issue_path(@project), class: 'd-none d-sm-none d-md-block gl-button btn btn-grouped btn-success btn-inverted', title: 'New issue', id: 'new_issue_link' do
|
||||
New issue
|
||||
|
||||
.issue-details.issuable-details
|
||||
|
|
|
@ -11,4 +11,4 @@
|
|||
%p.state-description.text-center
|
||||
= s_('Logs|To see the logs, deploy your code to an environment.')
|
||||
.text-center
|
||||
= link_to s_('Environments|Learn about environments'), help_page_path('ci/environments/index.md'), class: 'btn btn-success'
|
||||
= link_to s_('Environments|Learn about environments'), help_page_path('ci/environments/index.md'), class: 'gl-button btn btn-success'
|
||||
|
|
|
@ -13,4 +13,4 @@
|
|||
and try again.
|
||||
%hr
|
||||
.clearfix
|
||||
= link_to 'Go back', edit_project_service_path(@project, @service), class: 'btn btn-lg float-right'
|
||||
= link_to 'Go back', edit_project_service_path(@project, @service), class: 'gl-button btn btn-lg float-right'
|
||||
|
|
|
@ -42,5 +42,5 @@
|
|||
%hr
|
||||
.clearfix
|
||||
.float-right
|
||||
= link_to 'Cancel', edit_project_service_path(@project, @service), class: 'btn btn-lg'
|
||||
= f.submit 'Install', class: 'btn btn-success btn-lg'
|
||||
= link_to 'Cancel', edit_project_service_path(@project, @service), class: 'gl-button btn btn-lg'
|
||||
= f.submit 'Install', class: 'gl-button btn btn-success btn-lg'
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
- if @can_bulk_update
|
||||
= button_tag "Edit merge requests", class: "btn gl-mr-3 js-bulk-update-toggle"
|
||||
= button_tag "Edit merge requests", class: "gl-button btn gl-mr-3 js-bulk-update-toggle"
|
||||
- if merge_project
|
||||
= link_to new_merge_request_path, class: "btn btn-success", title: "New merge request" do
|
||||
= link_to new_merge_request_path, class: "gl-button btn btn-success", title: "New merge request" do
|
||||
New merge request
|
||||
|
|
|
@ -21,4 +21,4 @@
|
|||
%button.btn.btn-success.js-submit-button{ type: "button", "@click" => "commit()", ":disabled" => "!readyToCommit" }
|
||||
%span {{commitButtonText}}
|
||||
.col-6.text-right
|
||||
= link_to "Cancel", project_merge_request_path(@merge_request.project, @merge_request), class: "btn btn-cancel"
|
||||
= link_to "Cancel", project_merge_request_path(@merge_request.project, @merge_request), class: "gl-button btn btn-cancel"
|
||||
|
|
|
@ -65,4 +65,4 @@
|
|||
|
||||
- if @merge_request.errors.any?
|
||||
= form_errors(@merge_request)
|
||||
= f.submit 'Compare branches and continue', class: "btn btn-success mr-compare-btn"
|
||||
= f.submit 'Compare branches and continue', class: "gl-button btn btn-success mr-compare-btn"
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
.form-actions
|
||||
- if @milestone.new_record?
|
||||
= f.submit _('Create milestone'), class: 'btn-success btn', data: { qa_selector: 'create_milestone_button' }
|
||||
= link_to _('Cancel'), project_milestones_path(@project), class: 'btn btn-cancel'
|
||||
= link_to _('Cancel'), project_milestones_path(@project), class: 'gl-button btn btn-cancel'
|
||||
- else
|
||||
= f.submit _('Save changes'), class: 'btn-success btn'
|
||||
= link_to _('Cancel'), project_milestone_path(@project, @milestone), class: 'btn btn-cancel'
|
||||
= link_to _('Cancel'), project_milestone_path(@project, @milestone), class: 'gl-button btn btn-cancel'
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
= render 'shared/milestones/search_form'
|
||||
= render 'shared/milestones_sort_dropdown'
|
||||
- if can?(current_user, :admin_milestone, @project)
|
||||
= link_to new_project_milestone_path(@project), class: 'btn btn-success', data: { qa_selector: "new_project_milestone_link" }, title: _('New milestone') do
|
||||
= link_to new_project_milestone_path(@project), class: 'gl-button btn btn-success', data: { qa_selector: "new_project_milestone_link" }, title: _('New milestone') do
|
||||
= _('New milestone')
|
||||
|
||||
.milestones
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
= link_to sprite_icon('question-o'), help_page_path('user/project/protected_branches'), target: '_blank'
|
||||
|
||||
.panel-footer
|
||||
= f.submit _('Mirror repository'), class: 'btn btn-success js-mirror-submit qa-mirror-repository-button', name: :update_remote_mirror
|
||||
= f.submit _('Mirror repository'), class: 'gl-button btn btn-success js-mirror-submit qa-mirror-repository-button', name: :update_remote_mirror
|
||||
- else
|
||||
.gl-alert.gl-alert-info{ role: 'alert' }
|
||||
= sprite_icon('information-o', css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
|
||||
|
@ -72,6 +72,6 @@
|
|||
- if mirror_settings_enabled
|
||||
.btn-group.mirror-actions-group.float-right{ role: 'group' }
|
||||
- if mirror.ssh_key_auth?
|
||||
= clipboard_button(text: mirror.ssh_public_key, class: 'btn btn-default', title: _('Copy SSH public key'), qa_selector: 'copy_public_key_button')
|
||||
= clipboard_button(text: mirror.ssh_public_key, class: 'gl-button btn btn-default', title: _('Copy SSH public key'), qa_selector: 'copy_public_key_button')
|
||||
= render 'shared/remote_mirror_update_button', remote_mirror: mirror
|
||||
%button.js-delete-mirror.qa-delete-mirror.rspec-delete-mirror.btn.gl-button.btn-danger{ type: 'button', data: { mirror_id: mirror.id, toggle: 'tooltip', container: 'body' }, title: _('Remove') }= sprite_icon('remove')
|
||||
|
|
|
@ -17,4 +17,4 @@
|
|||
- unless params[:snippets].eql? 'true'
|
||||
= render 'filter'
|
||||
.d-flex-center.flex-column.flex-lg-row
|
||||
= button_tag _("Search"), class: "btn btn-success btn-search form-control mt-lg-0 ml-lg-1 align-self-end"
|
||||
= button_tag _("Search"), class: "gl-button btn btn-success btn-search form-control mt-lg-0 ml-lg-1 align-self-end"
|
||||
|
|
|
@ -15,5 +15,5 @@
|
|||
|
||||
%p
|
||||
= link_to _('Unsubscribe'), unsubscribe_sent_notification_path(@sent_notification, force: true),
|
||||
class: 'btn btn-primary gl-mr-3'
|
||||
= link_to _('Cancel'), new_user_session_path, class: 'btn gl-mr-3'
|
||||
class: 'gl-button btn btn-primary gl-mr-3'
|
||||
= link_to _('Cancel'), new_user_session_path, class: 'gl-button btn gl-mr-3'
|
||||
|
|
|
@ -21,4 +21,4 @@
|
|||
%td
|
||||
= link_to(t('sherlock.view'),
|
||||
sherlock_transaction_file_sample_path(@transaction, sample),
|
||||
class: 'btn btn-sm')
|
||||
class: 'gl-button btn btn-sm')
|
||||
|
|
|
@ -21,4 +21,4 @@
|
|||
%td
|
||||
= link_to(t('sherlock.view'),
|
||||
sherlock_transaction_query_path(@transaction, query),
|
||||
class: 'btn btn-sm')
|
||||
class: 'gl-button btn btn-sm')
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
.row-content-block
|
||||
.float-right
|
||||
= link_to(destroy_all_sherlock_transactions_path,
|
||||
class: 'btn btn-danger',
|
||||
class: 'gl-button btn btn-danger',
|
||||
method: :delete) do
|
||||
= sprite_icon('remove')
|
||||
= t('sherlock.delete_all_transactions')
|
||||
|
@ -37,5 +37,5 @@
|
|||
%td
|
||||
= time_ago_with_tooltip trans.finished_at
|
||||
%td
|
||||
= link_to(sherlock_transaction_path(trans), class: 'btn btn-sm') do
|
||||
= link_to(sherlock_transaction_path(trans), class: 'gl-button btn btn-sm') do
|
||||
= t('sherlock.view')
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
- if note_editable
|
||||
.note-actions-item
|
||||
= button_tag title: _('Edit comment'), class: 'note-action-button js-note-edit has-tooltip btn btn-transparent', data: { container: 'body', qa_selector: 'edit_comment_button' } do
|
||||
= button_tag title: _('Edit comment'), class: 'note-action-button js-note-edit has-tooltip gl-button btn btn-transparent', data: { container: 'body', qa_selector: 'edit_comment_button' } do
|
||||
%span.link-highlight
|
||||
= custom_icon('icon_pencil')
|
||||
|
||||
|
|
|
@ -6,13 +6,13 @@
|
|||
.card-footer.footer-block.clearfix
|
||||
- if can?(current_user, :accept_terms, @term)
|
||||
.float-right
|
||||
= button_to accept_term_path(@term, redirect_params), class: 'btn btn-success gl-ml-3', data: { qa_selector: 'accept_terms_button' } do
|
||||
= button_to accept_term_path(@term, redirect_params), class: 'gl-button btn btn-success gl-ml-3', data: { qa_selector: 'accept_terms_button' } do
|
||||
= _('Accept terms')
|
||||
- else
|
||||
.float-right
|
||||
= link_to root_path, class: 'btn btn-success gl-ml-3' do
|
||||
= link_to root_path, class: 'gl-button btn btn-success gl-ml-3' do
|
||||
= _('Continue')
|
||||
- if can?(current_user, :decline_terms, @term)
|
||||
.float-right
|
||||
= button_to decline_term_path(@term, redirect_params), class: 'btn btn-default gl-ml-3' do
|
||||
= button_to decline_term_path(@term, redirect_params), class: 'gl-button btn btn-default gl-ml-3' do
|
||||
= _('Decline and sign out')
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Update GraphQL input ids for Board Lists and Issues to be more type specific
|
||||
merge_request: 45398
|
||||
author:
|
||||
type: changed
|
5
changelogs/unreleased/jh-235732_csv_import_gmau.yml
Normal file
5
changelogs/unreleased/jh-235732_csv_import_gmau.yml
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Add usage ping for unique users importing issues via CSV
|
||||
merge_request: 44742
|
||||
author:
|
||||
type: changed
|
5
changelogs/unreleased/mk-console-ruby-version.yml
Normal file
5
changelogs/unreleased/mk-console-ruby-version.yml
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Print Ruby version in console greeting
|
||||
merge_request: 45370
|
||||
author:
|
||||
type: other
|
5
changelogs/unreleased/ss-add-multiselect-wrapper.yml
Normal file
5
changelogs/unreleased/ss-add-multiselect-wrapper.yml
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Add assignees multiselect wrapper
|
||||
merge_request: 44087
|
||||
author:
|
||||
type: added
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue