From d9ab72d6080f594d0b3cae15f14b3ef2c6c638cb Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 20 Oct 2021 08:43:02 +0000 Subject: Add latest changes from gitlab-org/gitlab@14-4-stable-ee --- .../admin/application_settings/_abuse.html.haml | 2 - .../_account_and_limit.html.haml | 18 ++-- .../admin/application_settings/_ci_cd.html.haml | 7 ++ .../application_settings/_files_limits.html.haml | 34 -------- .../application_settings/_help_page.html.haml | 13 ++- .../admin/application_settings/_mailgun.html.haml | 2 +- .../_network_rate_limits.html.haml | 33 ++++++++ .../_package_registry_limits.html.haml | 32 ------- .../application_settings/_performance.html.haml | 17 ++-- .../admin/application_settings/_snowplow.html.haml | 2 +- .../admin/application_settings/_spam.html.haml | 49 ++++++++--- .../admin/application_settings/_terminal.html.haml | 2 +- .../admin/application_settings/_usage.html.haml | 22 +++-- .../appearances/preview_sign_in.html.haml | 7 +- .../admin/application_settings/general.html.haml | 3 +- .../metrics_and_profiling.html.haml | 2 +- .../admin/application_settings/network.html.haml | 19 ++++- .../admin/application_settings/reporting.html.haml | 7 +- .../_security_newsletter_callout.html.haml | 14 +++ app/views/admin/dashboard/index.html.haml | 1 + app/views/admin/hook_logs/_index.html.haml | 40 ++------- app/views/admin/projects/index.html.haml | 35 +++----- app/views/admin/projects/show.html.haml | 11 +-- app/views/admin/runners/show.html.haml | 2 +- app/views/admin/serverless/domains/_form.html.haml | 99 ---------------------- app/views/admin/serverless/domains/index.html.haml | 25 ------ app/views/admin/sessions/_new_base.html.haml | 2 +- app/views/admin/topics/_form.html.haml | 40 +++++++++ app/views/admin/topics/_topic.html.haml | 17 ++++ app/views/admin/topics/edit.html.haml | 4 + app/views/admin/topics/index.html.haml | 19 +++++ app/views/admin/topics/new.html.haml | 4 + app/views/admin/users/_access_levels.html.haml | 24 +++--- app/views/admin/users/_form.html.haml | 6 +- app/views/admin/users/_head.html.haml | 17 ++-- app/views/admin/users/show.html.haml | 3 +- 36 files changed, 289 insertions(+), 345 deletions(-) delete mode 100644 app/views/admin/application_settings/_files_limits.html.haml create mode 100644 app/views/admin/application_settings/_network_rate_limits.html.haml delete mode 100644 app/views/admin/application_settings/_package_registry_limits.html.haml create mode 100644 app/views/admin/dashboard/_security_newsletter_callout.html.haml delete mode 100644 app/views/admin/serverless/domains/_form.html.haml delete mode 100644 app/views/admin/serverless/domains/index.html.haml create mode 100644 app/views/admin/topics/_form.html.haml create mode 100644 app/views/admin/topics/_topic.html.haml create mode 100644 app/views/admin/topics/edit.html.haml create mode 100644 app/views/admin/topics/index.html.haml create mode 100644 app/views/admin/topics/new.html.haml (limited to 'app/views/admin') diff --git a/app/views/admin/application_settings/_abuse.html.haml b/app/views/admin/application_settings/_abuse.html.haml index fab3ce584f0..96fb848b568 100644 --- a/app/views/admin/application_settings/_abuse.html.haml +++ b/app/views/admin/application_settings/_abuse.html.haml @@ -5,7 +5,5 @@ .form-group = f.label :abuse_notification_email, _('Abuse reports notification email'), class: 'label-bold' = f.text_field :abuse_notification_email, class: 'form-control gl-form-input' - .form-text.text-muted - = _('Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area.') = f.submit _('Save changes'), class: "gl-button btn btn-confirm" 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 eb30efabb98..19c38d7be62 100644 --- a/app/views/admin/application_settings/_account_and_limit.html.haml +++ b/app/views/admin/application_settings/_account_and_limit.html.haml @@ -23,11 +23,11 @@ .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= _('0 for unlimited, only effective with remote storage enabled.') + %span.form-text.text-muted= _('Only effective when remote storage is enabled. Set to 0 for no size limit.') .form-group = f.label :session_expire_delay, _('Session duration (minutes)'), class: 'label-light' = f.number_field :session_expire_delay, class: 'form-control gl-form-input', title: _('Maximum duration of a session.'), data: { toggle: 'tooltip', container: 'body' } - %span.form-text.text-muted#session_expire_delay_help_block= _('GitLab restart is required to apply changes.') + %span.form-text.text-muted#session_expire_delay_help_block= _('Restart GitLab to apply changes.') = 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 @@ -45,13 +45,13 @@ .form-check = f.check_box :user_default_external, class: 'form-check-input' = f.label :user_default_external, class: 'form-check-label' do - = _('Newly registered users will by default be external') + = _('Newly-registered users are external by default') .gl-mt-3 = _('Internal users') = f.text_field :user_default_internal_regex, placeholder: _('Regex pattern'), class: 'form-control gl-form-input gl-mt-2' .help-block - = _('Specify an e-mail address regex pattern to identify default internal users.') - = link_to _('More information'), help_page_path('user/permissions', anchor: 'setting-new-users-to-external'), + = _('Specify an email address regex pattern to identify default internal users.') + = link_to _('Learn more'), help_page_path('user/permissions', anchor: 'setting-new-users-to-external'), target: '_blank' - unless Gitlab.com? .form-group @@ -59,11 +59,13 @@ .form-check = f.check_box :deactivate_dormant_users, class: 'form-check-input' = f.label :deactivate_dormant_users, class: 'form-check-label' do - = _('Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance.') - = link_to _('More information'), help_page_path('user/admin_area/moderate_users', anchor: 'automatically-deactivate-dormant-users'), target: '_blank' + = _('Deactivate dormant users after 90 days of inactivity') + .help-block + = _('Users can reactivate their account by signing in.') + = link_to _('Learn more'), help_page_path('user/admin_area/moderate_users', anchor: 'automatically-deactivate-dormant-users'), target: '_blank' .form-group = f.label :personal_access_token_prefix, _('Personal Access Token prefix'), class: 'label-light' - = f.text_field :personal_access_token_prefix, placeholder: _('Max 20 characters'), class: 'form-control gl-form-input' + = f.text_field :personal_access_token_prefix, placeholder: _('Maximum 20 characters'), class: 'form-control gl-form-input' .form-group = f.label :user_show_add_ssh_key_message, _('Prompt users to upload SSH keys'), class: 'label-bold' .form-check diff --git a/app/views/admin/application_settings/_ci_cd.html.haml b/app/views/admin/application_settings/_ci_cd.html.haml index fea116bd419..8026ec4702b 100644 --- a/app/views/admin/application_settings/_ci_cd.html.haml +++ b/app/views/admin/application_settings/_ci_cd.html.haml @@ -69,5 +69,12 @@ %p.form-text.text-muted = _("The default CI/CD configuration file and path for new projects.").html_safe = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'specify-a-custom-cicd-configuration-file'), target: '_blank' + .form-group + .form-check + = f.check_box :suggest_pipeline_enabled, class: 'form-check-input' + = f.label :suggest_pipeline_enabled, class: 'form-check-label' do + = s_('AdminSettings|Enable pipeline suggestion banner') + .form-text.text-muted + = s_('AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file.') = f.submit _('Save changes'), class: "gl-button btn btn-confirm" diff --git a/app/views/admin/application_settings/_files_limits.html.haml b/app/views/admin/application_settings/_files_limits.html.haml deleted file mode 100644 index 9cd12fa1caa..00000000000 --- a/app/views/admin/application_settings/_files_limits.html.haml +++ /dev/null @@ -1,34 +0,0 @@ -= gitlab_ui_form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-files-limits-settings'), html: { class: 'fieldset-form' } do |f| - = form_errors(@application_setting) - - %fieldset - %legend.h5.gl-border-none - = _('Unauthenticated API request rate limit') - .form-group - = f.gitlab_ui_checkbox_component :throttle_unauthenticated_files_api_enabled, - _('Enable unauthenticated API request rate limit'), - help_text: _('Helps reduce request volume (e.g. from crawlers or abusive bots)'), - checkbox_options: { data: { qa_selector: 'throttle_unauthenticated_files_api_checkbox' } } - .form-group - = f.label :throttle_unauthenticated_files_api_requests_per_period, 'Max unauthenticated API requests per period per IP', class: 'label-bold' - = f.number_field :throttle_unauthenticated_files_api_requests_per_period, class: 'form-control gl-form-input' - .form-group - = f.label :throttle_unauthenticated_files_api_period_in_seconds, 'Unauthenticated API rate limit period in seconds', class: 'label-bold' - = f.number_field :throttle_unauthenticated_files_api_period_in_seconds, class: 'form-control gl-form-input' - - %fieldset - %legend.h5.gl-border-none - = _('Authenticated API request rate limit') - .form-group - = f.gitlab_ui_checkbox_component :throttle_authenticated_files_api_enabled, - _('Enable authenticated API request rate limit'), - help_text: _('Helps reduce request volume (e.g. from crawlers or abusive bots)'), - checkbox_options: { data: { qa_selector: 'throttle_authenticated_files_api_checkbox' } } - .form-group - = f.label :throttle_authenticated_files_api_requests_per_period, 'Max authenticated API requests per period per user', class: 'label-bold' - = f.number_field :throttle_authenticated_files_api_requests_per_period, class: 'form-control gl-form-input' - .form-group - = f.label :throttle_authenticated_files_api_period_in_seconds, 'Authenticated API rate limit period in seconds', class: 'label-bold' - = f.number_field :throttle_authenticated_files_api_period_in_seconds, 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/_help_page.html.haml b/app/views/admin/application_settings/_help_page.html.haml index ecf3203df9a..cd7eaa1896a 100644 --- a/app/views/admin/application_settings/_help_page.html.haml +++ b/app/views/admin/application_settings/_help_page.html.haml @@ -18,11 +18,10 @@ = f.text_field :help_page_support_url, class: 'form-control gl-form-input', placeholder: 'https://company.example.com/getting-help', :'aria-describedby' => 'support_help_block' %span.form-text.text-muted#support_help_block= _('Alternate support URL for Help page and Help dropdown.') - - if show_documentation_base_url_field? - .form-group - = f.label :help_page_documentation_base_url, _('Documentation pages URL'), class: 'label-bold' - = f.text_field :help_page_documentation_base_url, class: 'form-control gl-form-input', placeholder: 'https://docs.gitlab.com' - - docs_link_url = help_page_path('user/admin_area/settings/help_page', anchor: 'destination-requirements') - - docs_link_start = ''.html_safe % { url: docs_link_url } - %span.form-text.text-muted#support_help_block= html_escape(_('Requests for pages at %{code_start}%{help_text_url}%{code_end} redirect to the URL. The destination must meet certain requirements. %{docs_link_start}Learn more.%{docs_link_end}')) % { code_start: ''.html_safe, help_text_url: help_url, code_end: ''.html_safe, docs_link_start: docs_link_start, docs_link_end: ''.html_safe } + .form-group + = f.label :help_page_documentation_base_url, _('Documentation pages URL'), class: 'gl-font-weight-bold' + = f.text_field :help_page_documentation_base_url, class: 'form-control gl-form-input', placeholder: 'https://docs.gitlab.com' + - docs_link_url = help_page_path('user/admin_area/settings/help_page', anchor: 'destination-requirements') + - docs_link_start = ''.html_safe % { url: docs_link_url } + %span.form-text.text-muted#support_help_block= html_escape(_('Requests for pages at %{code_start}%{help_text_url}%{code_end} redirect to the URL. The destination must meet certain requirements. %{docs_link_start}Learn more.%{docs_link_end}')) % { code_start: ''.html_safe, help_text_url: help_url, code_end: ''.html_safe, docs_link_start: docs_link_start, docs_link_end: ''.html_safe } = f.submit _('Save changes'), class: "gl-button btn btn-confirm" diff --git a/app/views/admin/application_settings/_mailgun.html.haml b/app/views/admin/application_settings/_mailgun.html.haml index 40b4d5cac6d..ad9e84ffdab 100644 --- a/app/views/admin/application_settings/_mailgun.html.haml +++ b/app/views/admin/application_settings/_mailgun.html.haml @@ -6,7 +6,7 @@ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } = expanded ? _('Collapse') : _('Expand') %p - = _('Configure the %{link} integration.').html_safe % { link: link_to(_('Mailgun events'), 'https://documentation.mailgun.com/en/latest/user_manual.html#webhooks', target: '_blank') } + = _('Configure the %{link} integration.').html_safe % { link: link_to(_('Mailgun events'), 'https://documentation.mailgun.com/en/latest/user_manual.html#webhooks', target: '_blank', rel: 'noopener noreferrer') } .settings-content = form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-mailgun-settings'), html: { class: 'fieldset-form', id: 'mailgun-settings' } do |f| = form_errors(@application_setting) if expanded diff --git a/app/views/admin/application_settings/_network_rate_limits.html.haml b/app/views/admin/application_settings/_network_rate_limits.html.haml new file mode 100644 index 00000000000..f1857a9749a --- /dev/null +++ b/app/views/admin/application_settings/_network_rate_limits.html.haml @@ -0,0 +1,33 @@ += gitlab_ui_form_for @application_setting, url: network_admin_application_settings_path(anchor: anchor), html: { class: 'fieldset-form' } do |f| + = form_errors(@application_setting) + + %fieldset + = _("Rate limits can help reduce request volume (like from crawlers or abusive bots).") + + %fieldset + .form-group + = f.gitlab_ui_checkbox_component :"throttle_unauthenticated_#{setting_fragment}_enabled", + _('Enable unauthenticated API request rate limit'), + checkbox_options: { data: { qa_selector: "throttle_unauthenticated_#{setting_fragment}_checkbox" } }, + label_options: { class: 'label-bold' } + .form-group + = f.label :"throttle_unauthenticated_#{setting_fragment}_requests_per_period", _('Maximum unauthenticated API requests per rate limit period per IP'), class: 'label-bold' + = f.number_field :"throttle_unauthenticated_#{setting_fragment}_requests_per_period", class: 'form-control gl-form-input' + .form-group + = f.label :"throttle_unauthenticated_#{setting_fragment}_period_in_seconds", _('Unauthenticated API rate limit period in seconds'), class: 'label-bold' + = f.number_field :"throttle_unauthenticated_#{setting_fragment}_period_in_seconds", class: 'form-control gl-form-input' + + %fieldset + .form-group + = f.gitlab_ui_checkbox_component :"throttle_authenticated_#{setting_fragment}_enabled", + _('Enable authenticated API request rate limit'), + checkbox_options: { data: { qa_selector: "throttle_authenticated_#{setting_fragment}_checkbox" } }, + label_options: { class: 'label-bold' } + .form-group + = f.label :"throttle_authenticated_#{setting_fragment}_requests_per_period", _('Maximum authenticated API requests per rate limit period per user'), class: 'label-bold' + = f.number_field :"throttle_authenticated_#{setting_fragment}_requests_per_period", class: 'form-control gl-form-input' + .form-group + = f.label :"throttle_authenticated_#{setting_fragment}_period_in_seconds", _('Authenticated API rate limit period in seconds'), class: 'label-bold' + = f.number_field :"throttle_authenticated_#{setting_fragment}_period_in_seconds", 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/_package_registry_limits.html.haml b/app/views/admin/application_settings/_package_registry_limits.html.haml deleted file mode 100644 index 8769171c9e0..00000000000 --- a/app/views/admin/application_settings/_package_registry_limits.html.haml +++ /dev/null @@ -1,32 +0,0 @@ -= form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-packages-limits-settings'), html: { class: 'fieldset-form' } do |f| - = form_errors(@application_setting) - - %fieldset - = _("The package registry rate limits can help reduce request volume (like from crawlers or abusive bots).") - - %fieldset - .form-group - .form-check - = f.check_box :throttle_unauthenticated_packages_api_enabled, class: 'form-check-input', data: { qa_selector: 'throttle_unauthenticated_packages_api_checkbox' } - = f.label :throttle_unauthenticated_packages_api_enabled, class: 'form-check-label label-bold' do - = _('Enable unauthenticated API request rate limit') - .form-group - = f.label :throttle_unauthenticated_packages_api_requests_per_period, _('Maximum unauthenticated API requests per rate limit period per IP'), class: 'label-bold' - = f.number_field :throttle_unauthenticated_packages_api_requests_per_period, class: 'form-control gl-form-input' - .form-group - = f.label :throttle_unauthenticated_packages_api_period_in_seconds, _('Unauthenticated API rate limit period in seconds'), class: 'label-bold' - = f.number_field :throttle_unauthenticated_packages_api_period_in_seconds, class: 'form-control gl-form-input' - %hr - .form-group - .form-check - = f.check_box :throttle_authenticated_packages_api_enabled, class: 'form-check-input', data: { qa_selector: 'throttle_authenticated_packages_api_checkbox' } - = f.label :throttle_authenticated_packages_api_enabled, class: 'form-check-label label-bold' do - = _('Enable authenticated API request rate limit') - .form-group - = f.label :throttle_authenticated_packages_api_requests_per_period, _('Maximum authenticated API requests per rate limit period per user'), class: 'label-bold' - = f.number_field :throttle_authenticated_packages_api_requests_per_period, class: 'form-control gl-form-input' - .form-group - = f.label :throttle_authenticated_packages_api_period_in_seconds, _('Authenticated API rate limit period in seconds'), class: 'label-bold' - = f.number_field :throttle_authenticated_packages_api_period_in_seconds, 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/_performance.html.haml b/app/views/admin/application_settings/_performance.html.haml index 50fc11ec7f3..82e56cf8b81 100644 --- a/app/views/admin/application_settings/_performance.html.haml +++ b/app/views/admin/application_settings/_performance.html.haml @@ -6,29 +6,24 @@ .form-check = f.check_box :authorized_keys_enabled, class: 'form-check-input' = f.label :authorized_keys_enabled, class: 'form-check-label' do - = _('Write to "authorized_keys" file') + = _('Use authorized_keys file to authenticate SSH keys') .form-text.text-muted - By default, we write to the "authorized_keys" file to support Git - over SSH without additional configuration. GitLab can be optimized - to authenticate SSH keys via the database file. Only uncheck this - if you have configured your OpenSSH server to use the - AuthorizedKeysCommand. Click on the help icon for more details. - = link_to sprite_icon('question-o'), help_page_path('administration/operations/fast_ssh_key_lookup') - + = _('Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead.') + = link_to _('How do I configure authentication using the GitLab database?'), help_page_path('administration/operations/fast_ssh_key_lookup'), target: '_blank', rel: 'noopener noreferrer' .form-group = f.label :raw_blob_request_limit, _('Raw blob request rate limit per minute'), class: 'label-bold' = f.number_field :raw_blob_request_limit, class: 'form-control gl-form-input' .form-text.text-muted - = _('Highest number of requests per minute for each raw path, default to 300. To disable throttling set to 0.') + = _('Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling.') .form-group = f.label :push_event_hooks_limit, class: 'label-bold' = f.number_field :push_event_hooks_limit, class: 'form-control gl-form-input' .form-text.text-muted - = _("Number of changes (branches or tags) in a single push to determine whether webhooks and services will be fired or not. Webhooks and services won't be submitted if it surpasses that value.") + = _('Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3).') .form-group = f.label :push_event_activities_limit, class: 'label-bold' = f.number_field :push_event_activities_limit, class: 'form-control gl-form-input' .form-text.text-muted - = _('Number of changes (branches or tags) in a single push to determine whether individual push events or bulk push event will be created. Bulk push event will be created if it surpasses that value.') + = _('Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3).') = f.submit _('Save changes'), class: "gl-button btn btn-confirm" diff --git a/app/views/admin/application_settings/_snowplow.html.haml b/app/views/admin/application_settings/_snowplow.html.haml index 8c98778147e..756c0e770a6 100644 --- a/app/views/admin/application_settings/_snowplow.html.haml +++ b/app/views/admin/application_settings/_snowplow.html.haml @@ -7,7 +7,7 @@ = expanded ? _('Collapse') : _('Expand') %p - link_start = ''.html_safe % { url: help_page_path('development/snowplow/index') } - = html_escape(_('Configure %{link} to track events. %{link_start}Learn more.%{link_end}')) % { link: link_to('Snowplow', 'https://snowplowanalytics.com/', target: '_blank').html_safe, link_start: link_start, link_end: ''.html_safe } + = html_escape(_('Configure %{link} to track events. %{link_start}Learn more.%{link_end}')) % { link: link_to('Snowplow', 'https://snowplowanalytics.com/', target: '_blank', rel: 'noopener noreferrer').html_safe, link_start: link_start, link_end: ''.html_safe } .settings-content = form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-snowplow-settings'), html: { class: 'fieldset-form', id: 'snowplow-settings' } do |f| = form_errors(@application_setting) if expanded diff --git a/app/views/admin/application_settings/_spam.html.haml b/app/views/admin/application_settings/_spam.html.haml index 011bce3ca99..53ca4d4aa79 100644 --- a/app/views/admin/application_settings/_spam.html.haml +++ b/app/views/admin/application_settings/_spam.html.haml @@ -2,6 +2,11 @@ = form_errors(@application_setting) %fieldset + %h5 + = _('reCAPTCHA') + %p + = _('reCAPTCHA helps prevent credential stuffing.') + = link_to _('Only reCAPTCHA v2 is supported:'), 'https://developers.google.com/recaptcha/docs/versions', target: '_blank', rel: 'noopener noreferrer' .form-group .form-check = f.check_box :recaptcha_enabled, class: 'form-check-input' @@ -9,25 +14,31 @@ = _("Enable reCAPTCHA") %span.form-text.text-muted#recaptcha_help_block = _('Helps prevent bots from creating accounts.') + = link_to _('How do I configure it?'), help_page_path('integration/recaptcha.md'), target: '_blank', rel: 'noopener noreferrer' .form-group .form-check = f.check_box :login_recaptcha_protection_enabled, class: 'form-check-input' = f.label :login_recaptcha_protection_enabled, class: 'form-check-label' do - = _("Enable reCAPTCHA for login") + = _('Enable reCAPTCHA for login.') %span.form-text.text-muted#recaptcha_help_block = _('Helps prevent bots from brute-force attacks.') .form-group - = f.label :recaptcha_site_key, _('reCAPTCHA Site Key'), class: 'label-bold' + = f.label :recaptcha_site_key, _('reCAPTCHA site key'), class: 'label-bold' = f.text_field :recaptcha_site_key, class: 'form-control gl-form-input' .form-text.text-muted = _("Generate site and private keys at") %a{ href: 'http://www.google.com/recaptcha', target: 'blank' } http://www.google.com/recaptcha .form-group - = f.label :recaptcha_private_key, _('reCAPTCHA Private Key'), class: 'label-bold' - .form-group + = f.label :recaptcha_private_key, _('reCAPTCHA private key'), class: 'label-bold' = f.text_field :recaptcha_private_key, class: 'form-control gl-form-input' + %h5 + = _('Invisible Captcha') + %p + = _('Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form.') + = link_to _('Read their documentation.'), 'https://github.com/markets/invisible_captcha', target: '_blank', rel: 'noopener noreferrer' + .form-group .form-check = f.check_box :invisible_captcha_enabled, class: 'form-check-input' @@ -36,12 +47,18 @@ %span.form-text.text-muted = _('Helps prevent bots from creating accounts.') + %h5 + = _('Akismet') + %p + = _('Akismet helps prevent the creation of spam issues in public projects.') + = link_to _('How do I configure Akismet?'), help_page_path('integration/akismet.md'), target: '_blank', rel: 'noopener noreferrer' + .form-group .form-check = f.check_box :akismet_enabled, class: 'form-check-input' = f.label :akismet_enabled, class: 'form-check-label' do Enable Akismet - %span.form-text.text-muted#akismet_help_block= _("Helps prevent bots from creating issues") + %span.form-text.text-muted#akismet_help_block= _("Helps prevent bots from creating issues.") .form-group = f.label :akismet_api_key, _('Akismet API Key'), class: 'label-bold' @@ -50,25 +67,31 @@ Generate API key at %a{ href: 'http://www.akismet.com', target: 'blank' } http://www.akismet.com + %h5 + = _('IP address restrictions') + .form-group .form-check = f.check_box :unique_ips_limit_enabled, class: 'form-check-input' = f.label :unique_ips_limit_enabled, class: 'form-check-label' do - = _("Limit sign in from multiple ips") + = _("Limit sign in from multiple IP addresses") %span.form-text.text-muted#unique_ip_help_block - = _("Helps prevent malicious users hide their activity") + = _("Helps prevent malicious users hide their activity.") .form-group - = f.label :unique_ips_limit_per_user, _('IPs per user'), class: 'label-bold' + = f.label :unique_ips_limit_per_user, _('IP addresses per user'), class: 'label-bold' = f.number_field :unique_ips_limit_per_user, class: 'form-control gl-form-input' .form-text.text-muted - = _("Maximum number of unique IPs per user") + = _("Maximum number of unique IP addresses per user.") .form-group - = f.label :unique_ips_limit_time_window, _('IP expiration time'), class: 'label-bold' + = f.label :unique_ips_limit_time_window, _('IP address expiration time'), class: 'label-bold' = f.number_field :unique_ips_limit_time_window, class: 'form-control gl-form-input' .form-text.text-muted - = _("How many seconds an IP will be counted towards the limit") + = _("How many seconds an IP counts toward the IP address limit.") + + %h5 + = _('Spam Check') .form-group .form-check @@ -79,8 +102,8 @@ = f.label :spam_check_endpoint_url, _('URL of the external Spam Check endpoint'), class: 'label-bold' = f.text_field :spam_check_endpoint_url, class: 'form-control gl-form-input' .form-group - = f.label :spam_check_api_key, _('Spam Check API Key'), class: 'gl-font-weight-bold' + = f.label :spam_check_api_key, _('Spam Check API key'), class: 'gl-font-weight-bold' = f.text_field :spam_check_api_key, class: 'form-control gl-form-input' - .form-text.text-muted= _('The API key used by GitLab for accessing the Spam Check service endpoint') + .form-text.text-muted= _('The API key used by GitLab for accessing the Spam Check service endpoint.') = f.submit _('Save changes'), class: "gl-button btn btn-confirm" diff --git a/app/views/admin/application_settings/_terminal.html.haml b/app/views/admin/application_settings/_terminal.html.haml index d6e31a24cf6..c53f63e124b 100644 --- a/app/views/admin/application_settings/_terminal.html.haml +++ b/app/views/admin/application_settings/_terminal.html.haml @@ -6,5 +6,5 @@ = f.label :terminal_max_session_time, _('Max session time'), class: 'label-bold' = f.number_field :terminal_max_session_time, class: 'form-control gl-form-input' .form-text.text-muted - = _('Maximum time for web terminal websocket connection (in seconds). 0 for unlimited.') + = _('Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited.') = f.submit _('Save changes'), class: "gl-button btn btn-confirm" diff --git a/app/views/admin/application_settings/_usage.html.haml b/app/views/admin/application_settings/_usage.html.haml index ddd0abb4c34..5bdad50c161 100644 --- a/app/views/admin/application_settings/_usage.html.haml +++ b/app/views/admin/application_settings/_usage.html.haml @@ -10,21 +10,21 @@ = f.label :version_check_enabled, class: 'form-check-label' do = _("Enable version check") .form-text.text-muted - = _("GitLab will inform you if a new version is available.") - = _("%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc.").html_safe % { link_start: "".html_safe, link_end: ''.html_safe } + = _("GitLab informs you if a new version is available.") + = _("%{link_start}What information does GitLab Inc. collect?%{link_end}").html_safe % { link_start: "".html_safe, link_end: ''.html_safe } .form-group - can_be_configured = @application_setting.usage_ping_can_be_configured? .form-check = f.check_box :usage_ping_enabled, disabled: !can_be_configured, class: 'form-check-input' = f.label :usage_ping_enabled, class: 'form-check-label' do - = _('Enable service ping') + = _('Enable Service Ping') .form-text.text-muted - if can_be_configured - %p.mb-2= _('To help improve GitLab and its user experience, GitLab will periodically collect usage information.') + %p.mb-2= _('To help improve GitLab and its user experience, GitLab periodically collects usage information.') - - service_ping_path = help_page_path('user/admin_area/settings/usage_statistics', anchor: 'service-ping') + - service_ping_path = help_page_path('development/service_ping/index.md') - service_ping_link_start = ''.html_safe % { url: service_ping_path } - %p.mb-2= s_('%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc.').html_safe % { service_ping_link_start: service_ping_link_start, service_ping_link_end: ''.html_safe } + %p.mb-2= s_('%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}').html_safe % { service_ping_link_start: service_ping_link_start, service_ping_link_end: ''.html_safe } %button.gl-button.btn.btn-default.js-payload-preview-trigger{ type: 'button', data: { payload_selector: ".#{payload_class}" } } .gl-spinner.js-spinner.gl-display-none.gl-mr-2 @@ -46,15 +46,23 @@ - if usage_ping_enabled %p.gl-mb-3.text-muted{ id: 'service_ping_features_helper_text' }= _('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.') - else - %p.gl-mb-3.text-muted{ id: 'service_ping_features_helper_text' }= _('To enable Registration Features, make sure "Enable service ping" is checked.') + %p.gl-mb-3.text-muted{ id: 'service_ping_features_helper_text' }= _('To enable Registration Features, first enable Service Ping.') %p.gl-mb-3.text-muted= _('Registration Features include:') .form-text - email_from_gitlab_path = help_page_path('tools/email.md') + - repo_size_limit_path = help_page_path('user/admin_area/settings/account_and_limit_settings.md', anchor: 'repository-size-limit') + - restrict_ip_path = help_page_path('user/group/index.md', anchor: 'restrict-group-access-by-ip-address') - link_end = ''.html_safe - email_from_gitlab_link = ''.html_safe % { url: email_from_gitlab_path } + - repo_size_limit_link = ''.html_safe % { url: repo_size_limit_path } + - restrict_ip_link = ''.html_safe % { url: restrict_ip_path } %ul %li = _('Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}.').html_safe % { link_start: email_from_gitlab_link, link_end: link_end } + %li + = _('Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}.').html_safe % { link_start: repo_size_limit_link, link_end: link_end } + %li + = _('Restrict group access by IP address. %{link_start}Learn more%{link_end}.').html_safe % { link_start: restrict_ip_link, link_end: link_end } = f.submit _('Save changes'), class: "gl-button btn btn-confirm" diff --git a/app/views/admin/application_settings/appearances/preview_sign_in.html.haml b/app/views/admin/application_settings/appearances/preview_sign_in.html.haml index 77c37abbeef..2e4ab714048 100644 --- a/app/views/admin/application_settings/appearances/preview_sign_in.html.haml +++ b/app/views/admin/application_settings/appearances/preview_sign_in.html.haml @@ -1,12 +1,13 @@ = render 'devise/shared/tab_single', tab_title: _('Sign in preview') .login-box %form.gl-show-field-errors + - title = _('This form is disabled in preview') .form-group = label_tag :login - = text_field_tag :login, nil, class: "form-control gl-form-input top", title: _('Please provide your username or email address.') + = text_field_tag :login, nil, disabled: true, class: "form-control gl-form-input top", title: title .form-group = label_tag :password - = password_field_tag :password, nil, class: "form-control gl-form-input bottom", title: _('This field is required.') + = password_field_tag :password, nil, disabled: true, class: "form-control gl-form-input bottom", title: title .form-group - = button_tag _("Sign in"), class: "btn gl-button btn-confirm", type: "button" + = button_tag _("Sign in"), disabled: true, class: "btn gl-button btn-confirm", type: "button", title: title diff --git a/app/views/admin/application_settings/general.html.haml b/app/views/admin/application_settings/general.html.haml index 9102769cc6e..a72c96bb577 100644 --- a/app/views/admin/application_settings/general.html.haml +++ b/app/views/admin/application_settings/general.html.haml @@ -79,7 +79,8 @@ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } = expanded_by_default? ? _('Collapse') : _('Expand') %p - = _('Set max session time for web terminal.') + = _('Set the maximum session time for a web terminal.') + = link_to _('How do I use a web terminal?'), help_page_path('ci/environments/index.md', anchor: 'web-terminals'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'terminal' 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 f1e37c76130..6087551d7c7 100644 --- a/app/views/admin/application_settings/metrics_and_profiling.html.haml +++ b/app/views/admin/application_settings/metrics_and_profiling.html.haml @@ -49,7 +49,7 @@ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } = expanded_by_default? ? _('Collapse') : _('Expand') %p - = _('Enable or disable version check and service ping.') + = _('Enable or disable version check and Service Ping.') .settings-content = render 'usage' diff --git a/app/views/admin/application_settings/network.html.haml b/app/views/admin/application_settings/network.html.haml index 8dff2bc36cb..58e3f3f1136 100644 --- a/app/views/admin/application_settings/network.html.haml +++ b/app/views/admin/application_settings/network.html.haml @@ -35,9 +35,10 @@ = _('Set rate limits for package registry API requests that supersede the general user and IP rate limits.') = link_to _('Learn more.'), help_page_path('user/admin_area/settings/package_registry_rate_limits.md'), target: '_blank', rel: 'noopener noreferrer' .settings-content - = render 'package_registry_limits' + = render partial: 'network_rate_limits', locals: { anchor: 'js-packages-limits-settings', setting_fragment: 'packages_api' } + - if Feature.enabled?(:files_api_throttling, default_enabled: :yaml) - %section.settings.as-files-limits.no-animate#js-files-limits-settings{ class: ('expanded' if expanded_by_default?), data: { testid: 'files-limits-settings' } } + %section.settings.as-files-limits.no-animate#js-files-limits-settings{ class: ('expanded' if expanded_by_default?) } .settings-header %h4 = _('Files API Rate Limits') @@ -46,7 +47,19 @@ %p = _('Configure specific limits for Files API requests that supersede the general user and IP rate limits.') .settings-content - = render 'files_limits' + = render partial: 'network_rate_limits', locals: { anchor: 'js-files-limits-settings', setting_fragment: 'files_api' } + +%section.settings.as-deprecated-limits.no-animate#js-deprecated-limits-settings{ class: ('expanded' if expanded_by_default?) } + .settings-header + %h4 + = _('Deprecated API rate limits') + %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } + = expanded_by_default? ? _('Collapse') : _('Expand') + %p + = _('Configure specific limits for deprecated API requests that supersede the general user and IP rate limits.') + = link_to _('Which API requests are affected?'), help_page_path('user/admin_area/settings/deprecated_api_rate_limits.md'), target: '_blank', rel: 'noopener noreferrer' + .settings-content + = render partial: 'network_rate_limits', locals: { anchor: 'js-deprecated-limits-settings', setting_fragment: 'deprecated_api' } %section.settings.as-git-lfs-limits.no-animate#js-git-lfs-limits-settings{ class: ('expanded' if expanded_by_default?), data: { qa_selector: 'git_lfs_limits_content' } } .settings-header diff --git a/app/views/admin/application_settings/reporting.html.haml b/app/views/admin/application_settings/reporting.html.haml index 914a09ff5db..d2e118f0624 100644 --- a/app/views/admin/application_settings/reporting.html.haml +++ b/app/views/admin/application_settings/reporting.html.haml @@ -9,9 +9,7 @@ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } = expanded_by_default? ? _('Collapse') : _('Expand') %p - - recaptcha_v2_link_url = 'https://developers.google.com/recaptcha/docs/versions' - - recaptcha_v2_link_start = ''.html_safe % { url: recaptcha_v2_link_url } - = _('Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}').html_safe % { recaptcha_v2_link_start: recaptcha_v2_link_start, recaptcha_v2_link_end: ''.html_safe } + = _('Configure CAPTCHAs, IP address limits, and other anti-spam measures.') .settings-content = render 'spam' @@ -22,6 +20,7 @@ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } = expanded_by_default? ? _('Collapse') : _('Expand') %p - = _('Set notification email for abuse reports.') + = _('Receive notification of abuse reports by email.') + = link_to _('Learn more.'), help_page_path('user/admin_area/review_abuse_reports.md'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'abuse' diff --git a/app/views/admin/dashboard/_security_newsletter_callout.html.haml b/app/views/admin/dashboard/_security_newsletter_callout.html.haml new file mode 100644 index 00000000000..ece0f7ca4d9 --- /dev/null +++ b/app/views/admin/dashboard/_security_newsletter_callout.html.haml @@ -0,0 +1,14 @@ +- return unless show_security_newsletter_user_callout? + += render 'shared/global_alert', + title: s_('AdminArea|Get security updates from GitLab and stay up to date'), + variant: :tip, + alert_class: 'js-security-newsletter-callout', + is_contained: true, + alert_data: { feature_id: UserCalloutsHelper::SECURITY_NEWSLETTER_CALLOUT, dismiss_endpoint: user_callouts_path, defer_links: 'true' }, + close_button_data: { testid: 'close-security-newsletter-callout' } do + .gl-alert-body + = s_('AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates.') + .gl-alert-actions + = 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/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index 97b3a757a3f..681e7ccb613 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -4,6 +4,7 @@ - billable_users_link_start = ''.html_safe % { url: billable_users_url } = render_if_exists 'shared/qrtly_reconciliation_alert' += render 'admin/dashboard/security_newsletter_callout' - if @notices - @notices.each do |notice| diff --git a/app/views/admin/hook_logs/_index.html.haml b/app/views/admin/hook_logs/_index.html.haml index a7f947f96ea..6a46b0b3510 100644 --- a/app/views/admin/hook_logs/_index.html.haml +++ b/app/views/admin/hook_logs/_index.html.haml @@ -1,37 +1,11 @@ +- docs_link_url = help_page_path('user/project/integrations/webhooks', anchor: 'troubleshoot-webhooks') +- link_start = ''.html_safe % { url: docs_link_url } +- link_end = ''.html_safe + .row.gl-mt-3.gl-mb-3 .col-lg-3 %h4.gl-mt-0 - = _('Recent Deliveries') - %p= _('When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong.') + = _('Recent events') + %p= _('GitLab events trigger webhooks. Use the request details of a webhook to help troubleshoot problems. %{link_start}How do I troubleshoot?%{link_end}').html_safe % { link_start: link_start, link_end: link_end } .col-lg-9 - - if hook_logs.present? - %table.table - %thead - %tr - %th= _('Status') - %th= _('Trigger') - %th= _('URL') - %th= _('Elapsed time') - %th= _('Request time') - %th - - hook_logs.each do |hook_log| - %tr - %td - = render partial: 'shared/hook_logs/status_label', locals: { hook_log: hook_log } - %td.d-none.d-sm-block - %span.badge.badge-gray.deploy-project-label - = hook_log.trigger.singularize.titleize - %td - = truncate(hook_log.url, length: 50) - %td.light - #{number_with_precision(hook_log.execution_duration, precision: 2)} sec - %td.light - = time_ago_with_tooltip(hook_log.created_at) - %td - = link_to _('View details'), admin_hook_hook_log_path(hook, hook_log) - - = paginate hook_logs, theme: 'gitlab' - - - else - .settings-message.text-center - = _("You don't have any webhooks deliveries") + = render partial: 'shared/hook_logs/recent_deliveries_table', locals: { hook: hook, hook_logs: hook_logs } diff --git a/app/views/admin/projects/index.html.haml b/app/views/admin/projects/index.html.haml index 5ebfd296e2b..f947e174990 100644 --- a/app/views/admin/projects/index.html.haml +++ b/app/views/admin/projects/index.html.haml @@ -1,33 +1,24 @@ - page_title _('Projects') - params[:visibility_level] ||= [] -- active_tab_classes = 'active gl-tab-nav-item-active gl-tab-nav-item-active-indigo' .top-area.scrolling-tabs-container.inner-page-scroll-tabs - %ul.nav.gl-tabs-nav.gl-overflow-x-auto.gl-display-flex.gl-flex-grow-1.gl-flex-shrink-1.gl-border-b-0.gl-flex-nowrap.gl-webkit-scrollbar-display-none - = nav_link(html_options: { class: "nav-item" } ) do - = link_to _('All'), admin_projects_path, class: "nav-link gl-tab-nav-item #{active_tab_classes if params[:visibility_level].empty?}" - = nav_link(html_options: { class: "nav-item" } ) do - = link_to _('Private'), admin_projects_path(visibility_level: Gitlab::VisibilityLevel::PRIVATE), class: "nav-link gl-tab-nav-item #{active_tab_classes if params[:visibility_level] == Gitlab::VisibilityLevel::PRIVATE.to_s}" - = nav_link(html_options: { class: "nav-item" } ) do - = link_to _('Internal'), admin_projects_path(visibility_level: Gitlab::VisibilityLevel::INTERNAL), class: "nav-link gl-tab-nav-item #{active_tab_classes if params[:visibility_level] == Gitlab::VisibilityLevel::INTERNAL.to_s}" - = nav_link(html_options: { class: "nav-item" } ) do - = link_to _('Public'), admin_projects_path(visibility_level: Gitlab::VisibilityLevel::PUBLIC), class: "nav-link gl-tab-nav-item #{active_tab_classes if params[:visibility_level] == Gitlab::VisibilityLevel::PUBLIC.to_s}" + = gl_tabs_nav({ class: 'gl-border-b-0 gl-overflow-x-auto gl-flex-grow-1 gl-flex-nowrap gl-webkit-scrollbar-display-none' }) do + = gl_tab_link_to _('All'), admin_projects_path(visibility_level: nil), { item_active: params[:visibility_level].empty? } + = gl_tab_link_to _('Private'), admin_projects_path(visibility_level: Gitlab::VisibilityLevel::PRIVATE) + = gl_tab_link_to _('Internal'), admin_projects_path(visibility_level: Gitlab::VisibilityLevel::INTERNAL) + = gl_tab_link_to _('Public'), admin_projects_path(visibility_level: Gitlab::VisibilityLevel::PUBLIC) .nav-controls .search-holder = render 'shared/projects/search_form', autofocus: true, admin_view: true - .dropdown - - toggle_text = _('Namespace') - - if params[:namespace_id].present? - = hidden_field_tag :namespace_id, params[:namespace_id] - - namespace = Namespace.find(params[:namespace_id]) - - toggle_text = "#{namespace.kind}: #{namespace.full_path}" - = dropdown_toggle(toggle_text, { toggle: 'dropdown', is_filter: 'true' }, { toggle_class: 'js-namespace-select large' }) - .dropdown-menu.dropdown-select.dropdown-menu-right - = dropdown_title(_('Namespaces')) - = dropdown_filter(_("Search for Namespace")) - = dropdown_content - = dropdown_loading + - current_namespace = _('Namespace') + - if params[:namespace_id].present? + - namespace = Namespace.find(params[:namespace_id]) + - current_namespace = "#{namespace.kind}: #{namespace.full_path}" + %button.dropdown-menu-toggle.btn.btn-default.btn-md.gl-button.js-namespace-select{ data: { show_any: 'true', field_name: 'namespace_id', placeholder: current_namespace, update_location: 'true' }, type: 'button' } + %span.gl-new-dropdown-button-text + = current_namespace + = render 'shared/projects/dropdown' = link_to new_project_path, class: 'gl-button btn btn-confirm' do = _('New Project') diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml index 1a87b21351c..3069aab2710 100644 --- a/app/views/admin/projects/show.html.haml +++ b/app/views/admin/projects/show.html.haml @@ -143,13 +143,10 @@ .col-sm-3.col-form-label = f.label :new_namespace_id, _("Namespace") .col-sm-9 - .dropdown - = dropdown_toggle(_('Search for Namespace'), { toggle: 'dropdown', field_name: 'new_namespace_id' }, { toggle_class: 'js-namespace-select large' }) - .dropdown-menu.dropdown-select - = dropdown_title(_('Namespaces')) - = dropdown_filter(_('Search for Namespace')) - = dropdown_content - = dropdown_loading + - placeholder = _('Search for Namespace') + %button.dropdown-menu-toggle.btn.btn-default.btn-md.gl-button.js-namespace-select{ data: { field_name: 'new_namespace_id', placeholder: placeholder }, type: 'button' } + %span.gl-new-dropdown-button-text + = placeholder .form-group.row .offset-sm-3.col-sm-9 diff --git a/app/views/admin/runners/show.html.haml b/app/views/admin/runners/show.html.haml index 59523ed3a0c..808b2bb4f8e 100644 --- a/app/views/admin/runners/show.html.haml +++ b/app/views/admin/runners/show.html.haml @@ -9,7 +9,7 @@ .row .col-md-6 %h4= _('Restrict projects for this runner') - - if @runner.projects.any? + - if @runner.runner_projects.any? %table.table{ data: { testid: 'assigned-projects' } } %thead %tr diff --git a/app/views/admin/serverless/domains/_form.html.haml b/app/views/admin/serverless/domains/_form.html.haml deleted file mode 100644 index a3e1ccc5d4a..00000000000 --- a/app/views/admin/serverless/domains/_form.html.haml +++ /dev/null @@ -1,99 +0,0 @@ -- form_name = 'js-serverless-domain-settings' -- form_url = @domain.persisted? ? admin_serverless_domain_path(@domain.id, anchor: form_name) : admin_serverless_domains_path(anchor: form_name) -- show_certificate_card = @domain.persisted? && @domain.errors.blank? -= form_for @domain, url: form_url, html: { class: 'fieldset-form' } do |f| - = form_errors(@domain) - - %fieldset - - if @domain.persisted? - - dns_record = "*.#{@domain.domain} CNAME #{Settings.pages.host}." - - verification_record = "#{@domain.verification_domain} TXT #{@domain.keyed_verification_code}" - .form-group.row - .col-sm-6.position-relative - = f.label :domain, _('Domain'), class: 'label-bold' - = f.text_field :domain, class: 'form-control has-floating-status-badge', readonly: true - .status-badge.floating-status-badge - - text, status = @domain.unverified? ? [_('Unverified'), 'badge-danger'] : [_('Verified'), 'badge-success'] - .badge{ class: status } - = text - = link_to sprite_icon("redo"), verify_admin_serverless_domain_path(@domain.id), method: :post, class: "gl-button btn has-tooltip", title: _("Retry verification") - - .col-sm-6 - = f.label :serverless_domain_dns, _('DNS'), class: 'label-bold' - .input-group - = text_field_tag :serverless_domain_dns, dns_record , class: "monospace js-select-on-focus form-control", readonly: true - .input-group-append - = clipboard_button(target: '#serverless_domain_dns', class: 'btn-default input-group-text d-none d-sm-block') - - .col-sm-12.form-text.text-muted - = _("To access this domain create a new DNS record") - - .form-group - = f.label :serverless_domain_verification, _('Verification status'), class: 'label-bold' - .input-group - = text_field_tag :serverless_domain_verification, verification_record, class: "monospace js-select-on-focus form-control", readonly: true - .input-group-append - = clipboard_button(target: '#serverless_domain_verification', class: 'btn-default d-none d-sm-block') - %p.form-text.text-muted - - link_to_help = link_to(_('verify ownership'), help_page_path('user/project/pages/custom_domains_ssl_tls_certification/index.md', anchor: '4-verify-the-domains-ownership')) - = _("To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration.").html_safe % { link_to_help: link_to_help } - - - else - .form-group - = f.label :domain, _('Domain'), class: 'label-bold' - = f.text_field :domain, class: 'form-control' - - - if show_certificate_card - .card.js-domain-cert-show - .card-header - = _('Certificate') - .d-flex.justify-content-between.align-items-center.p-3 - %span - = @domain.subject || _('missing') - %button.gl-button.btn.btn-danger.btn-sm.js-domain-cert-replace-btn{ type: 'button' } - = _('Replace') - - .js-domain-cert-inputs{ class: ('hidden' if show_certificate_card) } - .form-group - = f.label :user_provided_certificate, _('Certificate (PEM)'), class: 'label-bold' - = f.text_area :user_provided_certificate, rows: 5, class: 'form-control', value: '' - %span.form-text.text-muted - = _("Upload a certificate for your domain with all intermediates") - .form-group - = f.label :user_provided_key, _('Key (PEM)'), class: 'label-bold' - = f.text_area :user_provided_key, rows: 5, class: 'form-control', value: '' - %span.form-text.text-muted - = _("Upload a private key for your certificate") - - = f.submit @domain.persisted? ? _('Save changes') : _('Add domain'), class: "gl-button btn btn-confirm js-serverless-domain-submit", disabled: @domain.persisted? - - if @domain.persisted? - %button.gl-button.btn.btn-danger{ type: 'button', data: { toggle: 'modal', target: "#modal-delete-domain" } } - = _('Delete domain') - --# haml-lint:disable NoPlainNodes -- if @domain.persisted? - - domain_attached = @domain.serverless_domain_clusters.count > 0 - .modal{ id: "modal-delete-domain", tabindex: -1 } - .modal-dialog - .modal-content - .modal-header - %h3.page-title= _('Delete serverless domain?') - %button.close{ type: "button", "data-dismiss": "modal", "aria-label" => _('Close') } - %span{ "aria-hidden": "true" } × - - .modal-body - - if domain_attached - = _("You must disassociate %{domain} from all clusters it is attached to before deletion.").html_safe % { domain: "#{@domain.domain}".html_safe } - - else - = _("You are about to delete %{domain} from your instance. This domain will no longer be available to any Knative application.").html_safe % { domain: "#{@domain.domain}".html_safe } - - .modal-footer - %a{ href: '#', data: { dismiss: 'modal' }, class: 'gl-button btn btn-default' } - = _('Cancel') - - = link_to _('Delete domain'), - admin_serverless_domain_path(@domain.id), - title: _('Delete'), - method: :delete, - class: "gl-button btn btn-danger", - disabled: domain_attached diff --git a/app/views/admin/serverless/domains/index.html.haml b/app/views/admin/serverless/domains/index.html.haml deleted file mode 100644 index c2b6baed4de..00000000000 --- a/app/views/admin/serverless/domains/index.html.haml +++ /dev/null @@ -1,25 +0,0 @@ -- breadcrumb_title _("Operations") -- page_title _("Operations") -- @content_class = "limit-container-width" unless fluid_layout - --# normally expanded_by_default? is used here, but since this is the only panel --# in this settings page, let's leave it always open by default -- expanded = true - -%section.settings.as-serverless-domain.no-animate#js-serverless-domain-settings{ class: ('expanded' if expanded) } - .settings-header - %h4 - = _('Serverless domain') - %button.gl-button.btn.btn-default.js-settings-toggle{ type: 'button' } - = expanded ? _('Collapse') : _('Expand') - %p - = _('Set an instance-wide domain that will be available to all clusters when installing Knative.') - .settings-content - - if Gitlab.config.pages.enabled - = render 'form' - - else - .card - .card-header - = s_('GitLabPages|Domains') - .nothing-here-block - = s_("GitLabPages|Support for domains and certificates is disabled. Ask your system's administrator to enable it.") diff --git a/app/views/admin/sessions/_new_base.html.haml b/app/views/admin/sessions/_new_base.html.haml index 47ef4f26889..c9b002a4dd2 100644 --- a/app/views/admin/sessions/_new_base.html.haml +++ b/app/views/admin/sessions/_new_base.html.haml @@ -1,7 +1,7 @@ = form_tag(admin_session_path, method: :post, class: 'new_user gl-show-field-errors', 'aria-live': 'assertive') do .form-group = label_tag :user_password, _('Password'), class: 'label-bold' - = password_field_tag 'user[password]', nil, class: 'form-control', required: true, title: _('This field is required.'), data: { qa_selector: 'password_field' } + = 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' } diff --git a/app/views/admin/topics/_form.html.haml b/app/views/admin/topics/_form.html.haml new file mode 100644 index 00000000000..21a1d74a8c6 --- /dev/null +++ b/app/views/admin/topics/_form.html.haml @@ -0,0 +1,40 @@ += gitlab_ui_form_for @topic, url: url, html: { multipart: true, class: 'js-project-topic-form gl-show-field-errors common-note-form js-quick-submit js-requires-input' }, authenticity_token: true do |f| + = form_errors(@topic) + + .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' }, + required: true, + title: _('Please fill in a name for your topic.'), + autofocus: true + + .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, + classes: 'note-textarea', + placeholder: _('Write a description…'), + supports_quick_actions: false, + supports_autocomplete: false, + qa_selector: 'topic_form_description' + = render 'shared/notes/hints', supports_file_upload: false + + .form-group.gl-mt-3.gl-mb-3 + = f.label :avatar, _('Topic avatar'), class: 'gl-display-block' + - if @topic.avatar? + .avatar-container.rect-avatar.s90 + = topic_icon(@topic, alt: _('Topic avatar'), class: 'avatar topic-avatar s90') + = render 'shared/choose_avatar_button', f: f + - if @topic.avatar? + = link_to _('Remove avatar'), admin_topic_avatar_path(@topic), data: { confirm: _('Avatar will be removed. Are you sure?')}, method: :delete, class: 'gl-button btn btn-danger-secondary gl-mt-2' + + - if @topic.new_record? + .form-actions + = f.submit _('Create topic'), class: "gl-button btn btn-confirm" + = link_to _('Cancel'), admin_topics_path, class: "gl-button btn btn-default btn-cancel" + + - else + .form-actions + = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' } + = link_to _('Cancel'), admin_topics_path, class: "gl-button btn btn-cancel" diff --git a/app/views/admin/topics/_topic.html.haml b/app/views/admin/topics/_topic.html.haml new file mode 100644 index 00000000000..abf3cffa422 --- /dev/null +++ b/app/views/admin/topics/_topic.html.haml @@ -0,0 +1,17 @@ +- topic = local_assigns.fetch(:topic) + +%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 + = topic_icon(topic, class: "avatar s40") + + .gl-min-w-0.gl-flex-grow-1 + .title + = 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 } + = sprite_icon('bookmark', css_class: 'gl-vertical-align-text-bottom') + = number_with_delimiter(topic.total_projects_count) + + .controls.gl-flex-shrink-0.gl-ml-5 + = link_to _('Edit'), edit_admin_topic_path(topic), id: "edit_#{dom_id(topic)}", class: 'btn gl-button btn-default' diff --git a/app/views/admin/topics/edit.html.haml b/app/views/admin/topics/edit.html.haml new file mode 100644 index 00000000000..4416bb0fe18 --- /dev/null +++ b/app/views/admin/topics/edit.html.haml @@ -0,0 +1,4 @@ +- page_title _("Edit"), @topic.name, _("Topics") +%h3.page-title= _('Edit topic: %{topic_name}') % { topic_name: @topic.name } +%hr += render 'form', url: admin_topic_path(@topic) diff --git a/app/views/admin/topics/index.html.haml b/app/views/admin/topics/index.html.haml new file mode 100644 index 00000000000..6485b8aa411 --- /dev/null +++ b/app/views/admin/topics/index.html.haml @@ -0,0 +1,19 @@ +- page_title _("Topics") + += form_tag admin_topics_path, method: :get do |f| + .gl-py-3.gl-display-flex.gl-flex-direction-column-reverse.gl-md-flex-direction-row.gl-border-b-solid.gl-border-gray-100.gl-border-b-1 + .gl-flex-grow-1.gl-mt-3.gl-md-mt-0 + .inline.gl-w-full.gl-md-w-auto + - search = params.fetch(:search, nil) + .search-field-holder + = search_field_tag :search, search, class: "form-control gl-form-input search-text-input js-search-input", autofocus: true, spellcheck: false, placeholder: _('Search by name'), data: { qa_selector: 'topic_search_field' } + = sprite_icon('search', css_class: 'search-icon') + .nav-controls + = link_to new_admin_topic_path, class: "gl-button btn btn-confirm gl-w-full gl-md-w-auto" do + = _('New topic') +%ul.content-list + = render partial: 'topic', collection: @topics + += paginate_collection @topics +- if @topics.empty? + = render 'shared/empty_states/topics' diff --git a/app/views/admin/topics/new.html.haml b/app/views/admin/topics/new.html.haml new file mode 100644 index 00000000000..8b4a8ac269e --- /dev/null +++ b/app/views/admin/topics/new.html.haml @@ -0,0 +1,4 @@ +- page_title _("New topic") +%h3.page-title= _('New topic') +%hr += render 'form', url: admin_topics_path(@topic) diff --git a/app/views/admin/users/_access_levels.html.haml b/app/views/admin/users/_access_levels.html.haml index aeb274fe2cb..6a5f07dd2db 100644 --- a/app/views/admin/users/_access_levels.html.haml +++ b/app/views/admin/users/_access_levels.html.haml @@ -19,22 +19,20 @@ .col-sm-10 - editing_current_user = (current_user == @user) - = f.radio_button :access_level, :regular, disabled: editing_current_user - = f.label :access_level_regular, class: 'font-weight-bold' do - = s_('AdminUsers|Regular') - %p.light - = s_('AdminUsers|Regular users have access to their groups and projects') + = f.gitlab_ui_radio_component :access_level, :regular, + s_('AdminUsers|Regular'), + radio_options: { disabled: editing_current_user }, + help_text: s_('AdminUsers|Regular users have access to their groups and projects.') = render_if_exists 'admin/users/auditor_access_level_radio', f: f, disabled: editing_current_user - = f.radio_button :access_level, :admin, disabled: editing_current_user - = f.label :access_level_admin, class: 'font-weight-bold' do - = s_('AdminUsers|Admin') - %p.light - = s_('AdminUsers|Administrators have access to all groups, projects and users and can manage all features in this installation') - - if editing_current_user - %p.light - = s_('AdminUsers|You cannot remove your own admin rights.') + - help_text = s_('AdminUsers|Administrators have access to all groups, projects and users and can manage all features in this installation.') + - help_text += ' ' + s_('AdminUsers|You cannot remove your own admin rights.') if editing_current_user + = f.gitlab_ui_radio_component :access_level, :admin, + s_('AdminUsers|Admin'), + radio_options: { disabled: editing_current_user }, + help_text: help_text + .form-group.row .col-sm-2.col-form-label.gl-pt-0 diff --git a/app/views/admin/users/_form.html.haml b/app/views/admin/users/_form.html.haml index 9d62c19e2fc..3869a2b6dcd 100644 --- a/app/views/admin/users/_form.html.haml +++ b/app/views/admin/users/_form.html.haml @@ -1,5 +1,5 @@ .user_new - = form_for [:admin, @user], html: { class: 'fieldset-form' } do |f| + = gitlab_ui_form_for [:admin, @user], html: { class: 'fieldset-form' } do |f| = form_errors(@user) %fieldset @@ -39,12 +39,12 @@ .col-sm-2.col-form-label = f.label :password .col-sm-10 - = f.password_field :password, disabled: f.object.force_random_password, class: 'form-control gl-form-input' + = f.password_field :password, disabled: f.object.force_random_password, autocomplete: 'new-password', class: 'form-control gl-form-input' .form-group.row .col-sm-2.col-form-label = f.label :password_confirmation .col-sm-10 - = f.password_field :password_confirmation, disabled: f.object.force_random_password, class: 'form-control gl-form-input' + = f.password_field :password_confirmation, disabled: f.object.force_random_password, autocomplete: 'new-password', class: 'form-control gl-form-input' = render partial: 'access_levels', locals: { f: f } diff --git a/app/views/admin/users/_head.html.haml b/app/views/admin/users/_head.html.haml index f4b1a2853f1..bafb2085589 100644 --- a/app/views/admin/users/_head.html.haml +++ b/app/views/admin/users/_head.html.haml @@ -33,16 +33,11 @@ - if can_force_email_confirmation?(@user) %button.btn.gl-button.btn-info.js-confirm-modal-button{ data: confirm_user_data(@user) } = _('Confirm user') -%ul.nav-links.nav.nav-tabs - = nav_link(path: 'users#show') do - = link_to _("Account"), admin_user_path(@user) - = nav_link(path: 'users#projects') do - = link_to _("Groups and projects"), projects_admin_user_path(@user) - = nav_link(path: 'users#keys') do - = link_to _("SSH keys"), keys_admin_user_path(@user) - = nav_link(controller: :identities) do - = link_to _("Identities"), admin_user_identities_path(@user) += gl_tabs_nav do + = gl_tab_link_to _("Account"), admin_user_path(@user) + = gl_tab_link_to _("Groups and projects"), projects_admin_user_path(@user) + = gl_tab_link_to _("SSH keys"), keys_admin_user_path(@user) + = gl_tab_link_to _("Identities"), admin_user_identities_path(@user) - if impersonation_enabled? - = nav_link(controller: :impersonation_tokens) do - = link_to _("Impersonation Tokens"), admin_user_impersonation_tokens_path(@user) + = gl_tab_link_to _("Impersonation Tokens"), admin_user_impersonation_tokens_path(@user) .gl-mb-3 diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml index ad8d9d1f04f..2a9b4694e7b 100644 --- a/app/views/admin/users/show.html.haml +++ b/app/views/admin/users/show.html.haml @@ -61,7 +61,6 @@ = _('Disabled') = render_if_exists 'admin/namespace_plan_info', namespace: @user.namespace - = render_if_exists 'admin/users/credit_card_info', user: @user %li %span.light= _('External User:') @@ -139,6 +138,8 @@ = render_if_exists 'namespaces/shared_runner_status', namespace: @user.namespace + = render_if_exists 'admin/users/credit_card_info', user: @user, link_to_match_page: true + = render 'shared/custom_attributes', custom_attributes: @user.custom_attributes -# Rendered on desktop only so order of cards can be different on desktop vs mobile -- cgit v1.2.3