summaryrefslogtreecommitdiff
path: root/app/views/admin
diff options
context:
space:
mode:
Diffstat (limited to 'app/views/admin')
-rw-r--r--app/views/admin/application_settings/_account_and_limit.html.haml6
-rw-r--r--app/views/admin/application_settings/_issue_limits.html.haml4
-rw-r--r--app/views/admin/application_settings/_note_limits.html.haml2
-rw-r--r--app/views/admin/application_settings/_pipeline_limits.html.haml9
-rw-r--r--app/views/admin/application_settings/_prometheus.html.haml21
-rw-r--r--app/views/admin/application_settings/_registry.html.haml1
-rw-r--r--app/views/admin/application_settings/_repository_storage.html.haml14
-rw-r--r--app/views/admin/application_settings/_runner_registrars_form.html.haml18
-rw-r--r--app/views/admin/application_settings/_signin.html.haml61
-rw-r--r--app/views/admin/application_settings/_usage.html.haml4
-rw-r--r--app/views/admin/application_settings/_users_api_limits.html.haml2
-rw-r--r--app/views/admin/application_settings/_visibility_and_access.html.haml19
-rw-r--r--app/views/admin/application_settings/ci/_header.html.haml2
-rw-r--r--app/views/admin/application_settings/ci_cd.html.haml4
-rw-r--r--app/views/admin/application_settings/general.html.haml4
-rw-r--r--app/views/admin/application_settings/metrics_and_profiling.html.haml4
-rw-r--r--app/views/admin/application_settings/network.html.haml12
-rw-r--r--app/views/admin/application_settings/service_usage_data.html.haml4
-rw-r--r--app/views/admin/applications/_form.html.haml16
-rw-r--r--app/views/admin/background_migrations/_job.html.haml10
-rw-r--r--app/views/admin/background_migrations/_migration.html.haml10
-rw-r--r--app/views/admin/background_migrations/_migration_full_information.html.haml21
-rw-r--r--app/views/admin/background_migrations/index.html.haml29
-rw-r--r--app/views/admin/background_migrations/show.html.haml39
-rw-r--r--app/views/admin/batched_jobs/_job.html.haml17
-rw-r--r--app/views/admin/batched_jobs/_transition_log.html.haml13
-rw-r--r--app/views/admin/batched_jobs/show.html.haml36
-rw-r--r--app/views/admin/broadcast_messages/_form.html.haml2
-rw-r--r--app/views/admin/broadcast_messages/index.html.haml2
-rw-r--r--app/views/admin/dashboard/_security_newsletter_callout.html.haml6
-rw-r--r--app/views/admin/groups/_form.html.haml4
-rw-r--r--app/views/admin/groups/show.html.haml2
-rw-r--r--app/views/admin/projects/show.html.haml4
-rw-r--r--app/views/admin/requests_profiles/index.html.haml22
-rw-r--r--app/views/admin/runners/edit.html.haml130
-rw-r--r--app/views/admin/runners/show.html.haml2
-rw-r--r--app/views/admin/sessions/_new_base.html.haml2
-rw-r--r--app/views/admin/sessions/_signin_box.html.haml2
-rw-r--r--app/views/admin/sessions/_two_factor_otp.html.haml2
-rw-r--r--app/views/admin/sessions/new.html.haml2
-rw-r--r--app/views/admin/sessions/two_factor.html.haml4
-rw-r--r--app/views/admin/topics/_form.html.haml11
-rw-r--r--app/views/admin/topics/_topic.html.haml5
-rw-r--r--app/views/admin/users/_users.html.haml4
44 files changed, 338 insertions, 250 deletions
diff --git a/app/views/admin/application_settings/_account_and_limit.html.haml b/app/views/admin/application_settings/_account_and_limit.html.haml
index a0fa69c54c5..f914de138a9 100644
--- a/app/views/admin/application_settings/_account_and_limit.html.haml
+++ b/app/views/admin/application_settings/_account_and_limit.html.haml
@@ -19,6 +19,10 @@
= f.label :receive_max_input_size, _('Maximum push size (MB)'), class: 'label-light'
= f.number_field :receive_max_input_size, class: 'form-control gl-form-input qa-receive-max-input-size-field', title: _('Maximum size limit for a single commit.'), data: { toggle: 'tooltip', container: 'body' }
.form-group
+ = f.label :max_export_size, _('Maximum export size (MB)'), class: 'label-light'
+ = f.number_field :max_export_size, class: 'form-control gl-form-input', title: _('Maximum size of export files.'), data: { toggle: 'tooltip', container: 'body' }
+ %span.form-text.text-muted= _('Set to 0 for no size limit.')
+ .form-group
= f.label :max_import_size, _('Maximum import size (MB)'), class: 'label-light'
= f.number_field :max_import_size, class: 'form-control gl-form-input qa-receive-max-import-size-field', title: _('Maximum size of import files.'), data: { toggle: 'tooltip', container: 'body' }
%span.form-text.text-muted= _('Only effective when remote storage is enabled. Set to 0 for no size limit.')
@@ -29,9 +33,7 @@
= render_if_exists 'admin/application_settings/git_two_factor_session_expiry', form: f
= render_if_exists 'admin/application_settings/personal_access_token_expiration_policy', form: f
- = render_if_exists 'admin/application_settings/enforce_pat_expiration', form: f
= render_if_exists 'admin/application_settings/ssh_key_expiration_policy', form: f
- = render_if_exists 'admin/application_settings/enforce_ssh_key_expiration', form: f
.form-group
= f.label :user_oauth_applications, _('User OAuth applications'), class: 'label-bold'
diff --git a/app/views/admin/application_settings/_issue_limits.html.haml b/app/views/admin/application_settings/_issue_limits.html.haml
index 663e1485749..431e2a64c46 100644
--- a/app/views/admin/application_settings/_issue_limits.html.haml
+++ b/app/views/admin/application_settings/_issue_limits.html.haml
@@ -1,9 +1,9 @@
-= form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-issue-limits-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-issue-limits-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
.form-group
- = f.label :issues_create_limit, 'Max requests per minute per user', class: 'label-bold'
+ = f.label :issues_create_limit, _('Maximum number of requests per minute')
= f.number_field :issues_create_limit, class: 'form-control gl-form-input'
= f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/admin/application_settings/_note_limits.html.haml b/app/views/admin/application_settings/_note_limits.html.haml
index d4ae0d3944c..40760b3c45e 100644
--- a/app/views/admin/application_settings/_note_limits.html.haml
+++ b/app/views/admin/application_settings/_note_limits.html.haml
@@ -9,7 +9,7 @@
= f.label :notes_create_limit_allowlist, _('Users to exclude from the rate limit'), class: 'label-bold'
= f.text_area :notes_create_limit_allowlist_raw, class: 'form-control gl-form-input', rows: 5, aria: { describedBy: 'note-create-limits-allowlist-field-description' }
.form-text.text-muted{ id: 'note-create-limits-allowlist-field-description' }
- = _('List of users allowed to exceed the rate limit.')
+ = _('List of users who are allowed to exceed the rate limit. Example: username1, username2')
= f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/admin/application_settings/_pipeline_limits.html.haml b/app/views/admin/application_settings/_pipeline_limits.html.haml
new file mode 100644
index 00000000000..e93823172db
--- /dev/null
+++ b/app/views/admin/application_settings/_pipeline_limits.html.haml
@@ -0,0 +1,9 @@
+= gitlab_ui_form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-pipeline-limits-settings'), html: { class: 'fieldset-form' } do |f|
+ = form_errors(@application_setting)
+
+ %fieldset
+ .form-group
+ = f.label :pipeline_limit_per_project_user_sha, _('Maximum number of requests per minute')
+ = f.number_field :pipeline_limit_per_project_user_sha, class: 'form-control gl-form-input'
+
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/admin/application_settings/_prometheus.html.haml b/app/views/admin/application_settings/_prometheus.html.haml
index 11830fac336..59681c0278e 100644
--- a/app/views/admin/application_settings/_prometheus.html.haml
+++ b/app/views/admin/application_settings/_prometheus.html.haml
@@ -1,20 +1,17 @@
-= form_for @application_setting, url: metrics_and_profiling_admin_application_settings_path(anchor: 'js-prometheus-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: metrics_and_profiling_admin_application_settings_path(anchor: 'js-prometheus-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
.form-group
- .form-check
- = f.check_box :prometheus_metrics_enabled, class: 'form-check-input'
- = f.label :prometheus_metrics_enabled, class: 'form-check-label' do
- = _("Enable health and performance metrics endpoint")
- .form-text.text-muted
- = _('Enable a Prometheus endpoint that exposes health and performance statistics. The Health Check menu item appears in the Monitoring section of the Admin Area. Restart required.')
- = link_to _('Learn More.'), help_page_path('administration/monitoring/prometheus/gitlab_metrics.md'), target: '_blank', rel: 'noopener noreferrer'
+ - prometheus_help_link_url = help_page_path('administration/monitoring/prometheus/gitlab_metrics')
+ - prometheus_help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: prometheus_help_link_url }
+ = f.gitlab_ui_checkbox_component :prometheus_metrics_enabled,
+ _('Enable health and performance metrics endpoint'),
+ help_text: s_('AdminSettings|Enable a Prometheus endpoint that exposes health and performance statistics. The Health Check menu item appears in the Monitoring section of the Admin Area. Restart required. %{link_start}Learn more.%{link_end}').html_safe % { link_start: prometheus_help_link_start, link_end: '</a>'.html_safe }
+ .form-text.gl-text-gray-500.gl-pl-6
- unless Gitlab::Metrics.metrics_folder_present?
- .form-text.text-muted
- %strong.cred= _("WARNING:")
- = _("Environment variable %{environment_variable} does not exist or is not pointing to a valid directory.").html_safe % { environment_variable: '<code>prometheus_multiproc_dir</code>'.html_safe }
- = link_to sprite_icon('question-o'), help_page_path('administration/monitoring/prometheus/gitlab_metrics', anchor: 'metrics-shared-directory')
+ - icon_link = link_to sprite_icon('question-o'), help_page_path('administration/monitoring/prometheus/gitlab_metrics', anchor: 'metrics-shared-directory'), target: '_blank', rel: 'noopener noreferrer'
+ = s_('AdminSettings|%{strongStart}WARNING:%{strongEnd} Environment variable %{environment_variable} does not exist or is not pointing to a valid directory. %{icon_link}').html_safe % { strongStart: '<strong class="gl-text-red-500">'.html_safe, strongEnd: '</strong>'.html_safe, environment_variable: '<code>prometheus_multiproc_dir</code>'.html_safe, icon_link: icon_link }
.form-group
= f.label :metrics_method_call_threshold, _('Method call threshold (ms)'), class: 'label-bold'
= f.number_field :metrics_method_call_threshold, class: 'form-control gl-form-input'
diff --git a/app/views/admin/application_settings/_registry.html.haml b/app/views/admin/application_settings/_registry.html.haml
index eb1f94a2f04..856db32e088 100644
--- a/app/views/admin/application_settings/_registry.html.haml
+++ b/app/views/admin/application_settings/_registry.html.haml
@@ -13,7 +13,6 @@
= f.gitlab_ui_checkbox_component :container_expiration_policies_enable_historic_entries,
'%{label} %{label_link}'.html_safe % { label: label, label_link: label_link },
help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link }
- - if container_registry_expiration_policies_throttling?
.form-group
= f.label :container_registry_delete_tags_service_timeout, _('Cleanup policy maximum processing time (seconds)'), class: 'label-bold'
= f.number_field :container_registry_delete_tags_service_timeout, min: 0, class: 'form-control gl-form-input'
diff --git a/app/views/admin/application_settings/_repository_storage.html.haml b/app/views/admin/application_settings/_repository_storage.html.haml
index 62a90e173ec..b5fa08aed79 100644
--- a/app/views/admin/application_settings/_repository_storage.html.haml
+++ b/app/views/admin/application_settings/_repository_storage.html.haml
@@ -1,16 +1,16 @@
-= form_for @application_setting, url: repository_admin_application_settings_path(anchor: 'js-repository-storage-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: repository_admin_application_settings_path(anchor: 'js-repository-storage-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
.sub-section
%h4= _('Hashed repository storage paths')
.form-group
- .form-check
- = f.check_box :hashed_storage_enabled, class: 'form-check-input qa-hashed-storage-checkbox', disabled: @application_setting.hashed_storage_enabled?
- = f.label :hashed_storage_enabled, _('Use hashed storage'), class: 'label-bold form-check-label'
- .form-text.text-muted
- = _('Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0.')
- = link_to s_('Learn more.'), help_page_path('administration/repository_storage_types.md', anchor: 'hashed-storage'), target: '_blank', rel: 'noopener noreferrer'
+ - repository_storage_help_link_url = help_page_path('administration/repository_storage_types.md')
+ - repository_storage_help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: repository_storage_help_link_url }
+ = f.gitlab_ui_checkbox_component :hashed_storage_enabled,
+ _('Use hashed storage'),
+ checkbox_options: { disabled: @application_setting.hashed_storage_enabled? },
+ help_text: _('Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0. %{link_start}Learn more.%{link_end}').html_safe % { link_start: repository_storage_help_link_start, link_end: '</a>'.html_safe }
.sub-section
%h4= _("Storage nodes for new repositories")
diff --git a/app/views/admin/application_settings/_runner_registrars_form.html.haml b/app/views/admin/application_settings/_runner_registrars_form.html.haml
index 08b3d173d20..1d6051a06ea 100644
--- a/app/views/admin/application_settings/_runner_registrars_form.html.haml
+++ b/app/views/admin/application_settings/_runner_registrars_form.html.haml
@@ -1,16 +1,16 @@
-= form_for @application_setting, url: ci_cd_admin_application_settings_path(anchor: 'js-runner-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: ci_cd_admin_application_settings_path(anchor: 'js-runner-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
- .form-group
- = hidden_field_tag "application_setting[valid_runner_registrars][]", nil
- - ApplicationSetting::VALID_RUNNER_REGISTRAR_TYPES.each do |type|
- .form-check
- = f.check_box(:valid_runner_registrars, { multiple: true, checked: valid_runner_registrars.include?(type), class: 'form-check-input' }, type, nil)
- = f.label :valid_runner_registrars, class: 'form-check-label' do
- = s_("Runners|Members of the %{type} can register runners") % { type: type }
- %span.form-text.gl-text-gray-600
+ .gl-form-group
+ %span.form-text.gl-mb-3.gl-mt-0
= _('If no options are selected, only administrators can register runners.')
= link_to _('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'prevent-users-from-registering-runners'), target: '_blank', rel: 'noopener noreferrer'
+ = hidden_field_tag "application_setting[valid_runner_registrars][]", nil
+ - ApplicationSetting::VALID_RUNNER_REGISTRAR_TYPES.each do |type|
+ = f.gitlab_ui_checkbox_component :valid_runner_registrars, s_("Runners|Members of the %{type} can register runners") % { type: type },
+ checkbox_options: { multiple: true, checked: valid_runner_registrars.include?(type) },
+ checked_value: type,
+ unchecked_value: nil
= f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_signin.html.haml b/app/views/admin/application_settings/_signin.html.haml
index bce210d28d3..48f0b9b2c31 100644
--- a/app/views/admin/application_settings/_signin.html.haml
+++ b/app/views/admin/application_settings/_signin.html.haml
@@ -1,39 +1,28 @@
-= form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-signin-settings'), html: { class: 'fieldset-form', id: 'signin-settings' } do |f|
+= gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-signin-settings'), html: { class: 'fieldset-form', id: 'signin-settings' } do |f|
= form_errors(@application_setting)
%fieldset
.form-group
- .form-check
- = f.check_box :password_authentication_enabled_for_web, class: 'form-check-input'
- = f.label :password_authentication_enabled_for_web, class: 'form-check-label' do
- = _('Allow password authentication for the web interface')
- .form-text.text-muted
- = _('Clear this checkbox to use an external authentication provider instead.')
+ = f.gitlab_ui_checkbox_component :password_authentication_enabled_for_web,
+ _('Allow password authentication for the web interface'),
+ help_text: _('Clear this checkbox to use an external authentication provider instead.')
.form-group
- .form-check
- = f.check_box :password_authentication_enabled_for_git, class: 'form-check-input'
- = f.label :password_authentication_enabled_for_git, class: 'form-check-label' do
- = _('Allow password authentication for Git over HTTP(S)')
- .form-text.text-muted
- - if Gitlab::Auth::Ldap::Config.enabled?
- = _('Clear this checkbox to use a personal access token or LDAP password instead.')
- - else
- = _('Clear this checkbox to use a personal access token instead.')
+ = f.gitlab_ui_checkbox_component :password_authentication_enabled_for_git,
+ _('Allow password authentication for Git over HTTP(S)'),
+ help_text: Gitlab::Auth::Ldap::Config.enabled? ? _('Clear this checkbox to use a personal access token or LDAP password instead.') : _('Clear this checkbox to use a personal access token instead.')
- if omniauth_enabled? && button_based_providers.any?
%fieldset.form-group
%legend.gl-font-base.gl-mb-3.gl-border-none.gl-font-weight-bold= _('Enabled OAuth authentication sources')
= hidden_field_tag 'application_setting[enabled_oauth_sign_in_sources][]'
- - oauth_providers_checkboxes.each do |source|
+ - oauth_providers_checkboxes(f).each do |source|
= source
.form-group
= f.label :two_factor_authentication, _('Two-factor authentication'), class: 'label-bold'
- .form-check
- = f.check_box :require_two_factor_authentication, class: 'form-check-input'
- = f.label :require_two_factor_authentication, class: 'form-check-label' do
- = _('Enforce two-factor authentication')
- %p.form-text.text-muted
- = _('Enforce two-factor authentication for all user sign-ins.')
- = link_to _('Learn more.'), help_page_path('security/two_factor_authentication.md'), target: '_blank', rel: 'noopener noreferrer'
+ - help_text = _('Enforce two-factor authentication for all user sign-ins.')
+ - help_link = link_to _('Learn more.'), help_page_path('security/two_factor_authentication.md'), target: '_blank', rel: 'noopener noreferrer'
+ = f.gitlab_ui_checkbox_component :require_two_factor_authentication,
+ _('Enforce two-factor authentication'),
+ help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link }
.form-group
= f.label :two_factor_authentication, _('Two-factor grace period'), class: 'label-bold'
= f.number_field :two_factor_grace_period, min: 0, class: 'form-control gl-form-input', placeholder: '0'
@@ -42,22 +31,18 @@
.form-group
= f.label :admin_mode, _('Admin Mode'), class: 'label-bold'
= sprite_icon('lock', css_class: 'gl-icon')
- .form-check
- = f.check_box :admin_mode, class: 'form-check-input'
- = f.label :admin_mode, class: 'form-check-label' do
- = _('Enable admin mode')
- %p.form-text.text-muted
- = _('Require additional authentication for administrative tasks.')
- = link_to _('Learn more.'), help_page_path('user/admin_area/settings/sign_in_restrictions', anchor: 'admin-mode'), target: '_blank', rel: 'noopener noreferrer'
+ - help_text = _('Require additional authentication for administrative tasks.')
+ - help_link = link_to _('Learn more.'), help_page_path('user/admin_area/settings/sign_in_restrictions', anchor: 'admin-mode'), target: '_blank', rel: 'noopener noreferrer'
+ = f.gitlab_ui_checkbox_component :admin_mode,
+ _('Enable admin mode'),
+ help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link }
.form-group
= f.label :unknown_sign_in, _('Email notification for unknown sign-ins'), class: 'label-bold'
- .form-check
- = f.check_box :notify_on_unknown_sign_in, class: 'form-check-input'
- = f.label :notify_on_unknown_sign_in, class: 'form-check-label' do
- = _('Enable email notification')
- %p.form-text.text-muted
- = _('Notify users by email when sign-in location is not recognized.')
- = link_to _('Learn more.'), help_page_path('user/profile/unknown_sign_in_notification.md'), target: '_blank', rel: 'noopener noreferrer'
+ - help_text = _('Notify users by email when sign-in location is not recognized.')
+ - help_link = link_to _('Learn more.'), help_page_path('user/profile/unknown_sign_in_notification.md'), target: '_blank', rel: 'noopener noreferrer'
+ = f.gitlab_ui_checkbox_component :notify_on_unknown_sign_in,
+ _('Enable email notification'),
+ help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link }
.form-group
= f.label :home_page_url, _('Home page URL'), class: 'label-bold'
= f.text_field :home_page_url, class: 'form-control gl-form-input', placeholder: 'http://company.example.com', :'aria-describedby' => 'home_help_block'
diff --git a/app/views/admin/application_settings/_usage.html.haml b/app/views/admin/application_settings/_usage.html.haml
index a1285a3f467..8b4ac9b79c8 100644
--- a/app/views/admin/application_settings/_usage.html.haml
+++ b/app/views/admin/application_settings/_usage.html.haml
@@ -13,7 +13,7 @@
.form-group
- can_be_configured = @application_setting.usage_ping_can_be_configured?
- service_ping_link_start = link_start % { url: help_page_path('development/service_ping/index') }
- - deactivating_service_ping_link_start = link_start % { url: help_page_path('development/service_ping/index', anchor: 'disable-service-ping-using-the-configuration-file') }
+ - deactivating_service_ping_link_start = link_start % { url: help_page_path('user/admin_area/settings/usage_statistics', anchor: 'disable-usage-statistics-with-the-configuration-file') }
- usage_ping_help_text = s_('AdminSettings|To help improve GitLab and its user experience, GitLab periodically collects usage information. %{link_start}What information is shared with GitLab Inc.?%{link_end}').html_safe % { link_start: service_ping_link_start, link_end: link_end }
- disabled_help_text = s_('AdminSettings|Service ping is disabled in your configuration file, and cannot be enabled through this form. For more information, see the documentation on %{link_start}deactivating service ping%{link_end}.').html_safe % { link_start: deactivating_service_ping_link_start, link_end: link_end }
= f.gitlab_ui_checkbox_component :usage_ping_enabled, s_('AdminSettings|Enable Service Ping'),
@@ -28,7 +28,7 @@
.form-group
- usage_ping_enabled = @application_setting.usage_ping_enabled?
- label = s_('AdminSettings|Enable Registration Features')
- - label_link = link_to sprite_icon('question-o'), help_page_path('development/service_ping/index', anchor: 'registration-features-program')
+ - label_link = link_to sprite_icon('question-o'), help_page_path('user/admin_area/settings/usage_statistics', anchor: 'registration-features-program')
- help_text = usage_ping_enabled ? s_('AdminSettings|You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in the future, you will also need to register with GitLab via a new cloud licensing service.') : s_('AdminSettings|To enable Registration Features, first enable Service Ping.')
= f.gitlab_ui_checkbox_component :usage_ping_features_enabled?, '%{label} %{label_link}'.html_safe % { label: label, label_link: label_link },
help_text: '<span id="service_ping_features_helper_text">%{help_text}</span>'.html_safe % { help_text: help_text },
diff --git a/app/views/admin/application_settings/_users_api_limits.html.haml b/app/views/admin/application_settings/_users_api_limits.html.haml
index 9b3502b3cfd..3918c76b12c 100644
--- a/app/views/admin/application_settings/_users_api_limits.html.haml
+++ b/app/views/admin/application_settings/_users_api_limits.html.haml
@@ -9,6 +9,6 @@
= f.label :users_get_by_id_limit_allowlist_raw, _('Users to exclude from the rate limit'), class: 'label-bold'
= f.text_area :users_get_by_id_limit_allowlist_raw, class: 'form-control gl-form-input', rows: 5, aria: { describedBy: 'users-api-limit-users-allowlist-field-description' }
.form-text.text-muted{ id: 'users-api-limit-users-allowlist-field-description' }
- = _('List of users allowed to exceed the rate limit.')
+ = _('List of users who are allowed to exceed the rate limit. Example: username1, username2')
= f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/admin/application_settings/_visibility_and_access.html.haml b/app/views/admin/application_settings/_visibility_and_access.html.haml
index 23649bc2d54..e3c044ff979 100644
--- a/app/views/admin/application_settings/_visibility_and_access.html.haml
+++ b/app/views/admin/application_settings/_visibility_and_access.html.haml
@@ -16,29 +16,30 @@
= 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)
.form-group
- = f.label :restricted_visibility_levels, class: 'label-bold'
+ = f.label :restricted_visibility_levels, class: 'label-bold gl-mb-0'
+ %span.form-text.gl-mt-0.gl-mb-3#restricted-visibility-help
+ = _('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.')
= hidden_field_tag 'application_setting[restricted_visibility_levels][]'
- restricted_level_checkboxes(f).each do |level|
= level
- %span.form-text.text-muted#restricted-visibility-help
- = _('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.')
.form-group
- = f.label :import_sources, class: 'label-bold'
- = hidden_field_tag 'application_setting[import_sources][]'
- - import_sources_checkboxes(f).each do |source|
- = source
- %span.form-text.text-muted#import-sources-help
+ = f.label :import_sources, s_('AdminSettings|Import sources'), class: 'label-bold gl-mb-0'
+ %span.form-text.gl-mt-0.gl-mb-3#import-sources-help
= _('Enabled sources for code import during project creation. OmniAuth must be configured for GitHub')
= link_to sprite_icon('question-o'), help_page_path("integration/github")
, Bitbucket
= link_to sprite_icon('question-o'), help_page_path("integration/bitbucket")
and GitLab.com
= link_to sprite_icon('question-o'), help_page_path("integration/gitlab")
+ = hidden_field_tag 'application_setting[import_sources][]'
+ - import_sources_checkboxes(f).each do |source|
+ = source
= render_if_exists 'admin/application_settings/ldap_access_setting', form: f
.form-group
- = f.gitlab_ui_checkbox_component :project_export_enabled, s_('AdminSettings|Project export enabled')
+ = f.label :project_export, s_('AdminSettings|Project export'), class: 'label-bold'
+ = f.gitlab_ui_checkbox_component :project_export_enabled, s_('AdminSettings|Enabled')
.form-group
%label.label-bold= _('Enabled Git access protocols')
diff --git a/app/views/admin/application_settings/ci/_header.html.haml b/app/views/admin/application_settings/ci/_header.html.haml
index 1298be9a6cb..a22e67b0522 100644
--- a/app/views/admin/application_settings/ci/_header.html.haml
+++ b/app/views/admin/application_settings/ci/_header.html.haml
@@ -13,7 +13,7 @@
= _('Variables can be:')
%ul
%li
- = html_escape(_('%{code_open}Protected:%{code_close} Only exposed to protected branches or tags.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
+ = html_escape(_('%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
%li
= html_escape(_('%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
= link_to _('Learn more.'), help_page_path('ci/variables/index', anchor: 'mask-a-cicd-variable'), target: '_blank', rel: 'noopener noreferrer'
diff --git a/app/views/admin/application_settings/ci_cd.html.haml b/app/views/admin/application_settings/ci_cd.html.haml
index aab4f44d4d7..e925175b7ea 100644
--- a/app/views/admin/application_settings/ci_cd.html.haml
+++ b/app/views/admin/application_settings/ci_cd.html.haml
@@ -8,7 +8,7 @@
.settings-content
- if ci_variable_protected_by_default?
%p.settings-message.text-center
- - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('ci/variables/index', anchor: 'protect-a-cicd-variable') }
+ - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('ci/variables/index', anchor: 'protected-cicd-variables') }
= s_('Environment variables on this GitLab instance are configured to be %{link_start}protected%{link_end} by default.').html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
#js-instance-variables{ data: { endpoint: admin_ci_variables_path, group: 'true', maskable_regex: ci_variable_maskable_regex, protected_by_default: ci_variable_protected_by_default?.to_s} }
@@ -38,7 +38,7 @@
.settings-content
= render 'registry'
-- if Feature.enabled?(:runner_registration_control, default_enabled: :yaml)
+- if Feature.enabled?(:runner_registration_control)
%section.settings.as-runner.no-animate#js-runner-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
%h4
diff --git a/app/views/admin/application_settings/general.html.haml b/app/views/admin/application_settings/general.html.haml
index bc2fedec69c..7643f8fa7a7 100644
--- a/app/views/admin/application_settings/general.html.haml
+++ b/app/views/admin/application_settings/general.html.haml
@@ -93,7 +93,7 @@
%p
= _('Manage Web IDE features.')
.settings-content
- = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: "#js-web-ide-settings"), html: { class: 'fieldset-form', id: 'web-ide-settings' } do |f|
+ = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: "js-web-ide-settings"), html: { class: 'fieldset-form', id: 'web-ide-settings' } do |f|
= form_errors(@application_setting)
%fieldset
@@ -115,4 +115,4 @@
= render 'admin/application_settings/snowplow'
= render 'admin/application_settings/eks'
= render 'admin/application_settings/floc'
-= render_if_exists 'admin/application_settings/license_file'
+= render_if_exists 'admin/application_settings/add_license'
diff --git a/app/views/admin/application_settings/metrics_and_profiling.html.haml b/app/views/admin/application_settings/metrics_and_profiling.html.haml
index 7cb5760f62a..8e4b0b53f28 100644
--- a/app/views/admin/application_settings/metrics_and_profiling.html.haml
+++ b/app/views/admin/application_settings/metrics_and_profiling.html.haml
@@ -53,9 +53,7 @@
.settings-content
= render 'usage'
-= render_if_exists 'admin/application_settings/pseudonymizer_settings', expanded: expanded_by_default?
-
-- if Feature.enabled?(:configure_sentry_in_application_settings, default_enabled: :yaml)
+- if Feature.enabled?(:configure_sentry_in_application_settings)
%section.settings.as-sentry.no-animate#js-sentry-settings{ class: ('expanded' if expanded_by_default?), data: { qa_selector: 'sentry_settings_content' } }
.settings-header
%h4
diff --git a/app/views/admin/application_settings/network.html.haml b/app/views/admin/application_settings/network.html.haml
index ea35b7ab9c4..a2497fe122b 100644
--- a/app/views/admin/application_settings/network.html.haml
+++ b/app/views/admin/application_settings/network.html.haml
@@ -157,4 +157,16 @@
.settings-content
= render 'import_export_limits'
+%section.settings.as-pipeline-limits.no-animate#js-pipeline-limits-settings{ class: ('expanded' if expanded_by_default?) }
+ .settings-header
+ %h4
+ = _('Pipeline creation rate limits')
+ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
+ = expanded_by_default? ? _('Collapse') : _('Expand')
+ %p
+ = _('Limit the number of pipeline creation requests per minute. This limit includes pipelines created through the UI, the API, and by background processing.')
+ = link_to _('Learn more.'), help_page_path('user/admin_area/settings/rate_limit_on_pipelines_creation.md'), target: '_blank', rel: 'noopener noreferrer'
+ .settings-content
+ = render 'pipeline_limits'
+
= render_if_exists 'admin/application_settings/ee_network_settings'
diff --git a/app/views/admin/application_settings/service_usage_data.html.haml b/app/views/admin/application_settings/service_usage_data.html.haml
index ec084c05cf7..55c25ca32d5 100644
--- a/app/views/admin/application_settings/service_usage_data.html.haml
+++ b/app/views/admin/application_settings/service_usage_data.html.haml
@@ -18,9 +18,9 @@
- else
= render Pajamas::AlertComponent.new(variant: :warning,
dismissible: false,
- title: _('Service Ping payload not found in the application cache')) do
+ title: _('Service Ping payload not found in the application cache')) do |c|
- .gl-alert-body
+ = c.body do
- enable_service_ping_link_url = help_page_path('user/admin_area/settings/usage_statistics', anchor: 'enable-or-disable-usage-statistics')
- enable_service_ping_link = '<a href="%{url}">'.html_safe % { url: enable_service_ping_link_url }
- generate_manually_link_url = help_page_path('administration/troubleshooting/gitlab_rails_cheat_sheet', anchor: 'generate-service-ping')
diff --git a/app/views/admin/applications/_form.html.haml b/app/views/admin/applications/_form.html.haml
index 925b3681298..fd73d4c5671 100644
--- a/app/views/admin/applications/_form.html.haml
+++ b/app/views/admin/applications/_form.html.haml
@@ -21,25 +21,13 @@
.col-sm-2.col-form-label.pt-0
= f.label :trusted
.col-sm-10
- = f.check_box :trusted
- %span.form-text.text-muted
- 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.')
= content_tag :div, class: 'form-group row' do
.col-sm-2.col-form-label.pt-0
= f.label :confidential
.col-sm-10
- = f.check_box :confidential
- %span.form-text.text-muted
- = _('The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential.')
-
- = content_tag :div, class: 'form-group row' do
- .col-sm-2.col-form-label.pt-0
- = f.label :expire_access_tokens
- .col-sm-10
- = f.check_box :expire_access_tokens
- %span.form-text.text-muted
- = _('Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility.')
+ = f.gitlab_ui_checkbox_component :confidential, _('The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential.')
.form-group.row
.col-sm-2.col-form-label.pt-0
diff --git a/app/views/admin/background_migrations/_job.html.haml b/app/views/admin/background_migrations/_job.html.haml
new file mode 100644
index 00000000000..e34f73e8b94
--- /dev/null
+++ b/app/views/admin/background_migrations/_job.html.haml
@@ -0,0 +1,10 @@
+%tr{ role: 'row' }
+ %td{ role: 'cell', data: { label: _('Id') } }
+ = link_to admin_background_migration_batched_job_path(job.batched_migration, job, params: { database: params[:database] }) do
+ = job.id
+ %td{ role: 'cell', data: { label: s_('BackgroundMigrations|Started at') } }
+ = job.started_at
+ %td{ role: 'cell', data: { label: s_('BackgroundMigrations|Finished at') } }
+ = job.finished_at
+ %td{ role: 'cell', data: { label: s_('BackgroundMigrations|Batch size') } }
+ = job.batch_size
diff --git a/app/views/admin/background_migrations/_migration.html.haml b/app/views/admin/background_migrations/_migration.html.haml
index 9cef8332259..f4906028e39 100644
--- a/app/views/admin/background_migrations/_migration.html.haml
+++ b/app/views/admin/background_migrations/_migration.html.haml
@@ -1,5 +1,7 @@
%tr{ role: 'row' }
- %td{ role: 'cell', data: { label: _('Migration') } }= migration.job_class_name + ': ' + migration.table_name
+ %td{ role: 'cell', data: { label: _('Migration') } }
+ = link_to admin_background_migration_path(migration, database: params[:database]) do
+ = migration.job_class_name + ': ' + migration.table_name
%td{ role: 'cell', data: { label: _('Progress') } }
- progress = batched_migration_progress(migration, @successful_rows_counts[migration.id])
- if progress
@@ -10,14 +12,14 @@
= gl_badge_tag migration.status_name.to_s.humanize, { size: :sm, variant: batched_migration_status_badge_variant(migration) }
%td{ role: 'cell', data: { label: _('Action') } }
- if migration.active?
- = button_to pause_admin_background_migration_path(migration),
+ = button_to pause_admin_background_migration_path(migration, database: params[:database]),
class: 'gl-button btn btn-icon has-tooltip', title: _('Pause'), 'aria-label' => _('Pause') do
= sprite_icon('pause', css_class: 'gl-button-icon gl-icon')
- elsif migration.paused?
- = button_to resume_admin_background_migration_path(migration),
+ = button_to resume_admin_background_migration_path(migration, database: params[:database]),
class: 'gl-button btn btn-icon has-tooltip', title: _('Resume'), 'aria-label' => _('Resume') do
= sprite_icon('play', css_class: 'gl-button-icon gl-icon')
- elsif migration.failed?
- = button_to retry_admin_background_migration_path(migration),
+ = button_to retry_admin_background_migration_path(migration, database: params[:database]),
class: 'gl-button btn btn-icon has-tooltip', title: _('Retry'), 'aria-label' => _('Retry') do
= sprite_icon('retry', css_class: 'gl-button-icon gl-icon')
diff --git a/app/views/admin/background_migrations/_migration_full_information.html.haml b/app/views/admin/background_migrations/_migration_full_information.html.haml
new file mode 100644
index 00000000000..620274c375f
--- /dev/null
+++ b/app/views/admin/background_migrations/_migration_full_information.html.haml
@@ -0,0 +1,21 @@
+%tr{ role: 'row' }
+ %td{ role: 'cell', data: { label: _('Id') } }
+ = @migration.id
+ %td{ role: 'cell', data: { label: _('Min Value') } }
+ = @migration.min_value
+ %td{ role: 'cell', data: { label: _('Max Value') } }
+ = @migration.max_value
+ %td{ role: 'cell', data: { label: _('Batch size') } }
+ = @migration.batch_size
+ %td{ role: 'cell', data: { label: _('Sub-batch size') } }
+ = @migration.sub_batch_size
+ %td{ role: 'cell', data: { label: _('Interval') } }
+ = @migration.interval
+ %td{ role: 'cell', data: { label: _('Pause time (ms)') } }
+ = @migration.pause_ms
+ %td{ role: 'cell', data: { label: _('Created on') } }
+ = @migration.created_at
+ %td{ role: 'cell', data: { label: _('Last updated') } }
+ = @migration.updated_at
+ %td{ role: 'cell', data: { label: _('Status') } }
+ = gl_badge_tag @migration.status_name.to_s.humanize, { size: :sm, variant: batched_migration_status_badge_variant(@migration) }
diff --git a/app/views/admin/background_migrations/index.html.haml b/app/views/admin/background_migrations/index.html.haml
index afceb6427e0..c8b195219ec 100644
--- a/app/views/admin/background_migrations/index.html.haml
+++ b/app/views/admin/background_migrations/index.html.haml
@@ -1,13 +1,26 @@
-- page_title _('Background Migrations')
+- page_title s_('BackgroundMigrations|Background Migrations')
+- @breadcrumb_link = admin_background_migrations_path(database: params[:database])
+
+.gl-display-flex.gl-sm-flex-direction-column.gl-sm-align-items-flex-end.gl-pb-5.gl-border-b-1.gl-border-b-solid.gl-border-b-gray-100
+ .gl-flex-grow-1
+ %h3= s_('BackgroundMigrations|Background Migrations')
+ %p.light.gl-mb-0
+ - learnmore_link = help_page_path('development/database/batched_background_migrations')
+ - learnmore_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: learnmore_link }
+ = html_escape(s_('BackgroundMigrations|Background migrations are used to perform data migrations whenever a migration exceeds the time limits in our guidelines. %{linkStart}Learn more%{linkEnd}')) % { linkStart: learnmore_link_start, linkEnd: '</a>'.html_safe }
+
+ - if @databases.size > 1
+ .gl-display-flex.gl-align-items-center.gl-flex-grow-0.gl-flex-basis-0.gl-sm-mt-0.gl-mt-5.gl-sm-ml-7.gl-ml-0
+ #js-database-listbox{ data: { databases: @databases, selected_database: @selected_database } }
= gl_tabs_nav do
- = gl_tab_link_to admin_background_migrations_path, item_active: @current_tab == 'queued' do
+ = gl_tab_link_to admin_background_migrations_path({ tab: nil, database: params[:database] }), item_active: @current_tab == 'queued' do
= _('Queued')
= gl_tab_counter_badge limited_counter_with_delimiter(@relations_by_tab['queued'])
- = gl_tab_link_to admin_background_migrations_path(tab: 'failed'), item_active: @current_tab == 'failed' do
+ = gl_tab_link_to admin_background_migrations_path({ tab: 'failed', database: params[:database] }), item_active: @current_tab == 'failed' do
= _('Failed')
= gl_tab_counter_badge limited_counter_with_delimiter(@relations_by_tab['failed'])
- = gl_tab_link_to admin_background_migrations_path(tab: 'finished'), item_active: @current_tab == 'finished' do
+ = gl_tab_link_to admin_background_migrations_path({ tab: 'finished', database: params[:database] }), item_active: @current_tab == 'finished' do
= _('Finished')
= gl_tab_counter_badge limited_counter_with_delimiter(@relations_by_tab['finished'])
@@ -16,10 +29,10 @@
%table.table.b-table.gl-table.b-table-stacked-md{ role: 'table' }
%thead{ role: 'rowgroup' }
%tr{ role: 'row' }
- %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Migration')
- %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Progress')
- %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Status')
- %th.table-th-transparent.border-bottom{ role: 'cell' }
+ %th.border-bottom{ role: 'cell' }= _('Migration')
+ %th.border-bottom{ role: 'cell' }= _('Progress')
+ %th.border-bottom{ role: 'cell' }= _('Status')
+ %th.border-bottom{ role: 'cell' }
%tbody{ role: 'rowgroup' }
= render partial: 'migration', collection: @migrations
diff --git a/app/views/admin/background_migrations/show.html.haml b/app/views/admin/background_migrations/show.html.haml
new file mode 100644
index 00000000000..7915a9d36dc
--- /dev/null
+++ b/app/views/admin/background_migrations/show.html.haml
@@ -0,0 +1,39 @@
+- add_to_breadcrumbs s_('BackgroundMigrations|Background Migrations'), admin_background_migrations_path(database: params[:database])
+- breadcrumb_title @migration.id
+- page_title @migration.job_class_name , s_('BackgroundMigrations|Background Migrations')
+- @breadcrumb_link = admin_background_migration_path(@migration, database: params[:database])
+
+%h3= @migration.job_class_name + ': ' + @migration.table_name
+
+.tab-content.gl-tab-content
+ .tab-pane.active{ role: 'tabpanel' }
+ %table.table.b-table.gl-table.b-table-stacked-md{ role: 'table' }
+ %thead{ role: 'rowgroup' }
+ %tr{ role: 'row' }
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Id')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Min Value')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Max Value')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Batch size')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Sub-batch size')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Interval')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Pause time (ms)')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Created on')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Last updated')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Status')
+ %tbody{ role: 'rowgroup' }
+ = render partial: 'migration_full_information', migration: @migration
+
+- if @migration.batched_jobs.with_status(:failed).any?
+ %h5= s_('BackgroundMigrations|Failed jobs:')
+
+ %table.table.b-table.gl-table.b-table-stacked-md{ role: 'table' }
+ %thead{ role: 'rowgroup' }
+ %tr{ role: 'row' }
+ %th{ role: 'cell' }= _('Id')
+ %th{ role: 'cell' }= s_('BackgroundMigrations|Started at')
+ %th{ role: 'cell' }= s_('BackgroundMigrations|Finished at')
+ %th{ role: 'cell' }= s_('BackgroundMigrations|Batch size')
+ %tbody{ role: 'rowgroup' }
+ = render partial: 'job', collection: @failed_jobs
+
+ = paginate_collection @failed_jobs
diff --git a/app/views/admin/batched_jobs/_job.html.haml b/app/views/admin/batched_jobs/_job.html.haml
new file mode 100644
index 00000000000..512f4062ccf
--- /dev/null
+++ b/app/views/admin/batched_jobs/_job.html.haml
@@ -0,0 +1,17 @@
+%tr{ role: 'row' }
+ %td{ role: 'cell', data: { label: _('Id') } }
+ = @job.id
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Min value') } }
+ = @job.min_value
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Max value') } }
+ = @job.max_value
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Batch size') } }
+ = @job.batch_size
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Started at') } }
+ = @job.started_at
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Finished at') } }
+ = @job.finished_at
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Attempts') } }
+ = @job.attempts
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Pause ms') } }
+ = @job.pause_ms
diff --git a/app/views/admin/batched_jobs/_transition_log.html.haml b/app/views/admin/batched_jobs/_transition_log.html.haml
new file mode 100644
index 00000000000..bd81be4679a
--- /dev/null
+++ b/app/views/admin/batched_jobs/_transition_log.html.haml
@@ -0,0 +1,13 @@
+%tr{ role: 'row' }
+ %td{ role: 'cell', data: { label: _('Id') } }
+ = transition_log.id
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Created at') } }
+ = transition_log.created_at
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Previous status') } }
+ = transition_log.previous_status
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Next status') } }
+ = transition_log.next_status
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Exception class') } }
+ = transition_log.exception_class
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Exception message') } }
+ = transition_log.exception_message
diff --git a/app/views/admin/batched_jobs/show.html.haml b/app/views/admin/batched_jobs/show.html.haml
new file mode 100644
index 00000000000..760635413a5
--- /dev/null
+++ b/app/views/admin/batched_jobs/show.html.haml
@@ -0,0 +1,36 @@
+- add_to_breadcrumbs s_('Batched Job|Background Migrations'), admin_background_migrations_path(database: params[:database])
+- add_to_breadcrumbs @job.batched_background_migration_id, admin_background_migration_path(@job.batched_migration, database: params[:database])
+- breadcrumb_title sprintf(s_('Batched Job|Batched Job (Id: %{id})'), { id: @job.id.to_s})
+- page_title @job.id, s_('BatchedJob|Batched Jobs')
+- @breadcrumb_link = admin_background_migration_batched_job_path(@job.batched_migration, @job, database: params[:database])
+
+%h3= sprintf(s_('Batched Job|Batched Job (Id: %{id})'), { id: @job.id.to_s})
+
+%table.table.b-table.gl-table.b-table-stacked-md{ role: 'table' }
+ %thead{ role: 'rowgroup' }
+ %tr{ role: 'row' }
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Id')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= s_('BatchedJob|Min Value')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= s_('BatchedJob|Max Value')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= s_('BatchedJob|Batch size')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= s_('BatchedJob|Started at')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= s_('BatchedJob|Finished at')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= s_('BatchedJob|Attempts')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= s_('BatchedJob|Pause time (ms)')
+ %tbody{ role: 'rowgroup' }
+ = render partial: 'job', job: @job
+
+- if @transition_logs.any?
+ %h5= s_('BatchedJob|Transition logs:')
+
+ %table.table.b-table.gl-table.b-table-stacked-md{ role: 'table' }
+ %thead{ role: 'rowgroup' }
+ %tr{ role: 'row' }
+ %th{ role: 'cell' }= _('Id')
+ %th{ role: 'cell' }= s_('BatchedJob|Created At')
+ %th{ role: 'cell' }= s_('BatchedJob|Previous Status')
+ %th{ role: 'cell' }= s_('BatchedJob|Next Status')
+ %th{ role: 'cell' }= s_('BatchedJob|Exception Class')
+ %th{ role: 'cell' }= s_('BatchedJob|Exception Message')
+ %tbody{ role: 'rowgroup' }
+ = render partial: 'transition_log', collection: @transition_logs
diff --git a/app/views/admin/broadcast_messages/_form.html.haml b/app/views/admin/broadcast_messages/_form.html.haml
index 4102918931f..dfd3b87c674 100644
--- a/app/views/admin/broadcast_messages/_form.html.haml
+++ b/app/views/admin/broadcast_messages/_form.html.haml
@@ -29,7 +29,7 @@
= f.label :starts_at, _("Dismissable")
.col-sm-10
= f.gitlab_ui_checkbox_component :dismissable, _('Allow users to dismiss the broadcast message')
- - if Feature.enabled?(:role_targeted_broadcast_messages, default_enabled: :yaml)
+ - if Feature.enabled?(:role_targeted_broadcast_messages)
.form-group.row
.col-sm-2.col-form-label
= f.label :target_access_levels, _('Target roles')
diff --git a/app/views/admin/broadcast_messages/index.html.haml b/app/views/admin/broadcast_messages/index.html.haml
index 54c2a9d5250..8b657eda0c0 100644
--- a/app/views/admin/broadcast_messages/index.html.haml
+++ b/app/views/admin/broadcast_messages/index.html.haml
@@ -1,6 +1,6 @@
- breadcrumb_title _("Messages")
- page_title _("Broadcast Messages")
-- targeted_broadcast_messages_enabled = Feature.enabled?(:role_targeted_broadcast_messages, default_enabled: :yaml)
+- targeted_broadcast_messages_enabled = Feature.enabled?(:role_targeted_broadcast_messages)
%h3.page-title
= _('Broadcast Messages')
diff --git a/app/views/admin/dashboard/_security_newsletter_callout.html.haml b/app/views/admin/dashboard/_security_newsletter_callout.html.haml
index 9b994b757f9..4b1303cc97c 100644
--- a/app/views/admin/dashboard/_security_newsletter_callout.html.haml
+++ b/app/views/admin/dashboard/_security_newsletter_callout.html.haml
@@ -6,9 +6,9 @@
alert_data: { feature_id: Users::CalloutsHelper::SECURITY_NEWSLETTER_CALLOUT,
dismiss_endpoint: callouts_path,
defer_links: 'true' },
- close_button_data: { testid: 'close-security-newsletter-callout' }) do
- .gl-alert-body
+ close_button_data: { testid: 'close-security-newsletter-callout' }) do |c|
+ = c.body do
= s_('AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates.')
- .gl-alert-actions
+ = c.actions do
= link_to 'https://about.gitlab.com/company/preference-center/', target: '_blank', rel: 'noreferrer noopener', class: 'deferred-link gl-alert-action btn-confirm btn-md gl-button' do
= s_('AdminArea|Sign up for the GitLab newsletter')
diff --git a/app/views/admin/groups/_form.html.haml b/app/views/admin/groups/_form.html.haml
index 8ac6f63cdfb..944d7bfced0 100644
--- a/app/views/admin/groups/_form.html.haml
+++ b/app/views/admin/groups/_form.html.haml
@@ -27,8 +27,8 @@
- if @group.new_record?
.form-group.row
.offset-sm-2.col-sm-10
- = render Pajamas::AlertComponent.new(dismissible: false) do
- .gl-alert-body
+ = render Pajamas::AlertComponent.new(dismissible: false) do |c|
+ = c.body do
= render 'shared/group_tips'
.form-actions
= f.submit _('Create group'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/groups/show.html.haml b/app/views/admin/groups/show.html.haml
index 09f2d431197..39b2fa41c80 100644
--- a/app/views/admin/groups/show.html.haml
+++ b/app/views/admin/groups/show.html.haml
@@ -112,7 +112,7 @@
= form_tag admin_group_members_update_path(@group), id: "new_project_member", class: "bulk_import", method: :put do
%div
- = users_select_tag(:user_ids, multiple: true, email_user: true, skip_ldap: @group.ldap_synced?, scope: :all)
+ = users_select_tag(:user_id, multiple: true, email_user: true, skip_ldap: @group.ldap_synced?, scope: :all)
.gl-mt-3
= select_tag :access_level, options_for_select(@group.access_level_roles), class: "project-access-select select2"
%hr
diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml
index be7055e6f7b..16f6e71d79b 100644
--- a/app/views/admin/projects/show.html.haml
+++ b/app/views/admin/projects/show.html.haml
@@ -16,8 +16,8 @@
.col-md-12
= render Pajamas::AlertComponent.new(variant: :danger,
alert_class: 'gl-mb-5',
- alert_data: { testid: 'last-repository-check-failed-alert' }) do
- .gl-alert-body
+ alert_data: { testid: 'last-repository-check-failed-alert' }) do |c|
+ = c.body do
- last_check_message = _("Last repository check (%{last_check_timestamp}) failed. See the 'repocheck.log' file for error messages.")
- last_check_message = last_check_message % { last_check_timestamp: time_ago_with_tooltip(@project.last_repository_check_at) }
= last_check_message.html_safe
diff --git a/app/views/admin/requests_profiles/index.html.haml b/app/views/admin/requests_profiles/index.html.haml
deleted file mode 100644
index 9d42a2bfa93..00000000000
--- a/app/views/admin/requests_profiles/index.html.haml
+++ /dev/null
@@ -1,22 +0,0 @@
-- page_title _('Requests Profiles')
-
-%h3.page-title
- = page_title
-
-.bs-callout.clearfix
- = html_escape(_('Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request')) % { profile_token: @profile_token, codeOpen: '<code>'.html_safe, codeClose: '</code>'.html_safe }
-
-- if @profiles.present?
- .gl-mt-3
- - @profiles.each do |path, profiles|
- .card
- .card-header
- %code= path
- %ul.content-list
- - profiles.each do |profile|
- %li
- = link_to profile.time.to_s(:long) + ' ' + profile.profile_mode.capitalize,
- admin_requests_profile_path(profile)
-- else
- %p
- = _('No profiles found')
diff --git a/app/views/admin/runners/edit.html.haml b/app/views/admin/runners/edit.html.haml
index 5570c46c17f..ccdfe67ea77 100644
--- a/app/views/admin/runners/edit.html.haml
+++ b/app/views/admin/runners/edit.html.haml
@@ -1,95 +1,53 @@
-- add_page_specific_style 'page_bundles/ci_status'
-
- runner_name = "##{@runner.id} (#{@runner.short_sha})"
-- if Feature.enabled?(:runner_read_only_admin_view, default_enabled: :yaml)
- - breadcrumb_title _('Edit')
- - page_title _('Edit'), runner_name
- - add_to_breadcrumbs _('Runners'), admin_runners_path
- - add_to_breadcrumbs runner_name, admin_runner_path(@runner)
-- else
- - breadcrumb_title runner_name
- - page_title runner_name
+- breadcrumb_title _('Edit')
+- page_title _('Edit'), runner_name
+- add_to_breadcrumbs _('Runners'), admin_runners_path
+- add_to_breadcrumbs runner_name, admin_runner_path(@runner)
-#js-admin-runner-edit{ data: {runner_id: @runner.id} }
+#js-admin-runner-edit{ data: {runner_id: @runner.id, runner_path: admin_runner_path(@runner) } }
-.row
- .col-md-6
- %h4= _('Restrict projects for this runner')
- - if @runner.runner_projects.any?
- %table.table{ data: { testid: 'assigned-projects' } }
- %thead
- %tr
- %th= _('Assigned projects')
- - @runner.runner_projects.each do |runner_project|
- - project = runner_project.project
- - if project
- %tr
- %td
- = render Pajamas::AlertComponent.new(variant: :danger,
- dismissible: false,
- title: project.full_name) do
- .gl-alert-actions
- = link_to _('Disable'), admin_namespace_project_runner_project_path(project.namespace, project, runner_project), method: :delete, class: 'btn gl-alert-action btn-confirm btn-md gl-button'
+- if @runner.project_type?
+ .gl-overflow-auto
+ %h4.gl-font-lg.gl-my-5= _('Restrict projects for this runner')
- %table.table{ data: { testid: 'unassigned-projects' } }
+ - if @runner.runner_projects.any?
+ %table.table{ data: { testid: 'assigned-projects' } }
%thead
%tr
- %th= _('Project')
- %th
-
+ %th= _('Assigned projects')
+ - @runner.runner_projects.each do |runner_project|
+ - project = runner_project.project
+ - if project
+ %tr
+ %td
+ = render Pajamas::AlertComponent.new(variant: :danger,
+ dismissible: false,
+ title: project.full_name) do |c|
+ = c.actions do
+ = link_to _('Disable'), admin_namespace_project_runner_project_path(project.namespace, project, runner_project), method: :delete, class: 'btn gl-alert-action btn-confirm btn-md gl-button'
+
+ %table.table{ data: { testid: 'unassigned-projects' } }
+ %thead
+ %tr
+ %th= s_('Runners|Select projects to assign to this runner')
+ %th
+
+ %tr
+ %td
+ = form_tag edit_admin_runner_path(@runner), id: 'runner-projects-search', class: 'form-inline', method: :get do
+ .input-group
+ = search_field_tag :search, params[:search], class: 'form-control gl-form-input', spellcheck: false
+ .input-group-append
+ = submit_tag _('Search'), class: 'gl-button btn btn-default'
+
+ %td
+ - @projects.each do |project|
%tr
%td
- = form_tag edit_admin_runner_path(@runner), id: 'runner-projects-search', class: 'form-inline', method: :get do
- .input-group
- = search_field_tag :search, params[:search], class: 'form-control gl-form-input', spellcheck: false
- .input-group-append
- = submit_tag _('Search'), class: 'gl-button btn btn-default'
-
+ = project.full_name
%td
- - @projects.each do |project|
- %tr
- %td
- = project.full_name
- %td
- .float-right
- = form_for project.runner_projects.new, url: admin_namespace_project_runner_projects_path(project.namespace, project), method: :post do |f|
- = f.hidden_field :runner_id, value: @runner.id
- = f.submit _('Enable'), aria: { label: s_('Runners|Change to project runner') }, class: 'gl-button btn btn-sm', data: { confirm: (s_('Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?') if @runner.instance_type?), confirm_btn_variant: 'danger' }
- = paginate_without_count @projects
-
- .col-md-6
- %h4= _('Recent jobs served by this runner')
- %table.table.ci-table.runner-builds
- %thead
- %tr
- %th= _('Job')
- %th= _('Status')
- %th= _('Project')
- %th= _('Commit')
- %th= _('Finished at')
-
- - @builds.each do |build|
- - project = build.project
- %tr.build
- %td.id
- - if project
- = link_to project_job_path(project, build) do
- %strong ##{build.id}
- - else
- %strong ##{build.id}
-
- %td.status
- = render 'ci/status/badge', status: build.detailed_status(current_user)
-
- %td.status
- - if project
- = project.full_name
-
- %td.build-link
- - if project
- = link_to pipeline_path(build.pipeline) do
- %strong= build.pipeline.short_sha
-
- %td.timestamp
- - if build.finished_at
- %span= time_ago_with_tooltip build.finished_at
+ .float-right
+ = form_for project.runner_projects.new, url: admin_namespace_project_runner_projects_path(project.namespace, project), method: :post do |f|
+ = f.hidden_field :runner_id, value: @runner.id
+ = f.submit _('Enable'), class: 'gl-button btn btn-sm'
+ = paginate_without_count @projects
diff --git a/app/views/admin/runners/show.html.haml b/app/views/admin/runners/show.html.haml
index 5c4a7026f50..22351397b9a 100644
--- a/app/views/admin/runners/show.html.haml
+++ b/app/views/admin/runners/show.html.haml
@@ -5,4 +5,4 @@
- page_title title
- add_to_breadcrumbs _('Runners'), admin_runners_path
-#js-admin-runner-show{ data: {runner_id: @runner.id} }
+#js-admin-runner-show{ data: {runner_id: @runner.id, runners_path: admin_runners_path} }
diff --git a/app/views/admin/sessions/_new_base.html.haml b/app/views/admin/sessions/_new_base.html.haml
index c9b002a4dd2..65eb1358b40 100644
--- a/app/views/admin/sessions/_new_base.html.haml
+++ b/app/views/admin/sessions/_new_base.html.haml
@@ -4,4 +4,4 @@
= password_field_tag 'user[password]', nil, class: 'form-control', autocomplete: 'current-password', required: true, title: _('This field is required.'), data: { qa_selector: 'password_field' }
.submit-container.move-submit-down
- = submit_tag _('Enter Admin Mode'), class: 'gl-button btn btn-success', data: { qa_selector: 'enter_admin_mode_button' }
+ = submit_tag _('Enter Admin Mode'), class: 'gl-button btn btn-confirm', data: { qa_selector: 'enter_admin_mode_button' }
diff --git a/app/views/admin/sessions/_signin_box.html.haml b/app/views/admin/sessions/_signin_box.html.haml
index ab7eb8c79dc..9372bae14c3 100644
--- a/app/views/admin/sessions/_signin_box.html.haml
+++ b/app/views/admin/sessions/_signin_box.html.haml
@@ -14,6 +14,6 @@
= render_if_exists 'devise/sessions/new_smartcard'
- if allow_admin_mode_password_authentication_for_web?
- .login-box.tab-pane{ id: 'login-pane', role: 'tabpanel', class: active_when(!any_form_based_providers_enabled?) }
+ .login-box.tab-pane.gl-p-5{ id: 'login-pane', role: 'tabpanel', class: active_when(!any_form_based_providers_enabled?) }
.login-body
= render 'admin/sessions/new_base'
diff --git a/app/views/admin/sessions/_two_factor_otp.html.haml b/app/views/admin/sessions/_two_factor_otp.html.haml
index 3fe6e20a367..40ba79d1a65 100644
--- a/app/views/admin/sessions/_two_factor_otp.html.haml
+++ b/app/views/admin/sessions/_two_factor_otp.html.haml
@@ -6,4 +6,4 @@
= _("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.")
.submit-container.move-submit-down
- = submit_tag 'Verify code', class: 'gl-button btn btn-success'
+ = submit_tag 'Verify code', class: 'gl-button btn btn-confirm'
diff --git a/app/views/admin/sessions/new.html.haml b/app/views/admin/sessions/new.html.haml
index 67c607270a5..7d07b49c98e 100644
--- a/app/views/admin/sessions/new.html.haml
+++ b/app/views/admin/sessions/new.html.haml
@@ -8,7 +8,7 @@
- if any_form_based_providers_enabled?
= render 'devise/shared/tabs_ldap', show_password_form: allow_admin_mode_password_authentication_for_web?, render_signup_link: false
- else
- = render 'devise/shared/tabs_normal', tab_title: _('Enter Admin Mode'), render_signup_link: false
+ = render 'devise/shared/tab_single', tab_title: page_title
.tab-content
- if allow_admin_mode_password_authentication_for_web? || ldap_sign_in_enabled? || crowd_enabled?
= render 'admin/sessions/signin_box'
diff --git a/app/views/admin/sessions/two_factor.html.haml b/app/views/admin/sessions/two_factor.html.haml
index 531ab206157..3f915846dd8 100644
--- a/app/views/admin/sessions/two_factor.html.haml
+++ b/app/views/admin/sessions/two_factor.html.haml
@@ -5,9 +5,9 @@
.col-md-5.new-session-forms-container
.login-page
#signin-container
- = render 'devise/shared/tabs_normal', tab_title: _('Enter Admin Mode'), render_signup_link: false
+ = render 'devise/shared/tab_single', tab_title: _('Enter Admin Mode')
.tab-content
- .login-box.tab-pane.active{ id: 'login-pane', role: 'tabpanel' }
+ .login-box.tab-pane.gl-p-5.active{ id: 'login-pane', role: 'tabpanel' }
.login-body
- if current_user.two_factor_otp_enabled?
= render 'admin/sessions/two_factor_otp'
diff --git a/app/views/admin/topics/_form.html.haml b/app/views/admin/topics/_form.html.haml
index 50ef375dd35..9b9d97950cc 100644
--- a/app/views/admin/topics/_form.html.haml
+++ b/app/views/admin/topics/_form.html.haml
@@ -3,13 +3,20 @@
.form-group
= f.label :name do
- = _("Topic name")
- = f.text_field :name, placeholder: _('My topic'), class: 'form-control input-lg', data: { qa_selector: 'topic_name_field' },
+ = _("Topic slug (name)")
+ = f.text_field :name, placeholder: _('my-topic'), class: 'form-control input-lg', data: { qa_selector: 'topic_name_field' },
required: true,
title: _('Please fill in a name for your topic.'),
autofocus: true
.form-group
+ = f.label :title do
+ = _("Topic title")
+ = f.text_field :title, placeholder: _('My topic'), class: 'form-control input-lg', data: { qa_selector: 'topic_title_field' },
+ required: true,
+ title: _('Please fill in a title for your topic.')
+
+ .form-group
= f.label :description, _("Description")
= render layout: 'shared/md_preview', locals: { url: preview_markdown_admin_topics_path, referenced_users: false } do
= render 'shared/zen', f: f, attr: :description,
diff --git a/app/views/admin/topics/_topic.html.haml b/app/views/admin/topics/_topic.html.haml
index 959e7ab31fc..462943263df 100644
--- a/app/views/admin/topics/_topic.html.haml
+++ b/app/views/admin/topics/_topic.html.haml
@@ -1,4 +1,5 @@
- topic = local_assigns.fetch(:topic)
+- title = topic.title || topic.name
%li.topic-row.gl-py-3.gl-align-items-center{ class: 'gl-display-flex!', data: { qa_selector: 'topic_row_content' } }
.avatar-container.rect-avatar.s40.gl-flex-shrink-0
@@ -6,7 +7,9 @@
.gl-min-w-0.gl-flex-grow-1
.title
- = link_to topic.name, topic_explore_projects_path(topic_name: topic.name)
+ = link_to title, topic_explore_projects_path(topic_name: topic.name)
+ %div
+ = topic.name
.stats.gl-text-gray-500.gl-flex-shrink-0.gl-display-none.gl-sm-display-flex
%span.gl-ml-5.has-tooltip{ title: n_('%d project', '%d projects', topic.total_projects_count) % topic.total_projects_count }
diff --git a/app/views/admin/users/_users.html.haml b/app/views/admin/users/_users.html.haml
index 86391b980c0..a7ed7b8c052 100644
--- a/app/views/admin/users/_users.html.haml
+++ b/app/views/admin/users/_users.html.haml
@@ -1,8 +1,8 @@
- if registration_features_can_be_prompted?
= render Pajamas::AlertComponent.new(variant: :tip,
alert_class: 'gl-my-5',
- dismissible: false) do
- .gl-alert-body
+ dismissible: false) do |c|
+ = c.body do
= render 'shared/registration_features_discovery_message', feature_title: s_('RegistrationFeatures|send emails to users')
.top-area