diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-04-19 03:08:33 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-04-19 03:08:33 +0000 |
commit | 2ea638391497c495798e0bab7c704af112789299 (patch) | |
tree | 55dedad2513c731b127e11622134f1791a87cfb0 /app | |
parent | 8c80b21468c5c969644c9ea83fec7b43dba1eb3c (diff) | |
download | gitlab-ce-2ea638391497c495798e0bab7c704af112789299.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
16 files changed, 57 insertions, 19 deletions
diff --git a/app/assets/javascripts/import_entities/components/import_status.vue b/app/assets/javascripts/import_entities/components/import_status.vue index c06258de50c..96d07803545 100644 --- a/app/assets/javascripts/import_entities/components/import_status.vue +++ b/app/assets/javascripts/import_entities/components/import_status.vue @@ -1,6 +1,7 @@ <script> -import { GlAccordion, GlAccordionItem, GlBadge, GlIcon } from '@gitlab/ui'; +import { GlAccordion, GlAccordionItem, GlBadge, GlIcon, GlLink } from '@gitlab/ui'; import { __, s__ } from '~/locale'; +import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import { STATISTIC_ITEMS } from '~/import/constants'; import { STATUSES } from '../constants'; @@ -55,6 +56,13 @@ export default { GlAccordionItem, GlBadge, GlIcon, + GlLink, + }, + mixins: [glFeatureFlagMixin()], + inject: { + detailsPath: { + default: undefined, + }, }, props: { status: { @@ -80,10 +88,13 @@ export default { return this.stats && this.knownStats.length > 0; }, + isIncomplete() { + return this.status === STATUSES.FINISHED && this.stats && isIncompleteImport(this.stats); + }, + mappedStatus() { if (this.status === STATUSES.FINISHED) { - const isIncomplete = this.stats && isIncompleteImport(this.stats); - return isIncomplete + return this.isIncomplete ? { icon: 'status-alert', text: s__('Import|Partially completed'), @@ -98,6 +109,10 @@ export default { return STATUS_MAP[this.status]; }, + + showDetails() { + return Boolean(this.detailsPath) && this.glFeatures.importDetailsPage && this.isIncomplete; + }, }, methods: { @@ -118,6 +133,9 @@ export default { }, STATISTIC_ITEMS, + i18n: { + detailsLink: s__('Import|See failures'), + }, }; </script> @@ -130,7 +148,7 @@ export default { </div> <gl-accordion v-if="hasStats" :header-level="3"> <gl-accordion-item :title="__('Details')"> - <ul class="gl-p-0 gl-list-style-none gl-font-sm"> + <ul class="gl-p-0 gl-mb-3 gl-list-style-none gl-font-sm"> <li v-for="key in knownStats" :key="key"> <div class="gl-display-flex gl-w-20 gl-align-items-center"> <gl-icon @@ -145,6 +163,7 @@ export default { </div> </li> </ul> + <gl-link v-if="showDetails" :href="detailsPath">{{ $options.i18n.detailsLink }}</gl-link> </gl-accordion-item> </gl-accordion> </div> diff --git a/app/assets/javascripts/import_entities/import_projects/index.js b/app/assets/javascripts/import_entities/import_projects/index.js index 66ffd378426..f898e23b47a 100644 --- a/app/assets/javascripts/import_entities/import_projects/index.js +++ b/app/assets/javascripts/import_entities/import_projects/index.js @@ -66,12 +66,16 @@ export default function mountImportProjectsTable({ const store = initStoreFromElement(mountElement); const props = initPropsFromElement(mountElement); + const { detailsPath } = mountElement.dataset; return new Vue({ el: mountElement, name: 'ImportProjectsRoot', store, apolloProvider, + provide: { + detailsPath, + }, render(createElement) { // We are using attrs instead of props so root-level component with inheritAttrs // will be able to pass them down diff --git a/app/assets/javascripts/vue_shared/components/form/input_copy_toggle_visibility.vue b/app/assets/javascripts/vue_shared/components/form/input_copy_toggle_visibility.vue index 2f10e068542..dea279890b1 100644 --- a/app/assets/javascripts/vue_shared/components/form/input_copy_toggle_visibility.vue +++ b/app/assets/javascripts/vue_shared/components/form/input_copy_toggle_visibility.vue @@ -137,6 +137,7 @@ export default { v-if="showCopyButton" :text="value" :title="copyButtonTitle" + data-qa-selector="clipboard_button" @click="handleCopyButtonClick" /> </template> diff --git a/app/controllers/import/github_controller.rb b/app/controllers/import/github_controller.rb index 6d69187ae11..bd0c0976729 100644 --- a/app/controllers/import/github_controller.rb +++ b/app/controllers/import/github_controller.rb @@ -11,6 +11,10 @@ class Import::GithubController < Import::BaseController before_action :provider_auth, only: [:status, :realtime_changes, :create] before_action :expire_etag_cache, only: [:status, :create] + before_action only: [:status] do + push_frontend_feature_flag(:import_details_page) + end + rescue_from Octokit::Unauthorized, with: :provider_unauthorized rescue_from Octokit::TooManyRequests, with: :provider_rate_limit rescue_from Gitlab::GithubImport::RateLimitError, with: :rate_limit_threshold_exceeded diff --git a/app/graphql/mutations/projects/sync_fork.rb b/app/graphql/mutations/projects/sync_fork.rb index 05332457e8c..13dd0b60d26 100644 --- a/app/graphql/mutations/projects/sync_fork.rb +++ b/app/graphql/mutations/projects/sync_fork.rb @@ -25,6 +25,8 @@ module Mutations return respond(nil, ['Feature flag is disabled']) unless Feature.enabled?(:synchronize_fork, project.fork_source) + return respond(nil, ['Target branch does not exist']) unless project.repository.branch_exists?(target_branch) + details_resolver = Resolvers::Projects::ForkDetailsResolver.new(object: project, context: context, field: nil) details = details_resolver.resolve(ref: target_branch) diff --git a/app/graphql/resolvers/projects/fork_details_resolver.rb b/app/graphql/resolvers/projects/fork_details_resolver.rb index 68ac0397787..620ce395915 100644 --- a/app/graphql/resolvers/projects/fork_details_resolver.rb +++ b/app/graphql/resolvers/projects/fork_details_resolver.rb @@ -14,7 +14,6 @@ module Resolvers def resolve(**args) return unless project.forked? return unless authorized_fork_source? - return unless project.repository.branch_exists?(args[:ref]) ::Projects::Forks::Details.new(project, args[:ref]) end diff --git a/app/helpers/auth_helper.rb b/app/helpers/auth_helper.rb index 00cf8e395bb..b25f80440a9 100644 --- a/app/helpers/auth_helper.rb +++ b/app/helpers/auth_helper.rb @@ -45,10 +45,11 @@ module AuthHelper provider_has_builtin_icon?(name) || provider_has_custom_icon?(name) end - def qa_class_for_provider(provider) + def qa_selector_for_provider(provider) { - github: 'qa-github-login-button', - saml: 'qa-saml-login-button' + saml: 'saml_login_button', + openid_connect: 'oidc_login_button', + github: 'qa-github-login-button' }[provider.to_sym] end diff --git a/app/models/vulnerability.rb b/app/models/vulnerability.rb index 8bb598ee316..650e8942132 100644 --- a/app/models/vulnerability.rb +++ b/app/models/vulnerability.rb @@ -7,6 +7,8 @@ class Vulnerability < ApplicationRecord alias_attribute :vulnerability_id, :id + scope :with_projects, -> { includes(:project) } + def self.link_reference_pattern nil end diff --git a/app/views/admin/applications/_form.html.haml b/app/views/admin/applications/_form.html.haml index da5a253041a..a8d5a45041d 100644 --- a/app/views/admin/applications/_form.html.haml +++ b/app/views/admin/applications/_form.html.haml @@ -4,13 +4,13 @@ = content_tag :div, class: 'form-group row' do .col-12 = f.label :name - = f.text_field :name, class: 'form-control gl-form-input' + = f.text_field :name, class: 'form-control gl-form-input', data: { qa_selector: 'name_field' } = doorkeeper_errors_for application, :name = content_tag :div, class: 'form-group row' do .col-12 = f.label :redirect_uri - = f.text_area :redirect_uri, class: 'form-control gl-form-input' + = f.text_area :redirect_uri, class: 'form-control gl-form-input', data: { qa_selector: 'redirect_uri_field' } = doorkeeper_errors_for application, :redirect_uri %span.form-text.text-muted Use one line per URI @@ -18,7 +18,7 @@ = content_tag :div, class: 'form-group row' do .col-12 = f.label :trusted - = f.gitlab_ui_checkbox_component :trusted, _('Trusted applications are automatically authorized on GitLab OAuth flow. It\'s highly recommended for the security of users that trusted applications have the confidential setting set to true.') + = f.gitlab_ui_checkbox_component :trusted, _('Trusted applications are automatically authorized on GitLab OAuth flow. It\'s highly recommended for the security of users that trusted applications have the confidential setting set to true.'), checkbox_options: { data: { qa_selector: 'trusted_checkbox' } } = content_tag :div, class: 'form-group row' do .col-12 @@ -31,5 +31,5 @@ = render 'shared/tokens/scopes_form', prefix: 'doorkeeper_application', token: application, scopes: @scopes, f: f .gl-mt-5 - = f.submit _('Save application'), pajamas_button: true + = f.submit _('Save application'), pajamas_button: true, data: { qa_selector: 'save_application_button' } = link_to _('Cancel'), admin_applications_path, class: "gl-button btn btn-default btn-cancel" diff --git a/app/views/admin/applications/index.html.haml b/app/views/admin/applications/index.html.haml index 4f7eead71f3..60aa7ae1c56 100644 --- a/app/views/admin/applications/index.html.haml +++ b/app/views/admin/applications/index.html.haml @@ -14,12 +14,12 @@ .gl-max-w-full.gl-m-auto %h1.h4.gl-font-size-h-display= s_('AdminArea|No applications found') - = render Pajamas::ButtonComponent.new(href: new_admin_application_path, variant: :confirm) do + = render Pajamas::ButtonComponent.new(href: new_admin_application_path, variant: :confirm, button_options: { data: { qa_selector: 'new_application_button' } }) do = s_('New application') - else %hr - = render Pajamas::ButtonComponent.new(href: new_admin_application_path, variant: :confirm) do + = render Pajamas::ButtonComponent.new(href: new_admin_application_path, variant: :confirm, button_options: { data: { qa_selector: 'new_application_button' } }) do = s_('New application') .table-responsive diff --git a/app/views/devise/shared/_omniauth_box.html.haml b/app/views/devise/shared/_omniauth_box.html.haml index d89a853b85b..150f61a97e0 100644 --- a/app/views/devise/shared/_omniauth_box.html.haml +++ b/app/views/devise/shared/_omniauth_box.html.haml @@ -7,7 +7,7 @@ .gl-display-flex.gl-flex-wrap{ class: restyle_login_page_enabled ? 'gl-justify-content-center' : 'gl-justify-content-between' } - providers.each do |provider| - has_icon = provider_has_icon?(provider) - = button_to omniauth_authorize_path(:user, provider), id: "oauth-login-#{provider}", class: "btn gl-button btn-default gl-ml-2 gl-mr-2 gl-mb-2 js-oauth-login #{qa_class_for_provider(provider)} #{'gl-w-full' unless restyle_login_page_enabled}", form: { class: restyle_login_page_enabled ? 'gl-mb-3' : 'gl-w-full gl-mb-3' } do + = button_to omniauth_authorize_path(:user, provider), id: "oauth-login-#{provider}", data: { qa_selector: "#{qa_selector_for_provider(provider)}" }, class: "btn gl-button btn-default gl-ml-2 gl-mr-2 gl-mb-2 js-oauth-login #{'gl-w-full' unless restyle_login_page_enabled}", form: { class: restyle_login_page_enabled ? 'gl-mb-3' : 'gl-w-full gl-mb-3' } do - if has_icon = provider_image_tag(provider) %span.gl-button-text diff --git a/app/views/devise/shared/_signup_omniauth_provider_list.haml b/app/views/devise/shared/_signup_omniauth_provider_list.haml index a96c8d6358b..99428708b20 100644 --- a/app/views/devise/shared/_signup_omniauth_provider_list.haml +++ b/app/views/devise/shared/_signup_omniauth_provider_list.haml @@ -5,7 +5,7 @@ = _("Register with:") .gl-text-center.gl-w-90p.gl-ml-auto.gl-mr-auto - providers.each do |provider| - = link_to omniauth_authorize_path(:user, provider, register_omniauth_params), method: :post, class: "btn gl-button btn-default gl-ml-2 gl-mr-2 gl-mb-2 js-oauth-login #{qa_class_for_provider(provider)}", data: { provider: provider }, id: "oauth-login-#{provider}" do + = link_to omniauth_authorize_path(:user, provider, register_omniauth_params), method: :post, class: "btn gl-button btn-default gl-ml-2 gl-mr-2 gl-mb-2 js-oauth-login #{qa_selector_for_provider(provider)}", data: { provider: provider }, id: "oauth-login-#{provider}" do - if provider_has_icon?(provider) = provider_image_tag(provider) %span.gl-button-text @@ -15,7 +15,7 @@ = _("Create an account using:") .gl-display-flex.gl-justify-content-between.gl-flex-wrap - providers.each do |provider| - = link_to omniauth_authorize_path(:user, provider, register_omniauth_params), method: :post, class: "btn gl-button btn-default gl-w-full gl-mb-3 js-oauth-login #{qa_class_for_provider(provider)}", data: { provider: provider }, id: "oauth-login-#{provider}" do + = link_to omniauth_authorize_path(:user, provider, register_omniauth_params), method: :post, class: "btn gl-button btn-default gl-w-full gl-mb-3 js-oauth-login #{qa_selector_for_provider(provider)}", data: { provider: provider }, id: "oauth-login-#{provider}" do - if provider_has_icon?(provider) = provider_image_tag(provider) %span.gl-button-text diff --git a/app/views/import/_githubish_status.html.haml b/app/views/import/_githubish_status.html.haml index 4d2186a1352..8545b5fd71d 100644 --- a/app/views/import/_githubish_status.html.haml +++ b/app/views/import/_githubish_status.html.haml @@ -5,6 +5,7 @@ - paginatable = local_assigns.fetch(:paginatable, false) - default_namespace_path = (local_assigns[:default_namespace] || current_user.namespace).full_path - cancel_path = local_assigns.fetch(:cancel_path, nil) +- details_path = local_assigns.fetch(:details_path, nil) - provider_title = Gitlab::ImportSources.title(local_assigns.fetch(:provider)) - optional_stages = local_assigns.fetch(:optional_stages, []) @@ -19,6 +20,7 @@ default_target_namespace: default_namespace_path, import_path: url_for([:import, provider, { format: :json }]), cancel_path: cancel_path, + details_path: details_path, filterable: filterable.to_s, paginatable: paginatable.to_s, optional_stages: optional_stages.to_json }.merge(extra_data) } diff --git a/app/views/import/github/status.html.haml b/app/views/import/github/status.html.haml index 4a9f8be35c3..45b5a9408be 100644 --- a/app/views/import/github/status.html.haml +++ b/app/views/import/github/status.html.haml @@ -11,4 +11,5 @@ provider: 'github', paginatable: paginatable, default_namespace: @namespace, cancel_path: cancel_import_github_path, + details_path: details_import_github_path, optional_stages: Gitlab::GithubImport::Settings.stages_array diff --git a/app/views/projects/_remove_fork.html.haml b/app/views/projects/_remove_fork.html.haml index 89ddfa098c8..260c2b2272e 100644 --- a/app/views/projects/_remove_fork.html.haml +++ b/app/views/projects/_remove_fork.html.haml @@ -7,5 +7,5 @@ = form_for @project, url: remove_fork_project_path(@project), method: :delete, html: { id: remove_form_id } do |f| %p - %strong= _('Once removed, the fork relationship cannot be restored. This project will no longer be able to receive or send merge requests to the source project or other forks.') + %strong= _('After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks.') .js-confirm-danger{ data: remove_fork_project_confirm_json(@project, remove_form_id) } diff --git a/app/views/shared/doorkeeper/applications/_show.html.haml b/app/views/shared/doorkeeper/applications/_show.html.haml index 6bebbe94a55..b9095e2a1a1 100644 --- a/app/views/shared/doorkeeper/applications/_show.html.haml +++ b/app/views/shared/doorkeeper/applications/_show.html.haml @@ -8,7 +8,7 @@ %td .clipboard-group .input-group - %input.label.label-monospace.monospace{ id: "application_id", type: "text", autocomplete: 'off', value: @application.uid, readonly: true } + %input.label.label-monospace.monospace{ id: "application_id", type: "text", autocomplete: 'off', value: @application.uid, readonly: true, data: { qa_selector: 'application_id_field' } } .input-group-append = clipboard_button(target: '#application_id', title: _("Copy ID"), class: "gl-button btn btn-default") %tr @@ -46,3 +46,6 @@ = link_to _('Continue'), index_path, class: 'btn btn-confirm btn-md gl-button gl-mr-3' = link_to _('Edit'), edit_path, class: 'btn btn-default btn-md gl-button' = render 'shared/doorkeeper/applications/delete_form', path: delete_path + +-# Create a hidden field to save the ID of application created += hidden_field_tag(:id_of_application, @application.id, data: { qa_selector: 'id_of_application_field' }) |