diff options
Diffstat (limited to 'app/views')
184 files changed, 867 insertions, 765 deletions
diff --git a/app/views/admin/appearances/_form.html.haml b/app/views/admin/appearances/_form.html.haml index a5f34d0dab2..5bb05bcba26 100644 --- a/app/views/admin/appearances/_form.html.haml +++ b/app/views/admin/appearances/_form.html.haml @@ -1,3 +1,5 @@ +- parsed_with_gfm = "Content parsed with #{link_to('GitLab Flavored Markdown', help_page_path('user/markdown'), target: '_blank')}.".html_safe + = form_for @appearance, url: admin_appearances_path, html: { class: 'prepend-top-default' } do |f| = form_errors(@appearance) @@ -57,7 +59,7 @@ = f.label :description, class: 'col-form-label label-bold' = f.text_area :description, class: "form-control", rows: 10 .hint - Description parsed with #{link_to "GitLab Flavored Markdown", help_page_path('user/markdown'), target: '_blank'}. + = parsed_with_gfm .form-group = f.label :logo, class: 'col-form-label label-bold pt-0' %p @@ -83,15 +85,30 @@ %p = f.text_area :new_project_guidelines, class: "form-control", rows: 10 .hint - Guidelines parsed with #{link_to "GitLab Flavored Markdown", help_page_path('user/markdown'), target: '_blank'}. + = parsed_with_gfm + + %hr + .row + .col-lg-4.profile-settings-sidebar + %h4.prepend-top-0 Profile image guideline + + .col-lg-8 + .form-group + = f.label :profile_image_guidelines, class: 'col-form-label label-bold' + %p + = f.text_area :profile_image_guidelines, class: "form-control", rows: 10 + .hint + = parsed_with_gfm .prepend-top-default.append-bottom-default = f.submit 'Update appearance settings', class: 'btn btn-success' - - if @appearance.persisted? - Preview last save: - = link_to 'Sign-in page', preview_sign_in_admin_appearances_path, class: 'btn', target: '_blank', rel: 'noopener noreferrer' - = link_to 'New project page', new_project_path, class: 'btn', target: '_blank', rel: 'noopener noreferrer' + - if @appearance.persisted? || @appearance.updated_at + .mt-4 + - if @appearance.persisted? + Preview last save: + = link_to 'Sign-in page', preview_sign_in_admin_appearances_path, class: 'btn', target: '_blank', rel: 'noopener noreferrer' + = link_to 'New project page', new_project_path, class: 'btn', target: '_blank', rel: 'noopener noreferrer' - - if @appearance.updated_at - %span.float-right - Last edit #{time_ago_with_tooltip(@appearance.updated_at)} + - if @appearance.updated_at + %span.float-right + Last edit #{time_ago_with_tooltip(@appearance.updated_at)} diff --git a/app/views/admin/application_settings/_influx.html.haml b/app/views/admin/application_settings/_influx.html.haml deleted file mode 100644 index 300b01c6777..00000000000 --- a/app/views/admin/application_settings/_influx.html.haml +++ /dev/null @@ -1,60 +0,0 @@ -= form_for @application_setting, url: metrics_and_profiling_admin_application_settings_path(anchor: 'js-influx-settings'), html: { class: 'fieldset-form' } do |f| - = form_errors(@application_setting) - - %fieldset - %p - Set up InfluxDB to measure a wide variety of statistics like the time spent - in running SQL queries. These settings require a - = link_to 'restart', help_page_path('administration/restart_gitlab') - to take effect. - = link_to icon('question-circle'), help_page_path('administration/monitoring/performance/index') - .form-group - .form-check - = f.check_box :metrics_enabled, class: 'form-check-input' - = f.label :metrics_enabled, class: 'form-check-label' do - Enable InfluxDB Metrics - .form-group - = f.label :metrics_host, 'InfluxDB host', class: 'label-bold' - = f.text_field :metrics_host, class: 'form-control', placeholder: 'influxdb.example.com' - .form-group - = f.label :metrics_port, 'InfluxDB port', class: 'label-bold' - = f.text_field :metrics_port, class: 'form-control', placeholder: '8089' - .form-text.text-muted - The UDP port to use for connecting to InfluxDB. InfluxDB requires that - your server configuration specifies a database to store data in when - sending messages to this port, without it metrics data will not be - saved. - .form-group - = f.label :metrics_pool_size, 'Connection pool size', class: 'label-bold' - = f.number_field :metrics_pool_size, class: 'form-control' - .form-text.text-muted - The amount of InfluxDB connections to open. Connections are opened - lazily. Users using multi-threaded application servers should ensure - enough connections are available (at minimum the amount of application - server threads). - .form-group - = f.label :metrics_timeout, 'Connection timeout', class: 'label-bold' - = f.number_field :metrics_timeout, class: 'form-control' - .form-text.text-muted - The amount of seconds after which an InfluxDB connection will time - out. - .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' - .form-text.text-muted - A method call is only tracked when it takes longer to complete than - the given amount of milliseconds. - .form-group - = f.label :metrics_sample_interval, 'Sampler Interval (sec)', class: 'label-bold' - = f.number_field :metrics_sample_interval, class: 'form-control' - .form-text.text-muted - The sampling interval in seconds. Sampled data includes memory usage, - retained Ruby objects, file descriptors and so on. - .form-group - = f.label :metrics_packet_size, 'Metrics per packet', class: 'label-bold' - = f.number_field :metrics_packet_size, class: 'form-control' - .form-text.text-muted - The amount of points to store in a single UDP packet. More points - results in fewer but larger UDP packets being sent. - - = f.submit 'Save changes', class: "btn btn-success" diff --git a/app/views/admin/application_settings/_prometheus.html.haml b/app/views/admin/application_settings/_prometheus.html.haml index 4c0ff3a18e8..b2ec25cdf8d 100644 --- a/app/views/admin/application_settings/_prometheus.html.haml +++ b/app/views/admin/application_settings/_prometheus.html.haml @@ -23,5 +23,11 @@ %code prometheus_multiproc_dir does not exist or is not pointing to a valid directory. = link_to icon('question-circle'), help_page_path('administration/monitoring/prometheus/gitlab_metrics', anchor: 'metrics-shared-directory') + .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' + .form-text.text-muted + A method call is only tracked when it takes longer to complete than + the given amount of milliseconds. = f.submit 'Save changes', class: "btn btn-success" diff --git a/app/views/admin/application_settings/_repository_mirrors_form.html.haml b/app/views/admin/application_settings/_repository_mirrors_form.html.haml index 6e5fa6eb62c..8ec9b3c528a 100644 --- a/app/views/admin/application_settings/_repository_mirrors_form.html.haml +++ b/app/views/admin/application_settings/_repository_mirrors_form.html.haml @@ -10,7 +10,7 @@ = _('Allow repository mirroring to be configured by project maintainers') %span.form-text.text-muted = _('If disabled, only admins will be able to configure repository mirroring.') - = link_to icon('question-circle'), help_page_path('workflow/repository_mirroring') + = link_to icon('question-circle'), help_page_path('user/project/repository/repository_mirroring.md') = render_if_exists 'admin/application_settings/mirror_settings', form: f diff --git a/app/views/admin/application_settings/_repository_storage.html.haml b/app/views/admin/application_settings/_repository_storage.html.haml index c3ae39ddd48..6fabafe3fc1 100644 --- a/app/views/admin/application_settings/_repository_storage.html.haml +++ b/app/views/admin/application_settings/_repository_storage.html.haml @@ -6,10 +6,10 @@ %h4= _("Hashed repository storage paths") .form-group .form-check - = f.check_box :hashed_storage_enabled, class: 'form-check-input qa-hashed-storage-checkbox' + = 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. Enable immutable, hash-based paths and repository names to store repositories on disk. This prevents repositories from having to be moved or renamed when the Repository URL changes and may improve disk I/O performance.") + = _("Use hashed storage paths for newly created and renamed repositories. Enable immutable, hash-based paths and repository names to store repositories on disk. This prevents repositories from having to be moved or renamed when the Repository URL changes and may improve disk I/O performance. (Always enabled since 13.0)") .sub-section %h4= _("Storage nodes for new repositories") .form-group diff --git a/app/views/admin/application_settings/_signup.html.haml b/app/views/admin/application_settings/_signup.html.haml index dc6d68e54ec..d8495c82af1 100644 --- a/app/views/admin/application_settings/_signup.html.haml +++ b/app/views/admin/application_settings/_signup.html.haml @@ -49,20 +49,19 @@ = f.label :domain_blacklist, 'Blacklisted domains for sign-ups', class: 'label-bold' = f.text_area :domain_blacklist_raw, placeholder: 'domain.com', class: 'form-control', rows: 8 .form-text.text-muted Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com - - if Feature.enabled?(:email_restrictions) - .form-group - = f.label :email_restrictions_enabled, _('Email restrictions'), class: 'label-bold' - .form-check - = f.check_box :email_restrictions_enabled, class: 'form-check-input' - = f.label :email_restrictions_enabled, class: 'form-check-label' do - = _('Enable email restrictions for sign ups') - .form-group - = f.label :email_restrictions, _('Email restrictions for sign-ups'), class: 'label-bold' - = f.text_area :email_restrictions, class: 'form-control', rows: 4 - .form-text.text-muted - - supported_syntax_link_url = 'https://github.com/google/re2/wiki/Syntax' - - supported_syntax_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: supported_syntax_link_url } - = _('Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information.').html_safe % { supported_syntax_link_start: supported_syntax_link_start, supported_syntax_link_end: '</a>'.html_safe } + .form-group + = f.label :email_restrictions_enabled, _('Email restrictions'), class: 'label-bold' + .form-check + = f.check_box :email_restrictions_enabled, class: 'form-check-input' + = f.label :email_restrictions_enabled, class: 'form-check-label' do + = _('Enable email restrictions for sign ups') + .form-group + = f.label :email_restrictions, _('Email restrictions for sign-ups'), class: 'label-bold' + = f.text_area :email_restrictions, class: 'form-control', rows: 4 + .form-text.text-muted + - supported_syntax_link_url = 'https://github.com/google/re2/wiki/Syntax' + - supported_syntax_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: supported_syntax_link_url } + = _('Restricts sign-ups for email addresses that match the given regex. See the %{supported_syntax_link_start}supported syntax%{supported_syntax_link_end} for more information.').html_safe % { supported_syntax_link_start: supported_syntax_link_start, supported_syntax_link_end: '</a>'.html_safe } .form-group = f.label :after_sign_up_text, class: 'label-bold' 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 a4acbe6c885..3c4fc75dbee 100644 --- a/app/views/admin/application_settings/_visibility_and_access.html.haml +++ b/app/views/admin/application_settings/_visibility_and_access.html.haml @@ -3,6 +3,7 @@ %fieldset = render 'shared/default_branch_protection', f: f, selected_level: @application_setting.default_branch_protection + = render_if_exists 'admin/application_settings/group_owners_can_manage_default_branch_protection_setting', form: f .form-group = f.label s_('ProjectCreationLevel|Default project creation protection'), class: 'label-bold' diff --git a/app/views/admin/application_settings/general.html.haml b/app/views/admin/application_settings/general.html.haml index bebda385886..fd3f04fefd1 100644 --- a/app/views/admin/application_settings/general.html.haml +++ b/app/views/admin/application_settings/general.html.haml @@ -98,9 +98,9 @@ .form-check = f.check_box :web_ide_clientside_preview_enabled, class: 'form-check-input' = f.label :web_ide_clientside_preview_enabled, class: 'form-check-label' do - = s_('IDE|Client side evaluation') + = s_('IDE|Live Preview') %span.form-text.text-muted - = s_('IDE|Allow live previews of JavaScript projects in the Web IDE using CodeSandbox client side evaluation.') + = s_('IDE|Allow live previews of JavaScript projects in the Web IDE using CodeSandbox Live Preview.') = f.submit _('Save changes'), class: "btn btn-success" diff --git a/app/views/admin/application_settings/integrations.html.haml b/app/views/admin/application_settings/integrations.html.haml index 2b01160a230..a8eff26b94c 100644 --- a/app/views/admin/application_settings/integrations.html.haml +++ b/app/views/admin/application_settings/integrations.html.haml @@ -18,7 +18,7 @@ %p = s_('AdminSettings|Integrations configured here will automatically apply to all projects on this instance.') = link_to _('Learn more'), '#' - = render 'shared/integrations/integrations', integrations: @integrations + = render 'shared/integrations/index', integrations: @integrations - else = render_if_exists 'admin/application_settings/elasticsearch_form' 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 6a703d0b70c..befe10ea510 100644 --- a/app/views/admin/application_settings/metrics_and_profiling.html.haml +++ b/app/views/admin/application_settings/metrics_and_profiling.html.haml @@ -2,17 +2,6 @@ - page_title _("Metrics and profiling") - @content_class = "limit-container-width" unless fluid_layout -%section.settings.as-influx.no-animate#js-influx-settings{ class: ('expanded' if expanded_by_default?) } - .settings-header - %h4 - = _('Metrics - Influx') - %button.btn.btn-default.js-settings-toggle{ type: 'button' } - = expanded_by_default? ? _('Collapse') : _('Expand') - %p - = _('Enable and configure InfluxDB metrics.') - .settings-content - = render 'influx' - %section.settings.as-prometheus.no-animate#js-prometheus-settings{ class: ('expanded' if expanded_by_default?) } .settings-header %h4 diff --git a/app/views/admin/impersonation_tokens/index.html.haml b/app/views/admin/impersonation_tokens/index.html.haml index a7da14d16ff..8342507d8a6 100644 --- a/app/views/admin/impersonation_tokens/index.html.haml +++ b/app/views/admin/impersonation_tokens/index.html.haml @@ -1,15 +1,29 @@ -- add_to_breadcrumbs "Users", admin_users_path +- add_to_breadcrumbs 'Users', admin_users_path - breadcrumb_title @user.name -- page_title "Impersonation Tokens", @user.name, "Users" +- page_title _('Impersonation Tokens'), @user.name, _('Users') +- type = _('impersonation token') +- type_plural = _('impersonation tokens') + = render 'admin/users/head' .row.prepend-top-default .col-lg-12 - if @new_impersonation_token - = render "shared/personal_access_tokens_created_container", new_token_value: @new_impersonation_token, - container_title: 'Your New Impersonation Token', - clipboard_button_title: _('Copy impersonation token') + = render 'shared/access_tokens/created_container', + type: type, + new_token_value: @new_impersonation_token - = render "shared/personal_access_tokens_form", path: admin_user_impersonation_tokens_path, impersonation: true, token: @impersonation_token, scopes: @scopes + = render 'shared/access_tokens/form', + type: type, + title: _('Add an impersonation token'), + path: admin_user_impersonation_tokens_path, + impersonation: true, + token: @impersonation_token, + scopes: @scopes - = render "shared/personal_access_tokens_table", impersonation: true, active_tokens: @active_impersonation_tokens, inactive_tokens: @inactive_impersonation_tokens + = render 'shared/access_tokens/table', + type: type, + type_plural: type_plural, + impersonation: true, + active_tokens: @active_impersonation_tokens, + revoke_route_helper: ->(token) { revoke_admin_user_impersonation_token_path(token.user, token) } diff --git a/app/views/admin/logs/show.html.haml b/app/views/admin/logs/show.html.haml deleted file mode 100644 index eb93f645ea6..00000000000 --- a/app/views/admin/logs/show.html.haml +++ /dev/null @@ -1,24 +0,0 @@ -- page_title "Logs" - -%ul.nav-links.log-tabs.nav.nav-tabs - - @loggers.each do |klass| - %li.nav-item - = link_to klass.file_name, "##{klass.file_name_noext}", data: { toggle: 'tab' }, class: "#{active_when(klass == @loggers.first)} nav-link" -.row-content-block - To prevent performance issues admin logs output the last 2000 lines -.tab-content - - @loggers.each do |klass| - .tab-pane{ class: active_when(klass == @loggers.first), id: klass.file_name_noext } - .file-holder#README - .js-file-title.file-title - %i.fa.fa-file - = klass.file_name - .float-right - = link_to '#', class: 'log-bottom' do - %i.fa.fa-arrow-down - Scroll down - .file-content.logs - %ol - - klass.read_latest.each do |line| - %li - %p= line diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml index 7274099806d..8abc4c37e70 100644 --- a/app/views/admin/projects/show.html.haml +++ b/app/views/admin/projects/show.html.haml @@ -14,11 +14,9 @@ .col-md-12 .card .card-header.alert.alert-danger - Last repository check - = "(#{time_ago_with_tooltip(@project.last_repository_check_at)})" - failed. See - = link_to 'repocheck.log', admin_logs_path - for error messages. + - 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 .row .col-md-6 .card @@ -135,24 +133,18 @@ .card.repository-check .card-header - Repository check + = _("Repository check") .card-body = form_for @project, url: repository_check_admin_project_path(@project), method: :post do |f| .form-group - if @project.last_repository_check_at.nil? - This repository has never been checked. + = _("This repository has never been checked.") + - elsif @project.last_repository_check_failed? + - failed_message = _("This repository was last checked %{last_check_timestamp}. The check %{strong_start}failed.%{strong_end} See the 'repocheck.log' file for error messages.") + - failed_message = failed_message % { last_check_timestamp: @project.last_repository_check_at.to_s(:medium), strong_start: "<strong class='cred'>", strong_end: "</strong>" } + = failed_message.html_safe - else - This repository was last checked - = @project.last_repository_check_at.to_s(:medium) + '.' - The check - - if @project.last_repository_check_failed? - = succeed '.' do - %strong.cred failed - See - = link_to 'repocheck.log', admin_logs_path - for error messages. - - else - passed. + = _("This repository was last checked %{last_check_timestamp}. The check passed.") % { last_check_timestamp: @project.last_repository_check_at.to_s(:medium) } = link_to icon('question-circle'), help_page_path('administration/repository_checks') diff --git a/app/views/admin/services/_deprecated_message.html.haml b/app/views/admin/services/_deprecated_message.html.haml deleted file mode 100644 index fea9506a4bb..00000000000 --- a/app/views/admin/services/_deprecated_message.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -.flash-container.flash-container-page - .flash-alert.deprecated-service - %span= @service.deprecation_message diff --git a/app/views/admin/services/edit.html.haml b/app/views/admin/services/edit.html.haml index 79f5ab0d77d..00ed5464a44 100644 --- a/app/views/admin/services/edit.html.haml +++ b/app/views/admin/services/edit.html.haml @@ -2,6 +2,4 @@ - breadcrumb_title @service.title - page_title @service.title, "Service Templates" -= render 'deprecated_message' if @service.deprecation_message - = render 'form' diff --git a/app/views/admin/sessions/_new_base.html.haml b/app/views/admin/sessions/_new_base.html.haml index a8d678d2b61..5be1c90d6aa 100644 --- a/app/views/admin/sessions/_new_base.html.haml +++ b/app/views/admin/sessions/_new_base.html.haml @@ -1,4 +1,4 @@ -= form_tag(admin_session_path, method: :post, html: { class: 'new_user gl-show-field-errors', 'aria-live': 'assertive'}) do += 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' } diff --git a/app/views/admin/sessions/_signin_box.html.haml b/app/views/admin/sessions/_signin_box.html.haml new file mode 100644 index 00000000000..cb6c0a76e56 --- /dev/null +++ b/app/views/admin/sessions/_signin_box.html.haml @@ -0,0 +1,19 @@ +- if any_form_based_providers_enabled? + - if crowd_enabled? + .login-box.tab-pane{ id: "crowd", role: 'tabpanel', class: active_when(form_based_auth_provider_has_active_class?(:crowd)) } + .login-body + = render 'devise/sessions/new_crowd' + + = render_if_exists 'devise/sessions/new_kerberos_tab' + + - ldap_servers.each_with_index do |server, i| + .login-box.tab-pane{ id: "#{server['provider_name']}", role: 'tabpanel', class: active_when(i.zero? && form_based_auth_provider_has_active_class?(:ldapmain)) } + .login-body + = render 'devise/sessions/new_ldap', server: server, hide_remember_me: true, submit_message: _('Enter Admin Mode') + + = 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-body + = render 'admin/sessions/new_base' diff --git a/app/views/admin/sessions/_tabs_normal.html.haml b/app/views/admin/sessions/_tabs_normal.html.haml deleted file mode 100644 index 2e279013720..00000000000 --- a/app/views/admin/sessions/_tabs_normal.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -%ul.nav-links.new-session-tabs.nav-tabs.nav{ role: 'tablist' } - %li.nav-item{ role: 'presentation' } - %a.nav-link.active{ href: '#login-pane', data: { toggle: 'tab', qa_selector: 'sign_in_tab' }, role: 'tab' }= tab_title diff --git a/app/views/admin/sessions/new.html.haml b/app/views/admin/sessions/new.html.haml index 0a7f20b861e..4ce1629bb53 100644 --- a/app/views/admin/sessions/new.html.haml +++ b/app/views/admin/sessions/new.html.haml @@ -5,18 +5,19 @@ .col-md-5.new-session-forms-container .login-page #signin-container - = render 'admin/sessions/tabs_normal', tab_title: _('Enter Admin Mode') + - 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 .tab-content - - if !current_user.require_password_creation_for_web? - .login-box.tab-pane.active{ id: 'login-pane', role: 'tabpanel' } - .login-body - = render 'admin/sessions/new_base' + - if allow_admin_mode_password_authentication_for_web? || ldap_sign_in_enabled? || crowd_enabled? + = render 'admin/sessions/signin_box' - - if omniauth_enabled? && button_based_providers_enabled? - .clearfix - = render 'devise/shared/omniauth_box', hide_remember_me: true + -# Show a message if none of the mechanisms above are enabled + - if !allow_admin_mode_password_authentication_for_web? && !ldap_sign_in_enabled? && !omniauth_enabled? + .prepend-top-default.center + = _('No authentication methods configured.') - -# Show a message if none of the mechanisms above are enabled - - if current_user.require_password_creation_for_web? && !omniauth_enabled? - .prepend-top-default.center - = _('No authentication methods configured.') + - if omniauth_enabled? && button_based_providers_enabled? + .clearfix + = render 'devise/shared/omniauth_box', hide_remember_me: true diff --git a/app/views/admin/sessions/two_factor.html.haml b/app/views/admin/sessions/two_factor.html.haml index 3a0cbe3facb..57a3452cf35 100644 --- a/app/views/admin/sessions/two_factor.html.haml +++ b/app/views/admin/sessions/two_factor.html.haml @@ -5,7 +5,7 @@ .col-md-5.new-session-forms-container .login-page #signin-container - = render 'admin/sessions/tabs_normal', tab_title: _('Enter Admin Mode') + = render 'devise/shared/tabs_normal', tab_title: _('Enter Admin Mode'), render_signup_link: false .tab-content .login-box.tab-pane.active{ id: 'login-pane', role: 'tabpanel' } .login-body diff --git a/app/views/ci/status/_dropdown_graph_badge.html.haml b/app/views/ci/status/_dropdown_graph_badge.html.haml index 369b0f7e62c..d9d646c77d9 100644 --- a/app/views/ci/status/_dropdown_graph_badge.html.haml +++ b/app/views/ci/status/_dropdown_graph_badge.html.haml @@ -8,12 +8,12 @@ - if status.has_details? = link_to status.details_path, class: 'mini-pipeline-graph-dropdown-item d-flex', data: { toggle: 'tooltip', title: tooltip, container: 'body' } do %span{ class: klass }= sprite_icon(status.icon) - %span.ci-build-text.text-truncate.mw-70p.gl-pl-1= subject.name + %span.ci-build-text.text-truncate.mw-70p.gl-pl-1-deprecated-no-really-do-not-use-me= subject.name - else .menu-item.mini-pipeline-graph-dropdown-item.d-flex{ data: { toggle: 'tooltip', title: tooltip, container: 'body' } } %span{ class: klass }= sprite_icon(status.icon) - %span.ci-build-text.text-truncate.mw-70p.gl-pl-1= subject.name + %span.ci-build-text.text-truncate.mw-70p.gl-pl-1-deprecated-no-really-do-not-use-me= subject.name - if status.has_action? = link_to status.action_path, class: "ci-action-icon-container ci-action-icon-wrapper js-ci-action-icon", method: status.action_method, data: { toggle: 'tooltip', title: status.action_title, container: 'body' } do diff --git a/app/views/ci/variables/_index.html.haml b/app/views/ci/variables/_index.html.haml index 4d8df4cc12a..26051261715 100644 --- a/app/views/ci/variables/_index.html.haml +++ b/app/views/ci/variables/_index.html.haml @@ -8,7 +8,7 @@ - if Feature.enabled?(:new_variables_ui, @project || @group, default_enabled: true) - is_group = !@group.nil? - #js-ci-project-variables{ data: { endpoint: save_endpoint, project_id: @project&.id || '', group: is_group.to_s, maskable_regex: ci_variable_maskable_regex} } + #js-ci-project-variables{ data: { endpoint: save_endpoint, project_id: @project&.id || '', group: is_group.to_s, maskable_regex: ci_variable_maskable_regex, protected_by_default: ci_variable_protected_by_default?.to_s} } - else .row diff --git a/app/views/clusters/clusters/_cluster.html.haml b/app/views/clusters/clusters/_cluster.html.haml index 9b6c0c20080..f11117ea5c4 100644 --- a/app/views/clusters/clusters/_cluster.html.haml +++ b/app/views/clusters/clusters/_cluster.html.haml @@ -2,7 +2,8 @@ .card-body.gl-responsive-table-row .table-section.section-60 .table-mobile-header{ role: "rowheader" }= s_("ClusterIntegration|Kubernetes cluster") - .table-mobile-content + .table-mobile-content.gl-display-flex.gl-align-items-center.gl-justify-content-end.gl-justify-content-md-start + .gl-w-6.gl-h-6.gl-mr-3.gl-display-flex.gl-align-items-center= provider_icon(cluster.provider_type) = cluster.item_link(clusterable, html_options: { data: { qa_selector: 'cluster', qa_cluster_name: cluster.name } }) - if cluster.status_name == :creating .spinner.ml-2.align-middle.has-tooltip{ title: s_("ClusterIntegration|Cluster being created") } diff --git a/app/views/clusters/clusters/index.html.haml b/app/views/clusters/clusters/index.html.haml index 28002dbff92..86194842664 100644 --- a/app/views/clusters/clusters/index.html.haml +++ b/app/views/clusters/clusters/index.html.haml @@ -19,7 +19,7 @@ = link_to _('More information'), help_page_path('user/group/clusters/index', anchor: 'cluster-precedence') - if Feature.enabled?(:clusters_list_redesign) - #js-clusters-list-app{ data: { endpoint: 'todo/add/endpoint' } } + #js-clusters-list-app{ data: { endpoint: clusterable.index_path(format: :json) } } - else .clusters-table.js-clusters-list .gl-responsive-table-row.table-row-header{ role: "row" } diff --git a/app/views/clusters/clusters/show.html.haml b/app/views/clusters/clusters/show.html.haml index 7fc76880480..1cc68d927bd 100644 --- a/app/views/clusters/clusters/show.html.haml +++ b/app/views/clusters/clusters/show.html.haml @@ -17,6 +17,7 @@ install_knative_path: clusterable.install_applications_cluster_path(@cluster, :knative), update_knative_path: clusterable.update_applications_cluster_path(@cluster, :knative), install_elastic_stack_path: clusterable.install_applications_cluster_path(@cluster, :elastic_stack), + install_fluentd_path: clusterable.install_applications_cluster_path(@cluster, :fluentd), cluster_environments_path: cluster_environments_path, toggle_status: @cluster.enabled? ? 'true': 'false', has_rbac: has_rbac_enabled?(@cluster) ? 'true': 'false', diff --git a/app/views/dashboard/snippets/index.html.haml b/app/views/dashboard/snippets/index.html.haml index 05214346496..2f0cc76f2e0 100644 --- a/app/views/dashboard/snippets/index.html.haml +++ b/app/views/dashboard/snippets/index.html.haml @@ -6,8 +6,6 @@ = render 'dashboard/snippets_head' - if current_user.snippets.exists? = render partial: 'snippets/snippets_scope_menu', locals: { include_private: true, counts: @snippet_counts } - -- if current_user.snippets.exists? = render partial: 'shared/snippets/list', locals: { link_project: true } - else = render 'shared/empty_states/snippets', button_path: button_path diff --git a/app/views/devise/registrations/new.html.haml b/app/views/devise/registrations/new.html.haml index 232dffa28b4..9fb5e27b692 100644 --- a/app/views/devise/registrations/new.html.haml +++ b/app/views/devise/registrations/new.html.haml @@ -8,7 +8,7 @@ = _("GitLab is a single application for the entire software development lifecycle. From project planning and source code management to CI/CD, monitoring, and security.") .col-lg-5.order-12 .text-center.mb-3 - %h2.font-weight-bold.gl-font-size-20= _('Register for GitLab') + %h2.font-weight-bold.gl-font-size-20-deprecated-no-really-do-not-use-me= _('Register for GitLab') = render 'devise/shared/experimental_separate_sign_up_flow_box' = render 'devise/shared/sign_in_link' - else diff --git a/app/views/devise/sessions/_new_ldap.html.haml b/app/views/devise/sessions/_new_ldap.html.haml index 31c4bb0e33e..3fc99b6a47d 100644 --- a/app/views/devise/sessions/_new_ldap.html.haml +++ b/app/views/devise/sessions/_new_ldap.html.haml @@ -1,4 +1,6 @@ - server = local_assigns.fetch(:server) +- hide_remember_me = local_assigns.fetch(:hide_remember_me, false) +- submit_message = local_assigns.fetch(:submit_message, _('Sign in')) = form_tag(omniauth_callback_path(:user, server['provider_name']), id: 'new_ldap_user', class: "gl-show-field-errors") do .form-group @@ -7,9 +9,11 @@ .form-group = label_tag :password = password_field_tag :password, nil, { class: "form-control bottom", title: "This field is required.", data: { qa_selector: 'password_field' }, required: true } - - if devise_mapping.rememberable? + - if !hide_remember_me && devise_mapping.rememberable? .remember-me %label{ for: "remember_me" } = check_box_tag :remember_me, '1', false, id: 'remember_me' %span Remember me - = submit_tag "Sign in", class: "btn-success btn", data: { qa_selector: 'sign_in_button' } + + .submit-container.move-submit-down + = submit_tag submit_message, class: "btn-success btn", data: { qa_selector: 'sign_in_button' } diff --git a/app/views/devise/shared/_omniauth_box.html.haml b/app/views/devise/shared/_omniauth_box.html.haml index cca0f756e76..5c3e4ccbfe5 100644 --- a/app/views/devise/shared/_omniauth_box.html.haml +++ b/app/views/devise/shared/_omniauth_box.html.haml @@ -1,3 +1,5 @@ +- hide_remember_me = local_assigns.fetch(:hide_remember_me, false) + .omniauth-container.prepend-top-15 %label.label-bold.d-block Sign in with @@ -10,7 +12,7 @@ = provider_image_tag(provider) %span = label_for_provider(provider) - - unless defined?(hide_remember_me) && hide_remember_me + - unless hide_remember_me %fieldset.remember-me %label = check_box_tag :remember_me, nil, false, class: 'remember-me-checkbox' diff --git a/app/views/devise/shared/_signin_box.html.haml b/app/views/devise/shared/_signin_box.html.haml index 6ddb7e1ac48..c0b005bac77 100644 --- a/app/views/devise/shared/_signin_box.html.haml +++ b/app/views/devise/shared/_signin_box.html.haml @@ -6,7 +6,7 @@ = render_if_exists 'devise/sessions/new_kerberos_tab' - - @ldap_servers.each_with_index do |server, i| + - ldap_servers.each_with_index do |server, i| .login-box.tab-pane{ id: "#{server['provider_name']}", role: 'tabpanel', class: active_when(i.zero? && form_based_auth_provider_has_active_class?(:ldapmain)) } .login-body = render 'devise/sessions/new_ldap', server: server diff --git a/app/views/devise/shared/_tabs_ldap.html.haml b/app/views/devise/shared/_tabs_ldap.html.haml index b8f0cd2a91a..eb14ad6006f 100644 --- a/app/views/devise/shared/_tabs_ldap.html.haml +++ b/app/views/devise/shared/_tabs_ldap.html.haml @@ -1,17 +1,20 @@ +- show_password_form = local_assigns.fetch(:show_password_form, password_authentication_enabled_for_web?) +- render_signup_link = local_assigns.fetch(:render_signup_link, true) + %ul.nav-links.new-session-tabs.nav-tabs.nav{ class: ('custom-provider-tabs' if any_form_based_providers_enabled?) } - if crowd_enabled? %li.nav-item = link_to "Crowd", "#crowd", class: "nav-link #{active_when(form_based_auth_provider_has_active_class?(:crowd))}", 'data-toggle' => 'tab' = render_if_exists "devise/shared/kerberos_tab" - - @ldap_servers.each_with_index do |server, i| + - ldap_servers.each_with_index do |server, i| %li.nav-item = link_to server['label'], "##{server['provider_name']}", class: "nav-link #{active_when(i.zero? && form_based_auth_provider_has_active_class?(:ldapmain))}", data: { toggle: 'tab', qa_selector: 'ldap_tab' } = render_if_exists 'devise/shared/tab_smartcard' - - if password_authentication_enabled_for_web? + - if show_password_form %li.nav-item - = link_to 'Standard', '#login-pane', class: 'nav-link', data: { toggle: 'tab', qa_selector: 'standard_tab' } - - if allow_signup? + = link_to _('Standard'), '#login-pane', class: 'nav-link', data: { toggle: 'tab', qa_selector: 'standard_tab' } + - if render_signup_link && allow_signup? %li.nav-item = link_to 'Register', '#register-pane', class: 'nav-link', data: { toggle: 'tab', qa_selector: 'register_tab' } diff --git a/app/views/devise/shared/_tabs_normal.html.haml b/app/views/devise/shared/_tabs_normal.html.haml index b6a1b8805ee..a2d5a8be625 100644 --- a/app/views/devise/shared/_tabs_normal.html.haml +++ b/app/views/devise/shared/_tabs_normal.html.haml @@ -1,6 +1,9 @@ +- tab_title = local_assigns.fetch(:tab_title, _('Sign in')) +- render_signup_link = local_assigns.fetch(:render_signup_link, true) + %ul.nav-links.new-session-tabs.nav-tabs.nav{ role: 'tablist' } %li.nav-item{ role: 'presentation' } - %a.nav-link.active{ href: '#login-pane', data: { toggle: 'tab', qa_selector: 'sign_in_tab' }, role: 'tab' } Sign in - - if allow_signup? + %a.nav-link.active{ href: '#login-pane', data: { toggle: 'tab', qa_selector: 'sign_in_tab' }, role: 'tab' }= tab_title + - if render_signup_link && allow_signup? %li.nav-item{ role: 'presentation' } %a.nav-link{ href: '#register-pane', data: { track_label: 'sign_in_register', track_property: '', track_event: 'click_button', track_value: '', toggle: 'tab', qa_selector: 'register_tab' }, role: 'tab' } Register diff --git a/app/views/groups/_flash_messages.html.haml b/app/views/groups/_flash_messages.html.haml new file mode 100644 index 00000000000..fa1a9d2cca4 --- /dev/null +++ b/app/views/groups/_flash_messages.html.haml @@ -0,0 +1,2 @@ += content_for :flash_message do + = render_if_exists 'shared/shared_runners_minutes_limit', namespace: @group, classes: [container_class, ("limit-container-width" unless fluid_layout)] diff --git a/app/views/groups/_home_panel.html.haml b/app/views/groups/_home_panel.html.haml index 6772ee94d46..d083288edc8 100644 --- a/app/views/groups/_home_panel.html.haml +++ b/app/views/groups/_home_panel.html.haml @@ -1,4 +1,5 @@ - can_create_subgroups = can?(current_user, :create_subgroup, @group) +- can_create_projects = can?(current_user, :create_projects, @group) - emails_disabled = @group.emails_disabled? .group-home-panel @@ -23,32 +24,33 @@ - if current_user .group-buttons = render 'shared/notifications/new_button', notification_setting: @notification_setting, btn_class: 'btn', emails_disabled: emails_disabled - - if can? current_user, :create_projects, @group - - new_project_label = _("New project") - - new_subgroup_label = _("New subgroup") - - if can_create_subgroups - .btn-group.new-project-subgroup.droplab-dropdown.home-panel-action-button.prepend-top-default.js-new-project-subgroup.qa-new-project-or-subgroup-dropdown{ data: { project_path: new_project_path(namespace_id: @group.id), subgroup_path: new_group_path(parent_id: @group.id) } } - %input.btn.btn-success.dropdown-primary.js-new-group-child.qa-new-in-group-button{ type: "button", value: new_project_label, data: { action: "new-project" } } - %button.btn.btn-success.dropdown-toggle.js-dropdown-toggle.qa-new-project-or-subgroup-dropdown-toggle{ type: "button", data: { "dropdown-trigger" => "#new-project-or-subgroup-dropdown", 'display' => 'static' } } - = sprite_icon("chevron-down", css_class: "icon dropdown-btn-icon") - %ul#new-project-or-subgroup-dropdown.dropdown-menu.dropdown-menu-right{ data: { dropdown: true } } - %li.droplab-item-selected.qa-new-project-option{ role: "button", data: { value: "new-project", text: new_project_label } } + - new_project_label = _("New project") + - new_subgroup_label = _("New subgroup") + - if can_create_projects and can_create_subgroups + .btn-group.new-project-subgroup.droplab-dropdown.home-panel-action-button.prepend-top-default.js-new-project-subgroup.qa-new-project-or-subgroup-dropdown{ data: { project_path: new_project_path(namespace_id: @group.id), subgroup_path: new_group_path(parent_id: @group.id) } } + %input.btn.btn-success.dropdown-primary.js-new-group-child.qa-new-in-group-button{ type: "button", value: new_project_label, data: { action: "new-project" } } + %button.btn.btn-success.dropdown-toggle.js-dropdown-toggle.qa-new-project-or-subgroup-dropdown-toggle{ type: "button", data: { "dropdown-trigger" => "#new-project-or-subgroup-dropdown", 'display' => 'static' } } + = sprite_icon("chevron-down", css_class: "icon dropdown-btn-icon") + %ul#new-project-or-subgroup-dropdown.dropdown-menu.dropdown-menu-right{ data: { dropdown: true } } + %li.droplab-item-selected.qa-new-project-option{ role: "button", data: { value: "new-project", text: new_project_label } } + .menu-item + .icon-container + = icon("check", class: "list-item-checkmark") + .description + %strong= new_project_label + %span= s_("GroupsTree|Create a project in this group.") + %li.divider.droplap-item-ignore + %li.qa-new-subgroup-option{ role: "button", data: { value: "new-subgroup", text: new_subgroup_label } } .menu-item .icon-container = icon("check", class: "list-item-checkmark") .description - %strong= new_project_label - %span= s_("GroupsTree|Create a project in this group.") - %li.divider.droplap-item-ignore - %li.qa-new-subgroup-option{ role: "button", data: { value: "new-subgroup", text: new_subgroup_label } } - .menu-item - .icon-container - = icon("check", class: "list-item-checkmark") - .description - %strong= new_subgroup_label - %span= s_("GroupsTree|Create a subgroup in this group.") - - else - = link_to new_project_label, new_project_path(namespace_id: @group.id), class: "btn btn-success prepend-top-default" + %strong= new_subgroup_label + %span= s_("GroupsTree|Create a subgroup in this group.") + - elsif can_create_projects + = link_to new_project_label, new_project_path(namespace_id: @group.id), class: "btn btn-success prepend-top-default" + - elsif can_create_subgroups + = link_to new_subgroup_label, new_group_path(parent_id: @group.id), class: "btn btn-success prepend-top-default" - if @group.description.present? .group-home-desc.mt-1 diff --git a/app/views/groups/edit.html.haml b/app/views/groups/edit.html.haml index fe5a00e3be9..2e58517fdc7 100644 --- a/app/views/groups/edit.html.haml +++ b/app/views/groups/edit.html.haml @@ -45,11 +45,11 @@ %section.settings.gs-advanced.no-animate#js-advanced-settings{ class: ('expanded' if expanded) } .settings-header %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only{ role: 'button' } - = _('Path, transfer, remove') + = _('Advanced') %button.btn.js-settings-toggle{ type: 'button' } = expanded ? _('Collapse') : _('Expand') %p - = _('Perform advanced options such as changing path, transferring, or removing the group.') + = _('Perform advanced options such as changing path, transferring, exporting, or removing the group.') .settings-content = render 'groups/settings/advanced' diff --git a/app/views/groups/group_members/index.html.haml b/app/views/groups/group_members/index.html.haml index 048edb80d99..1f2fb747c7d 100644 --- a/app/views/groups/group_members/index.html.haml +++ b/app/views/groups/group_members/index.html.haml @@ -9,20 +9,16 @@ = _("Group members") %hr - if can_manage_members - - if Feature.enabled?(:share_group_with_group, default_enabled: true) - %ul.nav-links.nav.nav-tabs.gitlab-tabs{ role: 'tablist' } + %ul.nav-links.nav.nav-tabs.gitlab-tabs{ role: 'tablist' } + %li.nav-tab{ role: 'presentation' } + %a.nav-link.active{ href: '#invite-member-pane', id: 'invite-member-tab', data: { toggle: 'tab' }, role: 'tab' }= _("Invite member") %li.nav-tab{ role: 'presentation' } - %a.nav-link.active{ href: '#invite-member-pane', id: 'invite-member-tab', data: { toggle: 'tab' }, role: 'tab' }= _("Invite member") - %li.nav-tab{ role: 'presentation' } - %a.nav-link{ href: '#invite-group-pane', id: 'invite-group-tab', data: { toggle: 'tab', qa_selector: 'invite_group_tab' }, role: 'tab' }= _("Invite group") - .tab-content.gitlab-tab-content - .tab-pane.active{ id: 'invite-member-pane', role: 'tabpanel' } - = render_invite_member_for_group(@group, @group_member.access_level) - - if Feature.enabled?(:share_group_with_group, default_enabled: true) - .tab-pane{ id: 'invite-group-pane', role: 'tabpanel' } - = render 'shared/members/invite_group', submit_url: group_group_links_path(@group), access_levels: GroupMember.access_level_roles, default_access_level: @group_member.access_level, group_link_field: 'shared_with_group_id', group_access_field: 'shared_group_access' - - else - = render_invite_member_for_group(@group, @group_member.access_level) + %a.nav-link{ href: '#invite-group-pane', id: 'invite-group-tab', data: { toggle: 'tab', qa_selector: 'invite_group_tab' }, role: 'tab' }= _("Invite group") + .tab-content.gitlab-tab-content + .tab-pane.active{ id: 'invite-member-pane', role: 'tabpanel' } + = render_invite_member_for_group(@group, @group_member.access_level) + .tab-pane{ id: 'invite-group-pane', role: 'tabpanel' } + = render 'shared/members/invite_group', submit_url: group_group_links_path(@group), access_levels: GroupMember.access_level_roles, default_access_level: @group_member.access_level, group_link_field: 'shared_with_group_id', group_access_field: 'shared_group_access' = render 'shared/members/requests', membership_source: @group, requesters: @requesters diff --git a/app/views/groups/settings/_advanced.html.haml b/app/views/groups/settings/_advanced.html.haml index 2734ab538a0..0df82898644 100644 --- a/app/views/groups/settings/_advanced.html.haml +++ b/app/views/groups/settings/_advanced.html.haml @@ -1,3 +1,5 @@ += render 'groups/settings/export', group: @group + .sub-section %h4.warning-title= s_('GroupSettings|Change group path') = form_for @group, html: { multipart: true, class: 'gl-show-field-errors' }, authenticity_token: true do |f| diff --git a/app/views/groups/settings/_default_branch_protection.html.haml b/app/views/groups/settings/_default_branch_protection.html.haml new file mode 100644 index 00000000000..e0e901cbc4a --- /dev/null +++ b/app/views/groups/settings/_default_branch_protection.html.haml @@ -0,0 +1,3 @@ +- return unless can_update_default_branch_protection?(group) + += render 'shared/default_branch_protection', f: f, selected_level: group.default_branch_protection diff --git a/app/views/groups/settings/_export.html.haml b/app/views/groups/settings/_export.html.haml new file mode 100644 index 00000000000..ef7bf562c69 --- /dev/null +++ b/app/views/groups/settings/_export.html.haml @@ -0,0 +1,28 @@ +- return unless Feature.enabled?(:group_import_export, @group, default_enabled: true) + +- group = local_assigns.fetch(:group) + +.sub-section + %h4= s_('GroupSettings|Export group') + %p= _('Export this group with all related data to a new GitLab instance. Once complete, you can import the data file from the "New Group" page.') + + .bs-callout.bs-callout-info + %p.append-bottom-0 + %p= _('The following items will be exported:') + %ul + - group_export_descriptions.each do |description| + %li= description + %p= _('The following items will NOT be exported:') + %ul + %li= _('Projects') + %li= _('Runner tokens') + %li= _('SAML discovery tokens') + %p= _('Once the exported file is ready, you will receive a notification email with a download link, or you can download it from this page.') + - if group.export_file_exists? + = link_to _('Regenerate export'), export_group_path(group), + method: :post, class: 'btn btn-default', data: { qa_selector: 'regenerate_export_group_link' } + = link_to _('Download export'), download_export_group_path(group), + rel: 'nofollow', method: :get, class: 'btn btn-default', data: { qa_selector: 'download_export_link' } + - else + = link_to _('Export group'), export_group_path(group), + method: :post, class: 'btn btn-default', data: { qa_selector: 'export_group_link' } diff --git a/app/views/groups/settings/_permissions.html.haml b/app/views/groups/settings/_permissions.html.haml index 1ddaa855e62..e886c99a656 100644 --- a/app/views/groups/settings/_permissions.html.haml +++ b/app/views/groups/settings/_permissions.html.haml @@ -33,7 +33,7 @@ = render_if_exists 'groups/settings/ip_restriction', f: f, group: @group = render_if_exists 'groups/settings/allowed_email_domain', f: f, group: @group = render 'groups/settings/lfs', f: f - = render 'shared/default_branch_protection', f: f, selected_level: @group.default_branch_protection + = render 'groups/settings/default_branch_protection', f: f, group: @group = render 'groups/settings/project_creation_level', f: f, group: @group = render 'groups/settings/subgroup_creation_level', f: f, group: @group = render 'groups/settings/two_factor_auth', f: f diff --git a/app/views/groups/settings/integrations/index.html.haml b/app/views/groups/settings/integrations/index.html.haml index 78825cc72b0..96bd6d69a96 100644 --- a/app/views/groups/settings/integrations/index.html.haml +++ b/app/views/groups/settings/integrations/index.html.haml @@ -6,4 +6,4 @@ %p = s_('GroupSettings|Integrations configured here will automatically apply to all projects in this group.') = link_to _('Learn more'), '#' -= render 'shared/integrations/integrations', integrations: @integrations += render 'shared/integrations/index', integrations: @integrations diff --git a/app/views/groups/settings/repository/show.html.haml b/app/views/groups/settings/repository/show.html.haml index 1f1d7779267..ff0c9de4fef 100644 --- a/app/views/groups/settings/repository/show.html.haml +++ b/app/views/groups/settings/repository/show.html.haml @@ -1,6 +1,6 @@ - breadcrumb_title _('Repository Settings') - page_title _('Repository') -- deploy_token_description = s_('DeployTokens|Group deploy tokens allow read-only access to the repositories and registry images within the group.') +- deploy_token_description = s_('DeployTokens|Group deploy tokens allow access to the packages, repositories, and registry images within the group.') = render "shared/deploy_tokens/index", group_or_project: @group, description: deploy_token_description diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index a9c19502a7c..032766327ca 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -1,9 +1,15 @@ - breadcrumb_title _("Details") - @content_class = "limit-container-width" unless fluid_layout += content_for :flash_message do + - if Feature.enabled?(:subscribable_banner_subscription) + = render_if_exists "layouts/header/ee_subscribable_banner", subscription: true + = content_for :meta_tags do = auto_discovery_link_tag(:atom, group_url(@group, rss_url_options), title: "#{@group.name} activity") += render partial: 'flash_messages' + %div{ class: [("limit-container-width" unless fluid_layout)] } = render_if_exists 'trials/banner', namespace: @group diff --git a/app/views/groups/sidebar/_packages.html.haml b/app/views/groups/sidebar/_packages.html.haml index 16b902a18b9..67e759a4d63 100644 --- a/app/views/groups/sidebar/_packages.html.haml +++ b/app/views/groups/sidebar/_packages.html.haml @@ -4,12 +4,12 @@ .nav-icon-container = sprite_icon('package') %span.nav-item-name - = _('Packages') + = _('Packages & Registries') %ul.sidebar-sub-level-items = nav_link(controller: [:packages, :repositories], html_options: { class: "fly-out-top-item" } ) do = link_to group_container_registries_path(@group), title: _('Container Registry') do %strong.fly-out-top-item-name - = _('Packages') + = _('Packages & Registries') %li.divider.fly-out-top-item = nav_link(controller: 'groups/container_registries') do = link_to group_container_registries_path(@group), title: _('Container Registry') do diff --git a/app/views/help/_shortcuts.html.haml b/app/views/help/_shortcuts.html.haml index 4b9304cfdb9..bd5424c30c6 100644 --- a/app/views/help/_shortcuts.html.haml +++ b/app/views/help/_shortcuts.html.haml @@ -65,25 +65,23 @@ %tbody %tr %th - %th= _('Web IDE') + %th= _('Editing') %tr %td.shortcut - if browser.platform.mac? - %kbd ⌘ p + %kbd ⌘ shift p - else - %kbd ctrl p - %td= _('Go to file') + %kbd ctrl shift p + %td= _('Toggle Markdown preview') %tr %td.shortcut - - if browser.platform.mac? - %kbd ⌘ enter - - else - %kbd ctrl enter - %td= _('Commit (when editing commit message)') + %kbd + %i.fa.fa-arrow-up + %td= _('Edit your most recent comment in a thread (from an empty textarea)') %tbody %tr %th - %th= _('Wiki pages') + %th= _('Wiki') %tr %td.shortcut %kbd e @@ -91,19 +89,49 @@ %tbody %tr %th - %th= _('Editing') + %th= _('Repository Graph') %tr %td.shortcut - - if browser.platform.mac? - %kbd ⌘ shift p - - else - %kbd ctrl shift p - %td= _('Toggle Markdown preview') + %kbd + %i.fa.fa-arrow-left + \/ + %kbd h + %td= _('Scroll left') + %tr + %td.shortcut + %kbd + %i.fa.fa-arrow-right + \/ + %kbd l + %td= _('Scroll right') %tr %td.shortcut %kbd %i.fa.fa-arrow-up - %td= _('Edit your most recent comment in a thread (from an empty textarea)') + \/ + %kbd k + %td= _('Scroll up') + %tr + %td.shortcut + %kbd + %i.fa.fa-arrow-down + \/ + %kbd j + %td= _('Scroll down') + %tr + %td.shortcut + %kbd + shift + %i.fa.fa-arrow-up + \/ k + %td= _('Scroll to top') + %tr + %td.shortcut + %kbd + shift + %i.fa.fa-arrow-down + \/ j + %td= _('Scroll to bottom') .col-lg-4 %table.shortcut-mappings.text-2 %tbody @@ -229,15 +257,7 @@ %tbody %tr %th - %th= _('Issues / Merge Requests') - %tr - %td.shortcut - %kbd a - %td= _('Change assignee') - %tr - %td.shortcut - %kbd m - %td= _('Change milestone') + %th= _('Epics, Issues, and Merge Requests') %tr %td.shortcut %kbd r @@ -250,92 +270,76 @@ %td.shortcut %kbd l %td= _('Change label') + %tbody + %tr + %th + %th= _('Issues and Merge Requests') + %tr + %td.shortcut + %kbd a + %td= _('Change assignee') + %tr + %td.shortcut + %kbd m + %td= _('Change milestone') + %tbody + %tr + %th + %th= _('Merge Requests') %tr %td.shortcut %kbd ] \/ %kbd j - %td= _('Next file in diff (MRs only)') + %td= _('Next file in diff') %tr %td.shortcut %kbd [ \/ %kbd k - %td= _('Previous file in diff (MRs only)') + %td= _('Previous file in diff') %tr %td.shortcut - if browser.platform.mac? %kbd ⌘ p - else %kbd ctrl p - %td= _('Go to file (MRs only)') + %td= _('Go to file') %tr %td.shortcut %kbd n - %td= _('Next unresolved discussion (MRs only)') + %td= _('Next unresolved discussion') %tr %td.shortcut %kbd p - %td= _('Previous unresolved discussion (MRs only)') + %td= _('Previous unresolved discussion') %tbody %tr %th - %th= _('Epics (Ultimate / Gold license only)') + %th= _('Merge Request Commits') %tr %td.shortcut - %kbd r - %td= _('Comment/Reply (quoting selected text)') - %tr - %td.shortcut - %kbd e - %td= _('Edit epic description') + %kbd c + %td= _('Next commit') %tr %td.shortcut - %kbd l - %td= _('Change label') + %kbd x + %td= _('Previous commit') %tbody %tr %th - %th= _('Repository Graph') - %tr - %td.shortcut - %kbd - %i.fa.fa-arrow-left - \/ - %kbd h - %td= _('Scroll left') - %tr - %td.shortcut - %kbd - %i.fa.fa-arrow-right - \/ - %kbd l - %td= _('Scroll right') - %tr - %td.shortcut - %kbd - %i.fa.fa-arrow-up - \/ - %kbd k - %td= _('Scroll up') - %tr - %td.shortcut - %kbd - %i.fa.fa-arrow-down - \/ - %kbd j - %td= _('Scroll down') + %th= _('Web IDE') %tr %td.shortcut - %kbd - shift - %i.fa.fa-arrow-up - \/ k - %td= _('Scroll to top') + - if browser.platform.mac? + %kbd ⌘ p + - else + %kbd ctrl p + %td= _('Go to file') %tr %td.shortcut - %kbd - shift - %i.fa.fa-arrow-down - \/ j - %td= _('Scroll to bottom') + - if browser.platform.mac? + %kbd ⌘ enter + - else + %kbd ctrl enter + %td= _('Commit (when editing commit message)') diff --git a/app/views/import/google_code/new_user_map.html.haml b/app/views/import/google_code/new_user_map.html.haml index f523b993aa7..732ba95a63f 100644 --- a/app/views/import/google_code/new_user_map.html.haml +++ b/app/views/import/google_code/new_user_map.html.haml @@ -30,7 +30,7 @@ .form-group.row .col-sm-12 - = text_area_tag :user_map, JSON.pretty_generate(@user_map), class: 'form-control', rows: 15 + = text_area_tag :user_map, Gitlab::Json.pretty_generate(@user_map), class: 'form-control', rows: 15 .form-actions = submit_tag _('Continue to the next step'), class: "btn btn-success" diff --git a/app/views/kaminari/gitlab/_page.html.haml b/app/views/kaminari/gitlab/_page.html.haml index 33e00256100..b000a490e3e 100644 --- a/app/views/kaminari/gitlab/_page.html.haml +++ b/app/views/kaminari/gitlab/_page.html.haml @@ -11,4 +11,4 @@ ('js-first-button' if page.first?), ('js-last-button' if page.last?), ('d-none d-md-block' if !page.current?) ] } - = link_to page, url, { remote: remote, rel: page.next? ? 'next' : page.prev? ? 'prev' : nil, class: 'page-link' } + = link_to page, url, { remote: remote, rel: page.next? ? 'next' : page.prev? ? 'prev' : nil, class: ['page-link', active_when(page.current?)] } diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml index 8c272a73d40..99c4fc0d1b6 100644 --- a/app/views/layouts/_head.html.haml +++ b/app/views/layouts/_head.html.haml @@ -68,6 +68,7 @@ = csrf_meta_tags = csp_meta_tag + = action_cable_meta_tag - unless browser.safari? %meta{ name: 'referrer', content: 'origin-when-cross-origin' } diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index 49345b7b215..3885fa311ba 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -5,6 +5,7 @@ .mobile-overlay .alert-wrapper = render 'shared/outdated_browser' + = render_if_exists 'layouts/header/users_over_license_banner' - if Feature.enabled?(:subscribable_banner_license, default_enabled: true) = render_if_exists "layouts/header/ee_subscribable_banner" = render "layouts/broadcast" diff --git a/app/views/layouts/devise.html.haml b/app/views/layouts/devise.html.haml index 6a261bbbc46..bbcb525ea4f 100644 --- a/app/views/layouts/devise.html.haml +++ b/app/views/layouts/devise.html.haml @@ -22,10 +22,10 @@ = brand_text - else %h3.mt-sm-0 - = _('Open source software to collaborate on code') + = _('A complete DevOps platform') %p - = _('Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki.') + = _('GitLab is a single application for the entire software development lifecycle. From project planning and source code management to CI/CD, monitoring, and security.') - if Gitlab::CurrentSettings.sign_in_text.present? = markdown_field(Gitlab::CurrentSettings.current_application_settings, :sign_in_text) diff --git a/app/views/layouts/header/_current_user_dropdown.html.haml b/app/views/layouts/header/_current_user_dropdown.html.haml index 410b120396d..7d9924719a2 100644 --- a/app/views/layouts/header/_current_user_dropdown.html.haml +++ b/app/views/layouts/header/_current_user_dropdown.html.haml @@ -27,6 +27,7 @@ %li = link_to s_("CurrentUser|Settings"), profile_path, data: { qa_selector: 'settings_link' } = render_if_exists 'layouts/header/buy_ci_minutes', project: @project, namespace: @group + = render_if_exists 'layouts/header/upgrade' - if current_user_menu?(:help) %li.divider.d-md-none diff --git a/app/views/layouts/header/_help_dropdown.html.haml b/app/views/layouts/header/_help_dropdown.html.haml index a003d6f8903..2b3f5d266b0 100644 --- a/app/views/layouts/header/_help_dropdown.html.haml +++ b/app/views/layouts/header/_help_dropdown.html.haml @@ -1,5 +1,6 @@ %ul - if current_user_menu?(:help) + = render_if_exists 'layouts/header/whats_new_dropdown_item' %li = link_to _("Help"), help_path %li diff --git a/app/views/layouts/nav/sidebar/_admin.html.haml b/app/views/layouts/nav/sidebar/_admin.html.haml index 52964dd6739..28e52dc85db 100644 --- a/app/views/layouts/nav/sidebar/_admin.html.haml +++ b/app/views/layouts/nav/sidebar/_admin.html.haml @@ -56,7 +56,7 @@ = _('Monitoring') %ul.sidebar-sub-level-items{ data: { qa_selector: 'admin_sidebar_monitoring_submenu_content' } } - = nav_link(controller: %w(system_info background_jobs logs health_check requests_profiles), html_options: { class: "fly-out-top-item" } ) do + = nav_link(controller: %w(system_info background_jobs health_check requests_profiles), html_options: { class: "fly-out-top-item" } ) do = link_to admin_system_info_path do %strong.fly-out-top-item-name = _('Monitoring') @@ -69,10 +69,6 @@ = link_to admin_background_jobs_path, title: _('Background Jobs') do %span = _('Background Jobs') - = nav_link(controller: :logs) do - = link_to admin_logs_path, title: _('Logs') do - %span - = _('Logs') = nav_link(controller: :health_check) do = link_to admin_health_check_path, title: _('Health Check') do %span @@ -271,11 +267,6 @@ = link_to network_admin_application_settings_path, title: _('Network'), data: { qa_selector: 'admin_settings_network_item' } do %span = _('Network') - - if template_exists?('admin/geo/settings/show') - = nav_link do - = link_to geo_admin_application_settings_path, title: _('Geo') do - %span - = _('Geo') = nav_link(path: 'application_settings#preferences') do = link_to preferences_admin_application_settings_path, title: _('Preferences'), data: { qa_selector: 'admin_settings_preferences_link' } do %span diff --git a/app/views/layouts/nav/sidebar/_group.html.haml b/app/views/layouts/nav/sidebar/_group.html.haml index f63a7b3a664..92b6174795b 100644 --- a/app/views/layouts/nav/sidebar/_group.html.haml +++ b/app/views/layouts/nav/sidebar/_group.html.haml @@ -102,6 +102,8 @@ = render_if_exists "layouts/nav/ee/security_link" # EE-specific + = render_if_exists "layouts/nav/ee/push_rules_link" # EE-specific + - if group_sidebar_link?(:kubernetes) = nav_link(controller: [:clusters]) do = link_to group_clusters_path(@group) do diff --git a/app/views/layouts/nav/sidebar/_profile.html.haml b/app/views/layouts/nav/sidebar/_profile.html.haml index 15f1067f0d9..95d66786984 100644 --- a/app/views/layouts/nav/sidebar/_profile.html.haml +++ b/app/views/layouts/nav/sidebar/_profile.html.haml @@ -152,10 +152,6 @@ = link_to audit_log_profile_path do %strong.fly-out-top-item-name = _('Authentication Log') - - - if Feature.enabled?(:user_usage_quota) = render_if_exists 'layouts/nav/sidebar/profile_usage_quotas_link' - - else - = render_if_exists 'layouts/nav/sidebar/profile_pipeline_quota_link' = render 'shared/sidebar_toggle_button' diff --git a/app/views/layouts/nav/sidebar/_project.html.haml b/app/views/layouts/nav/sidebar/_project.html.haml index c11d1256d21..a67860e8e2e 100644 --- a/app/views/layouts/nav/sidebar/_project.html.haml +++ b/app/views/layouts/nav/sidebar/_project.html.haml @@ -203,7 +203,7 @@ - if project_nav_tab? :operations = nav_link(controller: sidebar_operations_paths) do - = link_to sidebar_operations_link_path, class: 'shortcuts-operations qa-link-operations' do + = link_to sidebar_operations_link_path, class: 'shortcuts-operations', data: { qa_selector: 'operations_link' } do .nav-icon-container = sprite_icon('cloud-gear') %span.nav-item-name @@ -222,6 +222,13 @@ %span = _('Metrics') + - if project_nav_tab?(:alert_management) + = nav_link(controller: :alert_management) do + = link_to project_alert_management_index_path(@project), title: _('Alerts'), class: 'shortcuts-tracking qa-operations-tracking-link' do + %span + = _('Alerts') + + - if project_nav_tab? :environments = render_if_exists "layouts/nav/sidebar/tracing_link" = nav_link(controller: :environments, action: [:index, :folder, :show, :new, :edit, :create, :update, :stop, :terminal]) do @@ -356,6 +363,11 @@ = link_to project_hooks_path(@project), title: _('Webhooks'), data: { qa_selector: 'webhooks_settings_link' } do %span = _('Webhooks') + - if project_access_token_available?(@project) + = nav_link(controller: [:access_tokens]) do + = link_to project_settings_access_tokens_path(@project), title: _('Access Tokens'), data: { qa_selector: 'access_tokens_settings_link' } do + %span + = _('Access Tokens') = nav_link(controller: :repository) do = link_to project_settings_repository_path(@project), title: _('Repository') do %span @@ -367,7 +379,7 @@ = _('CI / CD') - if !@project.archived? && settings_operations_available? = nav_link(controller: [:operations]) do - = link_to project_settings_operations_path(@project), title: _('Operations') do + = link_to project_settings_operations_path(@project), title: _('Operations'), data: { qa_selector: 'operations_settings_link' } do = _('Operations') - if @project.pages_available? = nav_link(controller: :pages) do diff --git a/app/views/layouts/nav/sidebar/_project_packages_link.html.haml b/app/views/layouts/nav/sidebar/_project_packages_link.html.haml index 0fdfc6cd2ab..0931ccdf637 100644 --- a/app/views/layouts/nav/sidebar/_project_packages_link.html.haml +++ b/app/views/layouts/nav/sidebar/_project_packages_link.html.haml @@ -4,12 +4,12 @@ .nav-icon-container = sprite_icon('package') %span.nav-item-name - = _('Packages') + = _('Packages & Registries') %ul.sidebar-sub-level-items = nav_link(controller: :repositories, html_options: { class: "fly-out-top-item" } ) do = link_to project_container_registry_index_path(@project) do %strong.fly-out-top-item-name - = _('Packages') + = _('Packages & Registries') %li.divider.fly-out-top-item = nav_link controller: :repositories do = link_to project_container_registry_index_path(@project), class: 'shortcuts-container-registry', title: _('Container Registry') do diff --git a/app/views/notify/group_was_exported_email.html.haml b/app/views/notify/group_was_exported_email.html.haml new file mode 100644 index 00000000000..a2f34537662 --- /dev/null +++ b/app/views/notify/group_was_exported_email.html.haml @@ -0,0 +1,9 @@ +%p + = _('Group %{group_name} was exported successfully.') % { group_name: @group.name } + +%p + = _('The group export can be downloaded from:') + = link_to download_export_group_url(@group), rel: 'nofollow', download: '' do + #{@group.full_name} export +%p + = _('The download link will expire in 24 hours.') diff --git a/app/views/notify/group_was_exported_email.text.erb b/app/views/notify/group_was_exported_email.text.erb new file mode 100644 index 00000000000..02571459af0 --- /dev/null +++ b/app/views/notify/group_was_exported_email.text.erb @@ -0,0 +1,6 @@ +<%= _('Group %{group_name} was exported successfully.') % { group_name: @group.name } %> + +<%= _('The group export can be downloaded from:') %> +<%= download_export_group_url(@group) %> + +<%= _('The download link will expire in 24 hours.') %> diff --git a/app/views/notify/group_was_not_exported_email.html.haml b/app/views/notify/group_was_not_exported_email.html.haml new file mode 100644 index 00000000000..58fc34d41a3 --- /dev/null +++ b/app/views/notify/group_was_not_exported_email.html.haml @@ -0,0 +1,10 @@ +%p + = _("Group %{group_name} couldn't be exported.") % { group_name: @group.name } + +%p + = _('The errors we encountered were:') + + %ul + - @errors.each do |error| + %li + #{error} diff --git a/app/views/notify/group_was_not_exported_email.text.erb b/app/views/notify/group_was_not_exported_email.text.erb new file mode 100644 index 00000000000..92bd79b7b85 --- /dev/null +++ b/app/views/notify/group_was_not_exported_email.text.erb @@ -0,0 +1,7 @@ +<%= _("Group %{group_name} couldn't be exported.") % { group_name: @group.name } %> + +<%= _('The errors we encountered were:') %> + +<% @errors.each do |error| -%> + - <%= error %> +<% end -%> diff --git a/app/views/notify/issues_csv_email.html.haml b/app/views/notify/issues_csv_email.html.haml index b777ca1e57d..77502a45f02 100644 --- a/app/views/notify/issues_csv_email.html.haml +++ b/app/views/notify/issues_csv_email.html.haml @@ -1,9 +1,6 @@ --# haml-lint:disable NoPlainNodes %p{ style: 'font-size:18px; text-align:center; line-height:30px;' } - Your CSV export of #{ pluralize(@written_count, 'issue') } from project - %a{ href: project_url(@project), style: "color:#3777b0; text-decoration:none; display:block;" } - = @project.full_name - has been added to this email as an attachment. + - project_link = link_to(@project.full_name, project_url(@project), style: "color:#3777b0; text-decoration:none; display:block;") + = _('Your CSV export of %{issues_count} from project %{project_link} has been added to this email as an attachment.').html_safe % { issues_count: pluralize(@written_count, 'issue'), project_link: project_link } - if @truncated %p - This attachment has been truncated to avoid exceeding a maximum allowed attachment size of 15MB. #{ @written_count } of #{ @issues_count } issues have been included. Consider re-exporting with a narrower selection of issues. + = _('This attachment has been truncated to avoid exceeding the maximum allowed attachment size of 15MB. %{written_count} of %{issues_count} issues have been included. Consider re-exporting with a narrower selection of issues.') % { written_count: @written_count, issues_count: @issues_count } diff --git a/app/views/notify/issues_csv_email.text.erb b/app/views/notify/issues_csv_email.text.erb index 5d4128e3ae9..a1d2a4691bc 100644 --- a/app/views/notify/issues_csv_email.text.erb +++ b/app/views/notify/issues_csv_email.text.erb @@ -1,5 +1,5 @@ -Your CSV export of <%= pluralize(@written_count, 'issue') %> from project <%= @project.full_name %> (<%= project_url(@project) %>) has been added to this email as an attachment. +<%= _('Your CSV export of %{written_count} from project %{project_name} (%{project_url}) has been added to this email as an attachment.') % { written_count: pluralize(@written_count, 'issue'), project_name: @project.full_name, project_url: project_url(@project) } %> <% if @truncated %> -This attachment has been truncated to avoid exceeding a maximum allowed attachment size of 15MB. <%= @written_count %> of <%= @issues_count %> issues have been included. Consider re-exporting with a narrower selection of issues. + <%= _('This attachment has been truncated to avoid exceeding the maximum allowed attachment size of 15MB. %{written_count} of %{issues_count} issues have been included. Consider re-exporting with a narrower selection of issues.') % { written_count: @written_count, issues_count: @issues_count} %> <% end %> diff --git a/app/views/notify/note_design_email.html.haml b/app/views/notify/note_design_email.html.haml new file mode 100644 index 00000000000..5e69f01a486 --- /dev/null +++ b/app/views/notify/note_design_email.html.haml @@ -0,0 +1 @@ += render 'note_email' diff --git a/app/views/notify/note_design_email.text.erb b/app/views/notify/note_design_email.text.erb new file mode 100644 index 00000000000..413d9e6e9ac --- /dev/null +++ b/app/views/notify/note_design_email.text.erb @@ -0,0 +1 @@ +<%= render 'note_email' %> diff --git a/app/views/notify/unknown_sign_in_email.html.haml b/app/views/notify/unknown_sign_in_email.html.haml new file mode 100644 index 00000000000..a4123fada1b --- /dev/null +++ b/app/views/notify/unknown_sign_in_email.html.haml @@ -0,0 +1,14 @@ +%p + = _('Hi %{username}!') % { username: sanitize_name(@user.name) } +%p + = _('A sign-in to your account has been made from the following IP address: %{ip}.') % { ip: @ip } +%p + - password_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: 'https://docs.gitlab.com/ee/user/profile/#changing-your-password' } + = _('If you recently signed in and recognize the IP address, you may disregard this email.') + = _('If you did not recently sign in, you should immediately %{password_link_start}change your password%{password_link_end}.').html_safe % { password_link_start: password_link_start, password_link_end: '</a>'.html_safe } + = _('Passwords should be unique and not used for any other sites or services.') + +- unless @user.two_factor_enabled? + %p + - mfa_link_start = '<a href="https://docs.gitlab.com/ee/user/profile/account/two_factor_authentication.html" target="_blank">'.html_safe + = _('To further protect your account, consider configuring a %{mfa_link_start}two-factor authentication%{mfa_link_end} method.').html_safe % { mfa_link_start: mfa_link_start, mfa_link_end: '</a>'.html_safe } diff --git a/app/views/notify/unknown_sign_in_email.text.haml b/app/views/notify/unknown_sign_in_email.text.haml new file mode 100644 index 00000000000..f3efc4c4fcd --- /dev/null +++ b/app/views/notify/unknown_sign_in_email.text.haml @@ -0,0 +1,10 @@ += _('Hi %{username}!') % { username: sanitize_name(@user.name) } + += _('A sign-in to your account has been made from the following IP address: %{ip}') % { ip: @ip } + += _('If you recently signed in and recognize the IP address, you may disregard this email.') += _('If you did not recently sign in, you should immediately change your password: %{password_link}.') % { password_link: 'https://docs.gitlab.com/ee/user/profile/#changing-your-password' } += _('Passwords should be unique and not used for any other sites or services.') + +- unless @user.two_factor_enabled? + = _('To further protect your account, consider configuring a two-factor authentication method: %{mfa_link}.') % { mfa_link: 'https://docs.gitlab.com/ee/user/profile/account/two_factor_authentication.html' } diff --git a/app/views/profiles/keys/_form.html.haml b/app/views/profiles/keys/_form.html.haml index 34e81285328..7709aa8f4b9 100644 --- a/app/views/profiles/keys/_form.html.haml +++ b/app/views/profiles/keys/_form.html.haml @@ -14,7 +14,7 @@ .col.form-group = f.label :expires_at, s_('Profiles|Expires at'), class: 'label-bold' - = f.date_field :expires_at, class: "form-control input-lg qa-key-expiry-field", min: Date.tomorrow + = f.date_field :expires_at, class: "form-control input-lg", min: Date.tomorrow, data: { qa_selector: 'key_expiry_date_field' } .js-add-ssh-key-validation-warning.hide .bs-callout.bs-callout-warning{ role: 'alert', aria_live: 'assertive' } diff --git a/app/views/profiles/personal_access_tokens/index.html.haml b/app/views/profiles/personal_access_tokens/index.html.haml index d9e94908b80..81b22d964a5 100644 --- a/app/views/profiles/personal_access_tokens/index.html.haml +++ b/app/views/profiles/personal_access_tokens/index.html.haml @@ -1,6 +1,8 @@ - breadcrumb_title s_('AccessTokens|Access Tokens') - page_title s_('AccessTokens|Personal Access Tokens') -- @content_class = "limit-container-width" unless fluid_layout +- type = _('personal access token') +- type_plural = _('personal access tokens') +- @content_class = 'limit-container-width' unless fluid_layout .row.prepend-top-default .col-lg-4.profile-settings-sidebar @@ -14,11 +16,21 @@ .col-lg-8 - if @new_personal_access_token - = render "shared/personal_access_tokens_created_container", new_token_value: @new_personal_access_token + = render 'shared/access_tokens/created_container', + type: type, + new_token_value: @new_personal_access_token - = render "shared/personal_access_tokens_form", path: profile_personal_access_tokens_path, impersonation: false, token: @personal_access_token, scopes: @scopes + = render 'shared/access_tokens/form', + type: type, + path: profile_personal_access_tokens_path, + token: @personal_access_token, + scopes: @scopes - = render "shared/personal_access_tokens_table", impersonation: false, active_tokens: @active_personal_access_tokens, inactive_tokens: @inactive_personal_access_tokens + = render 'shared/access_tokens/table', + type: type, + type_plural: type_plural, + active_tokens: @active_personal_access_tokens, + revoke_route_helper: ->(token) { revoke_profile_personal_access_token_path(token) } %hr .row.prepend-top-default @@ -30,7 +42,7 @@ %p = s_('AccessTokens|It cannot be used to access any other data.') .col-lg-8.feed-token-reset - = label_tag :feed_token, s_('AccessTokens|Feed token'), class: "label-bold" + = label_tag :feed_token, s_('AccessTokens|Feed token'), class: 'label-bold' = text_field_tag :feed_token, current_user.feed_token, class: 'form-control js-select-on-focus', readonly: true %p.form-text.text-muted - reset_link = link_to s_('AccessTokens|reset it'), [:reset, :feed_token, :profile], method: :put, data: { confirm: s_('AccessTokens|Are you sure? Any RSS or calendar URLs currently in use will stop working.') } @@ -48,7 +60,7 @@ %p = s_('AccessTokens|It cannot be used to access any other data.') .col-lg-8.incoming-email-token-reset - = label_tag :incoming_email_token, s_('AccessTokens|Incoming email token'), class: "label-bold" + = label_tag :incoming_email_token, s_('AccessTokens|Incoming email token'), class: 'label-bold' = text_field_tag :incoming_email_token, current_user.incoming_email_token, class: 'form-control js-select-on-focus', readonly: true %p.form-text.text-muted - reset_link = link_to s_('AccessTokens|reset it'), [:reset, :incoming_email_token, :profile], method: :put, data: { confirm: s_('AccessTokens|Are you sure? Any issue email addresses currently in use will stop working.') } diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml index da2b8c40191..43fc9150e99 100644 --- a/app/views/profiles/show.html.haml +++ b/app/views/profiles/show.html.haml @@ -20,6 +20,9 @@ = s_("Profiles|You can upload your avatar here or change it at %{gravatar_link}").html_safe % { gravatar_link: gravatar_link } - else = s_("Profiles|You can upload your avatar here") + - if current_appearance&.profile_image_guidelines? + .md + = brand_profile_image_guidelines .col-lg-8 .clearfix.avatar-image.append-bottom-default = link_to avatar_icon_for_user(@user, 400), target: '_blank', rel: 'noopener noreferrer' do @@ -101,7 +104,7 @@ - else = f.text_field :location, label: s_('Profiles|Location'), class: 'input-lg', placeholder: s_("Profiles|City, country") = f.text_field :job_title, class: 'input-md' - = f.text_field :organization, readonly: @user.gitlab_employee?, label: s_('Profiles|Organization'), class: 'input-md', help: s_("Profiles|Who you represent or work for") + = f.text_field :organization, label: s_('Profiles|Organization'), class: 'input-md', help: s_("Profiles|Who you represent or work for") = f.text_area :bio, label: s_('Profiles|Bio'), rows: 4, maxlength: 250, help: s_("Profiles|Tell us about yourself in fewer than 250 characters") %hr %h5= s_("Private profile") diff --git a/app/views/projects/alert_management/details.html.haml b/app/views/projects/alert_management/details.html.haml new file mode 100644 index 00000000000..5230d5e3476 --- /dev/null +++ b/app/views/projects/alert_management/details.html.haml @@ -0,0 +1,4 @@ +- add_to_breadcrumbs s_('AlertManagement|Alerts'), project_alert_management_index_path(@project) +- page_title s_('AlertManagement|Alert detail') + +#js-alert_details{ data: alert_management_detail_data(@project, @alert_id) } diff --git a/app/views/projects/alert_management/index.html.haml b/app/views/projects/alert_management/index.html.haml new file mode 100644 index 00000000000..415820ac3ad --- /dev/null +++ b/app/views/projects/alert_management/index.html.haml @@ -0,0 +1,3 @@ +- page_title _('Alerts') + +#js-alert_management{ data: alert_management_data(@current_user, @project) } diff --git a/app/views/projects/blob/_header.html.haml b/app/views/projects/blob/_header.html.haml index 76a9d3df5d7..2a1545e7db7 100644 --- a/app/views/projects/blob/_header.html.haml +++ b/app/views/projects/blob/_header.html.haml @@ -4,13 +4,13 @@ .file-actions< = render 'projects/blob/viewer_switcher', blob: blob unless blame - = edit_blob_button - = ide_edit_button + = edit_blob_button(@project, @ref, @path, blob: blob) + = ide_edit_button(@project, @ref, @path, blob: blob) .btn-group.ml-2{ role: "group" }> = render_if_exists 'projects/blob/header_file_locks_link' - if current_user - = replace_blob_link - = delete_blob_link + = replace_blob_link(@project, @ref, @path, blob: blob) + = delete_blob_link(@project, @ref, @path, blob: blob) .btn-group.ml-2{ role: "group" } = copy_blob_source_button(blob) unless blame = open_raw_blob_button(blob) diff --git a/app/views/projects/blob/_template_selectors.html.haml b/app/views/projects/blob/_template_selectors.html.haml index 2be95bc5541..ba8029ac32a 100644 --- a/app/views/projects/blob/_template_selectors.html.haml +++ b/app/views/projects/blob/_template_selectors.html.haml @@ -1,4 +1,4 @@ -.template-selectors-menu.gl-pl-2 +.template-selectors-menu.gl-pl-2-deprecated-no-really-do-not-use-me .template-selector-dropdowns-wrap .template-type-selector.js-template-type-selector-wrap.hidden - toggle_text = should_suggest_gitlab_ci_yml? ? '.gitlab-ci.yml' : 'Select a template type' diff --git a/app/views/projects/buttons/_download.html.haml b/app/views/projects/buttons/_download.html.haml index cae8bbf8c01..445752d0a15 100644 --- a/app/views/projects/buttons/_download.html.haml +++ b/app/views/projects/buttons/_download.html.haml @@ -12,14 +12,13 @@ %h5.m-0.dropdown-bold-header= _('Download source code') .dropdown-menu-content = render 'projects/buttons/download_links', project: project, ref: ref, archive_prefix: archive_prefix, path: nil - - if Feature.enabled?(:git_archive_path, default_enabled: true) - - if vue_file_list_enabled? - #js-directory-downloads{ data: { links: directory_download_links(project, ref, archive_prefix).to_json } } - - elsif directory? - %section.border-top.pt-1.mt-1 - %h5.m-0.dropdown-bold-header= _('Download this directory') - .dropdown-menu-content - = render 'projects/buttons/download_links', project: project, ref: ref, archive_prefix: archive_prefix, path: @path + - if vue_file_list_enabled? + #js-directory-downloads{ data: { links: directory_download_links(project, ref, archive_prefix).to_json } } + - elsif directory? + %section.border-top.pt-1.mt-1 + %h5.m-0.dropdown-bold-header= _('Download this directory') + .dropdown-menu-content + = render 'projects/buttons/download_links', project: project, ref: ref, archive_prefix: archive_prefix, path: @path - if pipeline && pipeline.latest_builds_with_artifacts.any? %section.border-top.pt-1.mt-1 %h5.m-0.dropdown-bold-header= _('Download artifacts') diff --git a/app/views/projects/commit/_signature.html.haml b/app/views/projects/commit/_signature.html.haml index aa7c90bad66..fb31ac44118 100644 --- a/app/views/projects/commit/_signature.html.haml +++ b/app/views/projects/commit/_signature.html.haml @@ -1,3 +1,3 @@ - if signature - - uri = "projects/commit/#{"x509/" if signature.instance_of?(X509CommitSignature)}" + - uri = "projects/commit/#{"x509/" if x509_signature?(signature)}" = render partial: "#{uri}#{signature.verification_status}_signature_badge", locals: { signature: signature } diff --git a/app/views/projects/commit/_signature_badge.html.haml b/app/views/projects/commit/_signature_badge.html.haml index 8ecaa1329fd..8004a5facd7 100644 --- a/app/views/projects/commit/_signature_badge.html.haml +++ b/app/views/projects/commit/_signature_badge.html.haml @@ -17,13 +17,13 @@ - content = capture do - if show_user .clearfix - - uri_signature_badge_user = "projects/commit/#{"x509/" if signature.instance_of?(X509CommitSignature)}signature_badge_user" + - uri_signature_badge_user = "projects/commit/#{"x509/" if x509_signature?(signature)}signature_badge_user" = render partial: "#{uri_signature_badge_user}", locals: { signature: signature } - - if signature.instance_of?(X509CommitSignature) + - if x509_signature?(signature) = render partial: "projects/commit/x509/certificate_details", locals: { signature: signature } - = link_to(_('Learn more about x509 signed commits'), help_page_path('user/project/repository/x509_signed_commits/index.md'), class: 'gpg-popover-help-link') + = link_to(_('Learn more about X.509 signed commits'), help_page_path('user/project/repository/x509_signed_commits/index.md'), class: 'gpg-popover-help-link') - else = _('GPG Key ID:') %span.monospace= signature.gpg_key_primary_keyid diff --git a/app/views/projects/commit/x509/_signature_badge_user.html.haml b/app/views/projects/commit/x509/_signature_badge_user.html.haml index b64ccba2a18..f3d39b21ec2 100644 --- a/app/views/projects/commit/x509/_signature_badge_user.html.haml +++ b/app/views/projects/commit/x509/_signature_badge_user.html.haml @@ -1,5 +1,5 @@ -- user = signature.commit.committer - user_email = signature.x509_certificate.email +- user = signature.user - if user = link_to user_path(user), class: 'gpg-popover-user-link' do diff --git a/app/views/projects/commits/_commit.html.haml b/app/views/projects/commits/_commit.html.haml index 8b659034fe6..b42eef32a76 100644 --- a/app/views/projects/commits/_commit.html.haml +++ b/app/views/projects/commits/_commit.html.haml @@ -1,6 +1,8 @@ -#----------------------------------------------------------------- WARNING: Please keep changes up-to-date with the following files: - `assets/javascripts/diffs/components/commit_item.vue` + + EXCEPTION WARNING - see above `.vue` file for de-sync drift -#----------------------------------------------------------------- - view_details = local_assigns.fetch(:view_details, false) - merge_request = local_assigns.fetch(:merge_request, nil) diff --git a/app/views/projects/cycle_analytics/show.html.haml b/app/views/projects/cycle_analytics/show.html.haml index da20fee227a..b6c30c680e4 100644 --- a/app/views/projects/cycle_analytics/show.html.haml +++ b/app/views/projects/cycle_analytics/show.html.haml @@ -5,6 +5,9 @@ %banner{ "v-if" => "!isOverviewDialogDismissed", "documentation-link": help_page_path('user/analytics/value_stream_analytics.md'), "v-on:dismiss-overview-dialog" => "dismissOverviewDialog()" } + .mb-3 + %h3 + = _("Value Stream Analytics") %gl-loading-icon{ "v-show" => "isLoading", "size" => "lg" } .wrapper{ "v-show" => "!isLoading && !hasError" } .card @@ -54,7 +57,7 @@ %nav.stage-nav %ul %stage-nav-item{ "v-for" => "stage in state.stages", ":key" => '`ca-stage-title-${stage.title}`', '@select' => 'selectStage(stage)', ":title" => "stage.title", ":is-user-allowed" => "stage.isUserAllowed", ":value" => "stage.value", ":is-active" => "stage.active" } - .section.stage-events + .section.stage-events.overflow-auto %gl-loading-icon{ "v-show" => "isLoadingStage", "size" => "lg" } %template{ "v-if" => "currentStage && !currentStage.isUserAllowed" } = render partial: "no_access" diff --git a/app/views/projects/graphs/charts.html.haml b/app/views/projects/graphs/charts.html.haml index 19fe7ba4360..7257dacf680 100644 --- a/app/views/projects/graphs/charts.html.haml +++ b/app/views/projects/graphs/charts.html.haml @@ -1,5 +1,9 @@ - page_title _("Repository Analytics") +.mb-3 + %h3 + = _("Repository Analytics") + .repo-charts %h4.sub-header = _("Programming languages used in this repository") @@ -9,6 +13,23 @@ #js-languages-chart{ data: { chart_data: @languages.to_json.html_safe } } +- if defined?(@daily_coverage_options) + .repo-charts.my-5 + .sub-header-block.border-top + .d-flex.justify-content-between.align-items-center + %h4.sub-header.m-0 + - start_date = capture do + #{@daily_coverage_options[:base_params][:start_date].strftime('%b %d')} + - end_date = capture do + #{@daily_coverage_options[:base_params][:end_date].strftime('%b %d')} + = (_("Code coverage statistics for master %{start_date} - %{end_date}") % {start_date: start_date, end_date: end_date}) + - download_path = capture do + #{@daily_coverage_options[:download_path]} + %a.btn.btn-sm{ href: "#{download_path}?#{@daily_coverage_options[:base_params].to_query}" } + %small + = _("Download raw data (.csv)") + #js-code-coverage-chart{ data: { daily_coverage_options: @daily_coverage_options.to_json.html_safe } } + .repo-charts .sub-header-block.border-top diff --git a/app/views/projects/graphs/show.html.haml b/app/views/projects/graphs/show.html.haml index a952db0eea3..495a4ac50bf 100644 --- a/app/views/projects/graphs/show.html.haml +++ b/app/views/projects/graphs/show.html.haml @@ -1,6 +1,6 @@ - page_title _('Contributors') -.sub-header-block.bg-gray-light.gl-p-3 +.sub-header-block.bg-gray-light.gl-p-3-deprecated-no-really-do-not-use-me .tree-ref-holder.inline.vertical-align-middle = render 'shared/ref_switcher', destination: 'graphs' = link_to s_('Commits|History'), project_commits_path(@project, current_ref), class: 'btn' diff --git a/app/views/projects/import/jira/show.html.haml b/app/views/projects/import/jira/show.html.haml index 4106bcc2e5a..cddd97cbc84 100644 --- a/app/views/projects/import/jira/show.html.haml +++ b/app/views/projects/import/jira/show.html.haml @@ -1,6 +1,7 @@ - if Feature.enabled?(:jira_issue_import_vue, @project, default_enabled: true) .js-jira-import-root{ data: { project_path: @project.full_path, issues_path: project_issues_path(@project), + jira_integration_path: edit_project_service_path(@project, :jira), is_jira_configured: @project.jira_service.present?.to_s, jira_projects: @jira_projects.to_json, in_progress_illustration: image_path('illustrations/export-import.svg'), diff --git a/app/views/projects/issues/_design_management.html.haml b/app/views/projects/issues/_design_management.html.haml new file mode 100644 index 00000000000..96f1dc0155c --- /dev/null +++ b/app/views/projects/issues/_design_management.html.haml @@ -0,0 +1,15 @@ +- if @project.design_management_enabled? + .js-design-management{ data: { project_path: @project.full_path, issue_iid: @issue.iid, issue_path: project_issue_path(@project, @issue) } } +- else + .mt-4 + .row.empty-state + .col-12 + .text-content + %h4.center + = _('The one place for your designs') + %p.center + - requirements_link_url = help_page_path('user/project/issues/design_management', anchor: 'requirements') + - requirements_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: requirements_link_url } + - support_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: support_url } + - link_end = '</a>'.html_safe + = s_("DesignManagement|To enable design management, you'll need to %{requirements_link_start}meet the requirements%{requirements_link_end}. If you need help, reach out to our %{support_link_start}support team%{support_link_end} for assistance.").html_safe % { requirements_link_start: requirements_link_start, requirements_link_end: link_end, support_link_start: support_link_start, support_link_end: link_end } diff --git a/app/views/projects/issues/_issue.html.haml b/app/views/projects/issues/_issue.html.haml index 54002b9ca2e..1bf0c8eb031 100644 --- a/app/views/projects/issues/_issue.html.haml +++ b/app/views/projects/issues/_issue.html.haml @@ -6,12 +6,13 @@ = check_box_tag dom_id(issue, "selected"), nil, false, 'data-id' => issue.id, class: "selected-issuable" .issuable-info-container .issuable-main-info - .issue-title.title + .issue-title.title.d-flex.align-items-center %span.issue-title-text.js-onboarding-issue-item{ dir: "auto" } - if issue.confidential? %span.has-tooltip{ title: _('Confidential') } = confidential_icon(issue) = link_to issue.title, issue_path(issue) + = render_if_exists 'projects/issues/subepic_flag', issue: issue - if issue.tasks? %span.task-status.d-none.d-sm-inline-block @@ -24,7 +25,7 @@ · opened #{time_ago_with_tooltip(issue.created_at, placement: 'bottom')} by #{link_to_member(@project, issue.author, avatar: false)} - = gitlab_team_member_badge(issue.author) + = render_if_exists 'shared/issuable/gitlab_team_member_badge', {author: issue.author} - if issue.milestone %span.issuable-milestone.d-none.d-sm-inline-block diff --git a/app/views/projects/issues/_related_branches.html.haml b/app/views/projects/issues/_related_branches.html.haml index 69b030ed76a..0604e89be6e 100644 --- a/app/views/projects/issues/_related_branches.html.haml +++ b/app/views/projects/issues/_related_branches.html.haml @@ -4,11 +4,9 @@ %ul.unstyled-list.related-merge-requests - @related_branches.each do |branch| %li - - target = @project.repository.find_branch(branch).dereferenced_target - - pipeline = @project.pipeline_for(branch, target.sha) if target - - if can?(current_user, :read_pipeline, pipeline) + - if branch[:pipeline_status].present? %span.related-branch-ci-status - = render 'ci/status/icon', status: pipeline.detailed_status(current_user) + = render 'ci/status/icon', status: branch[:pipeline_status] %span.related-branch-info %strong - = link_to branch, project_compare_path(@project, from: @project.default_branch, to: branch), class: "ref-name" + = link_to branch[:name], branch[:link], class: "ref-name" diff --git a/app/views/projects/issues/_tabs.html.haml b/app/views/projects/issues/_tabs.html.haml new file mode 100644 index 00000000000..d998a01623f --- /dev/null +++ b/app/views/projects/issues/_tabs.html.haml @@ -0,0 +1,14 @@ +%ul.nav-tabs.nav.nav-links{ role: 'tablist' } + %li + = link_to '#discussion-tab', class: 'active js-issue-tabs', id: 'discussion', role: 'tab', 'aria-controls': 'js-discussion', 'aria-selected': 'true', data: { toggle: 'tab', target: '#discussion-tab', qa_selector: 'discussion_tab_link' } do + = _('Discussion') + %span.badge.badge-pill.js-discussions-count + %li + = link_to '#designs-tab', class: 'js-issue-tabs', id: 'designs', role: 'tab', 'aria-controls': 'js-designs', 'aria-selected': 'false', data: { toggle: 'tab', target: '#designs-tab', qa_selector: 'designs_tab_link' } do + = _('Designs') + %span.badge.badge-pill.js-designs-count +.tab-content + #discussion-tab.tab-pane.show.active{ role: 'tabpanel', 'aria-labelledby': 'discussion', data: { qa_selector: 'discussion_tab_content' } } + = render 'projects/issues/discussion' + #designs-tab.tab-pane{ role: 'tabpanel', 'aria-labelledby': 'designs', data: { qa_selector: 'designs_tab_content' } } + = render 'projects/issues/design_management' diff --git a/app/views/projects/issues/export_csv/_modal.html.haml b/app/views/projects/issues/export_csv/_modal.html.haml index af3a087ca59..9fdeb901b56 100644 --- a/app/views/projects/issues/export_csv/_modal.html.haml +++ b/app/views/projects/issues/export_csv/_modal.html.haml @@ -1,4 +1,3 @@ --# haml-lint:disable NoPlainNodes - if current_user .issues-export-modal.modal .modal-dialog diff --git a/app/views/projects/issues/index.html.haml b/app/views/projects/issues/index.html.haml index 2633a3899f7..0aef4e39466 100644 --- a/app/views/projects/issues/index.html.haml +++ b/app/views/projects/issues/index.html.haml @@ -6,6 +6,12 @@ = content_for :meta_tags do = auto_discovery_link_tag(:atom, safe_params.merge(rss_url_options).to_h, title: "#{@project.name} issues") +- if @project.jira_issues_import_feature_flag_enabled? + .js-projects-issues-root{ data: { can_edit: can?(current_user, :admin_project, @project).to_s, + is_jira_configured: @project.jira_service.present?.to_s, + issues_path: project_issues_path(@project), + project_path: @project.full_path } } + - if project_issues(@project).exists? .top-area = render 'shared/issuable/nav', type: :issues diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index 4fc67884584..c8ffa2e3720 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -10,6 +10,8 @@ - can_report_spam = @issue.submittable_as_spam_by?(current_user) - can_create_issue = show_new_issue_link?(@project) += render_if_exists "projects/issues/alert_blocked", issue: @issue, current_user: current_user + .detail-page-header .detail-page-header-body .issuable-status-box.status-box.status-box-issue-closed{ class: issue_status_visibility(@issue, status_box: :closed) } @@ -50,7 +52,7 @@ %li.divider %li= link_to 'New issue', new_project_issue_path(@project), id: 'new_issue_link' - = render 'shared/issuable/close_reopen_button', issuable: @issue, can_update: can_update_issue, can_reopen: can_reopen_issue + = render 'shared/issuable/close_reopen_button', issuable: @issue, can_update: can_update_issue, can_reopen: can_reopen_issue, warn_before_close: defined?(@issue.blocked?) && @issue.blocked? - if can_report_spam = link_to 'Submit as spam', mark_as_spam_project_issue_path(@project, @issue), method: :post, class: 'd-none d-sm-none d-md-block btn btn-grouped btn-spam', title: 'Submit as spam' @@ -84,13 +86,13 @@ .content-block.emoji-block.emoji-block-sticky .row - .col-md-12.col-lg-6.js-noteable-awards + .col-md-12.col-lg-4.js-noteable-awards = render 'award_emoji/awards_block', awardable: @issue, inline: true - .col-md-12.col-lg-6.new-branch-col + .col-md-12.col-lg-8.new-branch-col #js-vue-sort-issue-discussions #js-vue-discussion-filter{ data: { default_filter: current_user&.notes_filter_for(@issue), notes_filters: UserPreference.notes_filters.to_json } } = render 'new_branch' if show_new_branch_button? - = render_if_exists 'projects/issues/discussion' + = render 'projects/issues/tabs' = render 'shared/issuable/sidebar', issuable_sidebar: @issuable_sidebar, assignees: @issue.assignees diff --git a/app/views/projects/labels/index.html.haml b/app/views/projects/labels/index.html.haml index 0373e37818d..760d81136c6 100644 --- a/app/views/projects/labels/index.html.haml +++ b/app/views/projects/labels/index.html.haml @@ -22,13 +22,13 @@ .content-list.manage-labels-list.js-prioritized-labels{ data: { url: set_priorities_project_labels_path(@project), sortable: can_admin_label } } #js-priority-labels-empty-state.priority-labels-empty-state{ class: "#{'hidden' unless @prioritized_labels.empty? && search.blank?}" } = render 'shared/empty_states/priority_labels' - - if @prioritized_labels.present? + - if @prioritized_labels.any? = render partial: 'shared/label', collection: @prioritized_labels, as: :label, locals: { force_priority: true, subject: @project } - elsif search.present? .nothing-here-block = _('No prioritized labels with such name or description') - - if @labels.present? + - if @labels.any? .other-labels %h5{ class: ('hide' if hide) }= _('Other Labels') .content-list.manage-labels-list.js-other-labels diff --git a/app/views/projects/merge_requests/_how_to_merge.html.haml b/app/views/projects/merge_requests/_how_to_merge.html.haml index 9cdbbe7204b..a2da0e707d3 100644 --- a/app/views/projects/merge_requests/_how_to_merge.html.haml +++ b/app/views/projects/merge_requests/_how_to_merge.html.haml @@ -53,4 +53,4 @@ %strong Tip: = succeed '.' do You can also checkout merge requests locally by - = link_to 'following these guidelines', help_page_path('user/project/merge_requests/index.md', anchor: "checkout-merge-requests-locally"), target: '_blank', rel: 'noopener noreferrer' + = link_to 'following these guidelines', help_page_path('user/project/merge_requests/reviewing_and_managing_merge_requests.md', anchor: "checkout-merge-requests-locally"), target: '_blank', rel: 'noopener noreferrer' diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml index f7f5388a54a..a753ee50c43 100644 --- a/app/views/projects/merge_requests/_merge_request.html.haml +++ b/app/views/projects/merge_requests/_merge_request.html.haml @@ -20,7 +20,7 @@ · opened #{time_ago_with_tooltip(merge_request.created_at, placement: 'bottom')} by #{link_to_member(@project, merge_request.author, avatar: false)} - = gitlab_team_member_badge(merge_request.author) + = render_if_exists 'shared/issuable/gitlab_team_member_badge', {author: merge_request.author} - if merge_request.milestone %span.issuable-milestone.d-none.d-sm-inline-block diff --git a/app/views/projects/merge_requests/_widget.html.haml b/app/views/projects/merge_requests/_widget.html.haml index 1853d40c2e4..6aba5c98d52 100644 --- a/app/views/projects/merge_requests/_widget.html.haml +++ b/app/views/projects/merge_requests/_widget.html.haml @@ -8,6 +8,7 @@ window.gl.mrWidgetData.squash_before_merge_help_path = '#{help_page_path("user/project/merge_requests/squash_and_merge")}'; window.gl.mrWidgetData.troubleshooting_docs_path = '#{help_page_path('user/project/merge_requests/reviewing_and_managing_merge_requests.md', anchor: 'troubleshooting')}'; + window.gl.mrWidgetData.pipeline_must_succeed_docs_path = '#{help_page_path('user/project/merge_requests/merge_when_pipeline_succeeds.md', anchor: 'only-allow-merge-requests-to-be-merged-if-the-pipeline-succeeds')}'; window.gl.mrWidgetData.security_approvals_help_page_path = '#{help_page_path('user/application_security/index.html', anchor: 'security-approvals-in-merge-requests-ultimate')}'; window.gl.mrWidgetData.eligible_approvers_docs_path = '#{help_page_path('user/project/merge_requests/merge_request_approvals', anchor: 'eligible-approvers')}'; window.gl.mrWidgetData.pipelines_empty_svg_path = '#{image_path('illustrations/pipelines_empty.svg')}'; diff --git a/app/views/projects/merge_requests/creations/update_branches.html.haml b/app/views/projects/merge_requests/creations/update_branches.html.haml deleted file mode 100644 index 64482973a89..00000000000 --- a/app/views/projects/merge_requests/creations/update_branches.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -= render 'projects/merge_requests/dropdowns/branch', -branches: @target_branches, -selected: nil diff --git a/app/views/projects/mirrors/_mirror_repos.html.haml b/app/views/projects/mirrors/_mirror_repos.html.haml index 4004c4f4b07..38e4fbf73e0 100644 --- a/app/views/projects/mirrors/_mirror_repos.html.haml +++ b/app/views/projects/mirrors/_mirror_repos.html.haml @@ -10,7 +10,7 @@ = expanded ? _('Collapse') : _('Expand') %p = _('Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically.') - = link_to _('Read more'), help_page_path('workflow/repository_mirroring'), target: '_blank' + = link_to _('Read more'), help_page_path('user/project/repository/repository_mirroring.md'), target: '_blank' .settings-content - if mirror_settings_enabled diff --git a/app/views/projects/mirrors/_mirror_repos_push.html.haml b/app/views/projects/mirrors/_mirror_repos_push.html.haml index 8482424a184..9b5b31bfc15 100644 --- a/app/views/projects/mirrors/_mirror_repos_push.html.haml +++ b/app/views/projects/mirrors/_mirror_repos_push.html.haml @@ -1,15 +1,13 @@ - protocols = Gitlab::UrlSanitizer::ALLOWED_SCHEMES.join('|') -- keep_divergent_refs = Feature.enabled?(:keep_divergent_refs, @project) = f.fields_for :remote_mirrors, @project.remote_mirrors.build do |rm_f| = rm_f.hidden_field :enabled, value: '1' = rm_f.hidden_field :url, class: 'js-mirror-url-hidden', required: true, pattern: "(#{protocols}):\/\/.+" = rm_f.hidden_field :only_protected_branches, class: 'js-mirror-protected-hidden' - - if keep_divergent_refs - = rm_f.hidden_field :keep_divergent_refs, class: 'js-mirror-keep-divergent-refs-hidden' + = rm_f.hidden_field :keep_divergent_refs, class: 'js-mirror-keep-divergent-refs-hidden' = render partial: 'projects/mirrors/ssh_host_keys', locals: { f: rm_f } = render partial: 'projects/mirrors/authentication_method', locals: { f: rm_f } - - if keep_divergent_refs - .form-check.append-bottom-10 - = check_box_tag :keep_divergent_refs, '1', false, class: 'js-mirror-keep-divergent-refs form-check-input' - = label_tag :keep_divergent_refs, 'Keep divergent refs', class: 'form-check-label' + .form-check.append-bottom-10 + = check_box_tag :keep_divergent_refs, '1', false, class: 'js-mirror-keep-divergent-refs form-check-input' + = label_tag :keep_divergent_refs, _('Keep divergent refs'), class: 'form-check-label' + = link_to icon('question-circle'), help_page_path('user/project/repository/repository_mirroring', anchor: 'keep-divergent-refs-core'), target: '_blank' diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index 3ff4ab354b9..c18af6a267b 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -18,7 +18,7 @@ = _('All features are enabled for blank projects, from templates, or when importing, but you can disable them afterward in the project settings.') = render_if_exists 'projects/new_ci_cd_banner_external_repo' %p - - pages_getting_started_guide = link_to _('Pages getting started guide'), help_page_path("user/project/pages/getting_started_part_two", anchor: "fork-a-project-to-get-started-from"), target: '_blank' + - pages_getting_started_guide = link_to _('Pages getting started guide'), help_page_path("user/project/pages/index", anchor: "getting-started"), target: '_blank' = _('Information about additional Pages templates and how to install them can be found in our %{pages_getting_started_guide}.').html_safe % { pages_getting_started_guide: pages_getting_started_guide } .md = brand_new_project_guidelines diff --git a/app/views/projects/pipelines/_with_tabs.html.haml b/app/views/projects/pipelines/_with_tabs.html.haml index 37ca020cfb6..e39f543d42e 100644 --- a/app/views/projects/pipelines/_with_tabs.html.haml +++ b/app/views/projects/pipelines/_with_tabs.html.haml @@ -1,4 +1,5 @@ -- test_reports_enabled = Feature.enabled?(:junit_pipeline_view) +- test_reports_enabled = Feature.enabled?(:junit_pipeline_view, @project) +- dag_pipeline_tab_enabled = Feature.enabled?(:dag_pipeline_tab) .tabs-holder %ul.pipelines-tabs.nav-links.no-top.no-bottom.mobile-separator.nav.nav-tabs @@ -9,6 +10,10 @@ = link_to builds_project_pipeline_path(@project, @pipeline), data: { target: '#js-tab-builds', action: 'builds', toggle: 'tab' }, class: 'builds-tab' do = _('Jobs') %span.badge.badge-pill.js-builds-counter= pipeline.total_size + - if dag_pipeline_tab_enabled + %li.js-dag-tab-link + = link_to dag_project_pipeline_path(@project, @pipeline), data: { target: '#js-tab-dag', action: 'dag', toggle: 'tab' }, class: 'dag-tab' do + = _('DAG') - if @pipeline.failed_builds.present? %li.js-failures-tab-link = link_to failures_project_pipeline_path(@project, @pipeline), data: { target: '#js-tab-failures', action: 'failures', toggle: 'tab' }, class: 'failures-tab' do @@ -75,6 +80,9 @@ %code.bash.js-build-output = build_summary(build) + - if dag_pipeline_tab_enabled + #js-tab-dag.tab-pane + #js-tab-tests.tab-pane #js-pipeline-tests-detail = render_if_exists "projects/pipelines/tabs_content", pipeline: @pipeline, project: @project diff --git a/app/views/projects/pipelines/index.html.haml b/app/views/projects/pipelines/index.html.haml index f64f07487fd..64789c7c263 100644 --- a/app/views/projects/pipelines/index.html.haml +++ b/app/views/projects/pipelines/index.html.haml @@ -3,6 +3,7 @@ = render_if_exists "shared/shared_runners_minutes_limit_flash_message" #pipelines-list-vue{ data: { endpoint: project_pipelines_path(@project, format: :json), + project_id: @project.id, "help-page-path" => help_page_path('ci/quick_start/README'), "help-auto-devops-path" => help_page_path('topics/autodevops/index.md'), "empty-state-svg-path" => image_path('illustrations/pipelines_empty.svg'), diff --git a/app/views/projects/services/_deprecated_message.html.haml b/app/views/projects/services/_deprecated_message.html.haml deleted file mode 100644 index fea9506a4bb..00000000000 --- a/app/views/projects/services/_deprecated_message.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -.flash-container.flash-container-page - .flash-alert.deprecated-service - %span= @service.deprecation_message diff --git a/app/views/projects/services/_form.html.haml b/app/views/projects/services/_form.html.haml index 0dbd6a48ec5..3f91bdc4266 100644 --- a/app/views/projects/services/_form.html.haml +++ b/app/views/projects/services/_form.html.haml @@ -1,19 +1,19 @@ .row.prepend-top-default.append-bottom-default - .col-lg-3 + .col-lg-4 %h4.prepend-top-0 = @service.title - [true, false].each do |value| - - hide_class = 'd-none' if @service.activated? != value + - hide_class = 'd-none' if @service.operating? != value %span.js-service-active-status{ class: hide_class, data: { value: value.to_s } } = boolean_to_icon value - if @service.respond_to?(:detailed_description) %p= @service.detailed_description - .col-lg-9 + .col-lg-8 = form_for(@service, as: :service, url: scoped_integration_path(@service), method: :put, html: { class: 'gl-show-field-errors integration-settings-form js-integration-settings-form', data: { 'can-test' => @service.can_test?, 'test-url' => test_project_service_path(@project, @service) } }) do |form| = render 'shared/service_settings', form: form, service: @service .footer-block.row-content-block - = service_save_button(@service) + = service_save_button = link_to _('Cancel'), project_settings_integrations_path(@project), class: 'btn btn-cancel' diff --git a/app/views/projects/services/_index.html.haml b/app/views/projects/services/_index.html.haml deleted file mode 100644 index dca324ac846..00000000000 --- a/app/views/projects/services/_index.html.haml +++ /dev/null @@ -1,30 +0,0 @@ -.row.prepend-top-default - .col-lg-4 - %h4.prepend-top-0 - = _('Integrations') - %p= _('Integrations allow you to integrate GitLab with other applications') - .col-lg-8 - %table.table - %colgroup - %col - %col - %col - %col{ width: "120" } - %thead - %tr - %th - %th= _('Integration') - %th.d-none.d-sm-block= _("Description") - %th= s_("ProjectService|Last edit") - - @services.sort_by(&:title).each do |service| - %tr - %td{ "aria-label" => (service.activated? ? s_("ProjectService|%{service_title}: status on") : s_("ProjectService|%{service_title}: status off")) % { service_title: service.title } } - = boolean_to_icon service.activated? - %td - = link_to edit_project_service_path(@project, service.to_param), { data: { qa_selector: "#{service.title.downcase.gsub(/[\s\(\)]/,'_')}_link" } } do - %strong= service.title - %td.d-none.d-sm-block - = service.description - %td.light - - if service.updated_at.present? - = time_ago_with_tooltip service.updated_at diff --git a/app/views/projects/services/edit.html.haml b/app/views/projects/services/edit.html.haml index 4195dce7780..1aaea50c8d5 100644 --- a/app/views/projects/services/edit.html.haml +++ b/app/views/projects/services/edit.html.haml @@ -1,8 +1,7 @@ - breadcrumb_title @service.title - add_to_breadcrumbs _('Integration Settings'), project_settings_integrations_path(@project) - page_title @service.title, _('Integrations') - -= render 'deprecated_message' if @service.deprecation_message +- @content_class = 'limit-container-width' unless fluid_layout = render 'form' - if @web_hook_logs diff --git a/app/views/projects/services/prometheus/_custom_metrics.html.haml b/app/views/projects/services/prometheus/_custom_metrics.html.haml index 21f9d1125e0..210d0f37d65 100644 --- a/app/views/projects/services/prometheus/_custom_metrics.html.haml +++ b/app/views/projects/services/prometheus/_custom_metrics.html.haml @@ -6,14 +6,14 @@ = link_to s_('PrometheusService|More information'), help_page_path('user/project/integrations/prometheus', anchor: 'adding-custom-metrics'), target: '_blank', rel: "noopener noreferrer" .col-lg-9 - .card.custom-monitored-metrics.js-panel-custom-monitored-metrics{ data: { active_custom_metrics: project_prometheus_metrics_path(project), environments_data: environments_list_data, service_active: "#{@service.active}" } } + .card.custom-monitored-metrics.js-panel-custom-monitored-metrics{ data: { qa_selector: 'custom_metrics_container', active_custom_metrics: project_prometheus_metrics_path(project), environments_data: environments_list_data, service_active: "#{@service.active}" } } .card-header %strong = s_('PrometheusService|Custom metrics') -# haml-lint:disable NoPlainNodes %span.badge.badge-pill.js-custom-monitored-count 0 -# haml-lint:enable NoPlainNodes - = link_to s_('PrometheusService|New metric'), new_project_prometheus_metric_path(project), class: 'btn btn-success js-new-metric-button hidden' + = link_to s_('PrometheusService|New metric'), new_project_prometheus_metric_path(project), class: 'btn btn-success js-new-metric-button hidden', data: { qa_selector: 'new_metric_button' } .card-body .flash-container.hidden .flash-warning diff --git a/app/views/projects/services/slack_slash_commands/_help.html.haml b/app/views/projects/services/slack_slash_commands/_help.html.haml index 93ea17a3a3d..0cf78d4f681 100644 --- a/app/views/projects/services/slack_slash_commands/_help.html.haml +++ b/app/views/projects/services/slack_slash_commands/_help.html.haml @@ -57,7 +57,7 @@ .form-group = label_tag nil, _('Customize icon'), class: 'col-12 col-form-label label-bold' .col-12 - = image_tag(asset_url('slash-command-logo.png'), width: 36, height: 36, class: 'mr-3') + = image_tag(asset_url('slash-command-logo.png', skip_pipeline: true), width: 36, height: 36, class: 'mr-3') = link_to(_('Download image'), asset_url('gitlab_logo.png'), class: 'btn btn-sm', target: '_blank', rel: 'noopener noreferrer') .form-group diff --git a/app/views/projects/settings/_general.html.haml b/app/views/projects/settings/_general.html.haml index 0f60fc18026..5eeebe4160f 100644 --- a/app/views/projects/settings/_general.html.haml +++ b/app/views/projects/settings/_general.html.haml @@ -16,7 +16,7 @@ .row .form-group.col-md-9 - = f.label :tag_list, _('Topics'), class: 'label-bold' + = f.label :tag_list, _('Topics (optional)'), class: 'label-bold' = f.text_field :tag_list, value: @project.tag_list.join(', '), maxlength: 2000, class: "form-control" %p.form-text.text-muted= _('Separate topics with commas.') diff --git a/app/views/projects/settings/access_tokens/index.html.haml b/app/views/projects/settings/access_tokens/index.html.haml new file mode 100644 index 00000000000..07784dce677 --- /dev/null +++ b/app/views/projects/settings/access_tokens/index.html.haml @@ -0,0 +1,34 @@ +- breadcrumb_title s_('AccessTokens|Access Tokens') +- page_title _('Project Access Tokens') +- type = _('project access token') +- type_plural = _('project access tokens') +- @content_class = 'limit-container-width' unless fluid_layout + +.row.prepend-top-default + .col-lg-4.profile-settings-sidebar + %h4.prepend-top-0 + = page_title + %p + = _('You can generate an access token scoped to this project for each application to use the GitLab API.') + %p + = _('You can also use project access tokens to authenticate against Git over HTTP.') + + .col-lg-8 + - if @new_project_access_token + = render 'shared/access_tokens/created_container', + type: type, + new_token_value: @new_project_access_token + + = render 'shared/access_tokens/form', + type: type, + path: project_settings_access_tokens_path(@project), + token: @project_access_token, + scopes: @scopes, + prefix: :project_access_token + + = render 'shared/access_tokens/table', + active_tokens: @active_project_access_tokens, + type: type, + type_plural: type_plural, + revoke_route_helper: ->(token) { revoke_namespace_project_settings_access_token_path(id: token) }, + no_active_tokens_message: _('This project has no active access tokens.') diff --git a/app/views/projects/settings/ci_cd/_autodevops_form.html.haml b/app/views/projects/settings/ci_cd/_autodevops_form.html.haml index 6702786fdb3..8b84acb67c1 100644 --- a/app/views/projects/settings/ci_cd/_autodevops_form.html.haml +++ b/app/views/projects/settings/ci_cd/_autodevops_form.html.haml @@ -30,7 +30,7 @@ .card-footer.js-extra-settings{ class: auto_devops_enabled || 'hidden' } - if @project.all_clusters.empty? %p.settings-message.text-center - = s_('CICD|You must add a %{kubernetes_cluster_link_start}Kubernetes cluster integration%{link_end} to this project with a domain in order for your deployment strategy to work correctly.').html_safe % { kubernetes_cluster_link_start: kubernetes_cluster_link_start, link_end: link_end } + = s_('CICD|Add a %{kubernetes_cluster_link_start}Kubernetes cluster integration%{link_end} with a domain or create an AUTO_DEVOPS_PLATFORM_TARGET CI variable.').html_safe % { kubernetes_cluster_link_start: kubernetes_cluster_link_start, link_end: link_end } - elsif !has_base_domain %p.settings-message.text-center = s_('CICD|You must add a %{base_domain_link_start}base domain%{link_end} to your %{kubernetes_cluster_link_start}Kubernetes cluster%{link_end} in order for your deployment strategy to work.').html_safe % { base_domain_link_start: base_domain_link_start, kubernetes_cluster_link_start: kubernetes_cluster_link_start, link_end: link_end } diff --git a/app/views/projects/settings/ci_cd/_form.html.haml b/app/views/projects/settings/ci_cd/_form.html.haml index 4040b1094aa..b50f712922f 100644 --- a/app/views/projects/settings/ci_cd/_form.html.haml +++ b/app/views/projects/settings/ci_cd/_form.html.haml @@ -103,7 +103,7 @@ .input-group %span.input-group-prepend .input-group-text / - = f.text_field :build_coverage_regex, class: 'form-control', placeholder: 'Regular expression' + = f.text_field :build_coverage_regex, class: 'form-control', placeholder: 'Regular expression', data: { qa_selector: 'build_coverage_regex_field' } %span.input-group-append .input-group-text / %p.form-text.text-muted @@ -143,7 +143,7 @@ go test -cover (Go) %code coverage: \d+.\d+% of statements - = f.submit _('Save changes'), class: "btn btn-success" + = f.submit _('Save changes'), class: "btn btn-success", data: { qa_selector: 'save_general_pipelines_changes_button' } %hr diff --git a/app/views/projects/settings/ci_cd/show.html.haml b/app/views/projects/settings/ci_cd/show.html.haml index 1358077f2b2..4e14426a069 100644 --- a/app/views/projects/settings/ci_cd/show.html.haml +++ b/app/views/projects/settings/ci_cd/show.html.haml @@ -5,7 +5,7 @@ - expanded = expanded_by_default? - general_expanded = @project.errors.empty? ? expanded : true -%section.settings#js-general-pipeline-settings.no-animate{ class: ('expanded' if general_expanded) } +%section.settings#js-general-pipeline-settings.no-animate{ class: ('expanded' if general_expanded), data: { qa_selector: 'general_pipelines_settings_content' } } .settings-header %h4 = _("General pipelines") diff --git a/app/views/projects/settings/integrations/show.html.haml b/app/views/projects/settings/integrations/show.html.haml index f603f23a2c7..4372763fcf7 100644 --- a/app/views/projects/settings/integrations/show.html.haml +++ b/app/views/projects/settings/integrations/show.html.haml @@ -12,4 +12,6 @@ .gl-alert-actions = link_to _('Go to Webhooks'), project_hooks_path(@project), class: 'btn gl-alert-action btn-info new-gl-button' -= render 'projects/services/index' +%h4= s_('Integrations') +%p= s_('Integrations allow you to integrate GitLab with other applications') += render 'shared/integrations/index', integrations: @services diff --git a/app/views/projects/settings/operations/_incidents.html.haml b/app/views/projects/settings/operations/_incidents.html.haml index a96a41b78c2..92fffa42b73 100644 --- a/app/views/projects/settings/operations/_incidents.html.haml +++ b/app/views/projects/settings/operations/_incidents.html.haml @@ -2,7 +2,7 @@ - setting = project_incident_management_setting - templates = setting.available_issue_templates.map { |t| [t.name, t.key] } -%section.settings.no-animate.qa-incident-management-settings +%section.settings.no-animate.qa-incident-management-settings{ data: { qa_selector: 'incidents_settings_content' } } .settings-header %h3{ :class => "h4" }= _('Incidents') %button.btn.js-settings-toggle{ type: 'button' } @@ -17,16 +17,16 @@ .form-group = f.fields_for :incident_management_setting_attributes, setting do |form| .form-group - = form.check_box :create_issue + = form.check_box :create_issue, data: { qa_selector: 'create_issue_checkbox' } = form.label :create_issue, _('Create an issue. Issues are created for each alert triggered.'), class: 'form-check-label' .form-group.col-sm-8 = form.label :issue_template_key, class: 'label-bold' do = _('Issue template (optional)') = link_to icon('question-circle'), help_page_path('user/project/description_templates', anchor: 'creating-issue-templates'), target: '_blank', rel: 'noopener noreferrer' .select-wrapper - = form.select :issue_template_key, templates, {include_blank: 'No template selected'}, class: "form-control select-control" + = form.select :issue_template_key, templates, {include_blank: 'No template selected'}, class: "form-control select-control", data: { qa_selector: 'incident_templates_dropdown' } = icon('chevron-down') .form-group = form.check_box :send_email = form.label :send_email, _('Send a separate email notification to Developers.'), class: 'form-check-label' - = f.submit _('Save changes'), class: 'btn btn-success' + = f.submit _('Save changes'), class: 'btn btn-success', data: { qa_selector: 'save_changes_button' } diff --git a/app/views/projects/settings/repository/show.html.haml b/app/views/projects/settings/repository/show.html.haml index 193053c8c97..24fc137fd29 100644 --- a/app/views/projects/settings/repository/show.html.haml +++ b/app/views/projects/settings/repository/show.html.haml @@ -1,7 +1,7 @@ - breadcrumb_title _("Repository Settings") - page_title _("Repository") - @content_class = "limit-container-width" unless fluid_layout -- deploy_token_description = s_('DeployTokens|Deploy tokens allow access to your repository and registry images.') +- deploy_token_description = s_('DeployTokens|Deploy tokens allow access to packages, your repository, and registry images.') = render "projects/default_branch/show" = render_if_exists "projects/push_rules/index" diff --git a/app/views/projects/snippets/show.html.haml b/app/views/projects/snippets/show.html.haml index ccf109968fc..7cf5de8947c 100644 --- a/app/views/projects/snippets/show.html.haml +++ b/app/views/projects/snippets/show.html.haml @@ -3,7 +3,7 @@ - breadcrumb_title @snippet.to_reference - page_title "#{@snippet.title} (#{@snippet.to_reference})", _("Snippets") -- if Feature.enabled?(:snippets_vue) +- if Feature.enabled?(:snippets_vue, default_enabled: true) #js-snippet-view{ data: {'qa-selector': 'snippet_view', 'snippet-gid': @snippet.to_global_id} } - else = render 'shared/snippets/header' diff --git a/app/views/projects/tags/_tag.html.haml b/app/views/projects/tags/_tag.html.haml index 75805192a61..da693a15ec2 100644 --- a/app/views/projects/tags/_tag.html.haml +++ b/app/views/projects/tags/_tag.html.haml @@ -30,6 +30,9 @@ = markdown_field(release, :description) .row-fixed-content.controls.flex-row + - if tag.has_signature? + = render partial: 'projects/commit/signature', object: tag.signature + = render 'projects/buttons/download', project: @project, ref: tag.name, pipeline: @tags_pipelines[tag.name] - if can?(current_user, :admin_tag, @project) diff --git a/app/views/projects/tags/show.html.haml b/app/views/projects/tags/show.html.haml index 8086d47479d..6f53a687fb9 100644 --- a/app/views/projects/tags/show.html.haml +++ b/app/views/projects/tags/show.html.haml @@ -39,6 +39,8 @@ = s_("TagsPage|Can't find HEAD commit for this tag") .nav-controls + - if @tag.has_signature? + = render partial: 'projects/commit/signature', object: @tag.signature - if can?(current_user, :admin_tag, @project) = link_to edit_project_tag_release_path(@project, @tag.name), class: 'btn btn-edit controls-item has-tooltip', title: s_('TagsPage|Edit release notes') do = icon("pencil") diff --git a/app/views/projects/wikis/_sidebar.html.haml b/app/views/projects/wikis/_sidebar.html.haml index 0f2938686cc..2b8da83b126 100644 --- a/app/views/projects/wikis/_sidebar.html.haml +++ b/app/views/projects/wikis/_sidebar.html.haml @@ -17,6 +17,6 @@ %ul.wiki-pages = render @sidebar_wiki_entries, context: 'sidebar' .block.w-100 - - if @sidebar_wiki_entries&.length.to_i >= 15 + - if @sidebar_limited = link_to project_wikis_pages_path(@project), class: 'btn btn-block' do = s_("Wiki|View All Pages") diff --git a/app/views/projects/wikis/git_access.html.haml b/app/views/projects/wikis/git_access.html.haml index 6972eda9bb7..72c9f45779a 100644 --- a/app/views/projects/wikis/git_access.html.haml +++ b/app/views/projects/wikis/git_access.html.haml @@ -18,11 +18,6 @@ %pre.dark :preserve gem install gollum - %p - = (s_("WikiClone|It is recommended to install %{markdown} so that GFM features render locally:") % { markdown: "<code>github-markdown</code>" }).html_safe - %pre.dark - :preserve - gem install github-markdown %h3= s_("WikiClone|Clone your wiki") %pre.dark diff --git a/app/views/search/_category.html.haml b/app/views/search/_category.html.haml index 6ad155eb715..db7769fa743 100644 --- a/app/views/search/_category.html.haml +++ b/app/views/search/_category.html.haml @@ -24,7 +24,7 @@ = users - elsif @show_snippets - = search_filter_link 'snippet_titles', _("Titles and Filenames"), search: { snippets: true, group_id: nil, project_id: nil } + = search_filter_link 'snippet_titles', _("Titles and Descriptions"), search: { snippets: true, group_id: nil, project_id: nil } - else = search_filter_link 'projects', _("Projects"), data: { qa_selector: 'projects_tab' } = search_filter_link 'issues', _("Issues") diff --git a/app/views/search/results/_blob_data.html.haml b/app/views/search/results/_blob_data.html.haml index 01e42224428..218de30d707 100644 --- a/app/views/search/results/_blob_data.html.haml +++ b/app/views/search/results/_blob_data.html.haml @@ -7,4 +7,4 @@ = search_blob_title(project, path) - if blob.data .file-content.code.term{ data: { qa_selector: 'file_text_content' } } - = render 'shared/file_highlight', blob: blob, first_line_number: blob.startline + = render 'shared/file_highlight', blob: blob, first_line_number: blob.startline, blob_link: blob_link diff --git a/app/views/search/results/_snippet_blob.html.haml b/app/views/search/results/_snippet_blob.html.haml deleted file mode 100644 index fa77566dddb..00000000000 --- a/app/views/search/results/_snippet_blob.html.haml +++ /dev/null @@ -1,50 +0,0 @@ -- snippet_blob = chunk_snippet(snippet_blob, @search_term) -- snippet = snippet_blob[:snippet_object] -- snippet_chunks = snippet_blob[:snippet_chunks] -- snippet_path = gitlab_snippet_path(snippet) - -.search-result-row.snippet-row - = image_tag avatar_icon_for_user(snippet.author), class: "avatar s40 d-none d-sm-block", alt: '' - .title - = link_to gitlab_snippet_path(snippet) do - = snippet.title - .snippet-info - = snippet.to_reference - · - authored - = time_ago_with_tooltip(snippet.created_at) - by - = link_to user_snippets_path(snippet.author) do - = snippet.author_name - - .file-holder.my-2 - .js-file-title.file-title-flex-parent - = link_to snippet_path do - %i.fa.fa-file - %strong= snippet.file_name - - if markup?(snippet.file_name) - .file-content.md - - snippet_chunks.each do |chunk| - - unless chunk[:data].empty? - = markup(snippet.file_name, chunk[:data]) - - else - .file-content.code - .nothing-here-block= _("Empty file") - - else - .file-content.code.js-syntax-highlight - .line-numbers - - snippet_chunks.each do |chunk| - - unless chunk[:data].empty? - - Gitlab::Git::Util.count_lines(chunk[:data]).times do |index| - - offset = defined?(chunk[:start_line]) ? chunk[:start_line] : 1 - - i = index + offset - = link_to snippet_path+"#L#{i}", id: "L#{i}", rel: "#L#{i}", class: "diff-line-num" do - %i.fa.fa-link - = i - .blob-content - - snippet_chunks.each do |chunk| - - unless chunk[:data].empty? - = highlight(snippet.file_name, chunk[:data]) - - else - .file-content.code - .nothing-here-block= _("Empty file") diff --git a/app/views/search/results/_snippet_title.html.haml b/app/views/search/results/_snippet_title.html.haml index 81e746c55a3..a28d9effbdd 100644 --- a/app/views/search/results/_snippet_title.html.haml +++ b/app/views/search/results/_snippet_title.html.haml @@ -1,5 +1,5 @@ .search-result-row - %h4.snippet-title.term + %h4 = link_to gitlab_snippet_path(snippet_title) do = truncate(snippet_title.title, length: 60) = snippet_badge(snippet_title) diff --git a/app/views/shared/_auto_devops_callout.html.haml b/app/views/shared/_auto_devops_callout.html.haml index 128508e954e..bf1683be32d 100644 --- a/app/views/shared/_auto_devops_callout.html.haml +++ b/app/views/shared/_auto_devops_callout.html.haml @@ -11,5 +11,5 @@ = link_to s_('AutoDevOps|Enable in settings'), project_settings_ci_cd_path(@project, anchor: 'autodevops-settings'), class: 'btn btn-md new-gl-button js-close-callout' %button.gl-banner-close.close.js-close-callout{ type: 'button', - 'aria-label' => 'Dismiss Auto DevOps box' } + 'aria-label' => s_('AutoDevOps|Dismiss Auto DevOps box') } = icon('times', class: 'dismiss-icon', 'aria-hidden' => 'true') diff --git a/app/views/shared/_broadcast_message.html.haml b/app/views/shared/_broadcast_message.html.haml index bc4db672938..b809696cccb 100644 --- a/app/views/shared/_broadcast_message.html.haml +++ b/app/views/shared/_broadcast_message.html.haml @@ -6,5 +6,5 @@ = render_broadcast_message(message) .flex-grow-1.text-right{ style: 'flex-basis: 0' } - if (message.notification? || message.dismissable?) && opts[:preview].blank? - %button.broadcast-message-dismiss.js-dismiss-current-broadcast-notification.btn.btn-link.pl-2.pr-2{ 'aria-label' => _('Close'), :type => 'button', data: { id: message.id } } + %button.broadcast-message-dismiss.js-dismiss-current-broadcast-notification.btn.btn-link.pl-2.pr-2{ 'aria-label' => _('Close'), :type => 'button', data: { id: message.id, expire_date: message.ends_at.iso8601 } } %i.fa.fa-times diff --git a/app/views/shared/_clone_panel.html.haml b/app/views/shared/_clone_panel.html.haml index 3e805189055..9ec8d3c18cd 100644 --- a/app/views/shared/_clone_panel.html.haml +++ b/app/views/shared/_clone_panel.html.haml @@ -18,7 +18,7 @@ = http_clone_button(project) = render_if_exists 'shared/kerberos_clone_button', project: project - = text_field_tag :project_clone, default_url_to_repo(project), class: "js-select-on-focus form-control", readonly: true, aria: { label: 'Project clone URL' } + = text_field_tag :project_clone, default_url_to_repo(project), class: "js-select-on-focus form-control", readonly: true, aria: { label: _('Project clone URL') } .input-group-append = clipboard_button(target: '#project_clone', title: _("Copy URL"), class: "input-group-text btn-default btn-clipboard") diff --git a/app/views/shared/_commit_message_container.html.haml b/app/views/shared/_commit_message_container.html.haml index 68c14c307ac..d65b7492690 100644 --- a/app/views/shared/_commit_message_container.html.haml +++ b/app/views/shared/_commit_message_container.html.haml @@ -14,12 +14,11 @@ id: "commit_message-#{nonce}" - if local_assigns[:hint] %p.hint - Try to keep the first line under 52 characters - and the others under 72. + = _('Try to keep the first line under 52 characters and the others under 72.') - if descriptions.present? .hint.js-with-description-hint = link_to "#", class: "js-with-description-link" do - Include description in commit message + = _('Include description in commit message') .hint.js-without-description-hint.hide = link_to "#", class: "js-without-description-link" do - Don't include description in commit message + = _("Don't include description in commit message") diff --git a/app/views/shared/_delete_label_modal.html.haml b/app/views/shared/_delete_label_modal.html.haml index c6629cd33a5..25c841d2344 100644 --- a/app/views/shared/_delete_label_modal.html.haml +++ b/app/views/shared/_delete_label_modal.html.haml @@ -2,20 +2,19 @@ .modal-dialog .modal-content .modal-header - %h3.page-title Delete label: #{label.name} ? + %h3.page-title= _('Delete label: %{label_name} ?') % { label_name: label.name } %button.close{ type: "button", "data-dismiss": "modal", "aria-label" => _('Close') } %span{ "aria-hidden": true } × .modal-body %p - %strong= label.name - %span will be permanently deleted from #{label.subject_name}. This cannot be undone. + = _('<strong>%{label_name}</strong> <span>will be permanently deleted from %{subject_name}. This cannot be undone.</span>').html_safe % { label_name: label.name, subject_name: label.subject_name } .modal-footer - %a{ href: '#', data: { dismiss: 'modal' }, class: 'btn btn-default' } Cancel + %a{ href: '#', data: { dismiss: 'modal' }, class: 'btn btn-default' }= _('Cancel') - = link_to 'Delete label', + = link_to _('Delete label'), label.destroy_path, - title: 'Delete', + title: _('Delete'), method: :delete, class: 'btn btn-remove' diff --git a/app/views/shared/_field.html.haml b/app/views/shared/_field.html.haml index a7ad6d6f2c4..4f416c483f2 100644 --- a/app/views/shared/_field.html.haml +++ b/app/views/shared/_field.html.haml @@ -7,23 +7,22 @@ - choices = field[:choices] - default_choice = field[:default_choice] - help = field[:help] -- disabled = disable_fields_service?(@service) .form-group.row - if type == "password" && value.present? - = form.label name, "Enter new #{title.downcase}", class: "col-form-label col-sm-2" + = form.label name, _("Enter new %{field_title}") % { field_title: title.downcase }, class: "col-form-label col-sm-2" - else = form.label name, title, class: "col-form-label col-sm-2" .col-sm-10 - if type == 'text' - = form.text_field name, class: "form-control", placeholder: placeholder, required: required, disabled: disabled, data: { qa_selector: "#{name.downcase.gsub('\s', '')}_field" } + = form.text_field name, class: "form-control", placeholder: placeholder, required: required, data: { qa_selector: "#{name.downcase.gsub('\s', '')}_field" } - elsif type == 'textarea' - = form.text_area name, rows: 5, class: "form-control", placeholder: placeholder, required: required, disabled: disabled + = form.text_area name, rows: 5, class: "form-control", placeholder: placeholder, required: required - elsif type == 'checkbox' - = form.check_box name, disabled: disabled + = form.check_box name - elsif type == 'select' - = form.select name, options_for_select(choices, value ? value : default_choice), {}, { class: "form-control", disabled: disabled} + = form.select name, options_for_select(choices, value ? value : default_choice), {}, { class: "form-control"} - elsif type == 'password' - = form.password_field name, autocomplete: "new-password", placeholder: placeholder, class: "form-control", required: value.blank? && required, disabled: disabled, data: { qa_selector: "#{name.downcase.gsub('\s', '')}_field" } + = form.password_field name, autocomplete: "new-password", placeholder: placeholder, class: "form-control", required: value.blank? && required, data: { qa_selector: "#{name.downcase.gsub('\s', '')}_field" } - if help %span.form-text.text-muted= help diff --git a/app/views/shared/_group_form.html.haml b/app/views/shared/_group_form.html.haml index 9a65981ed58..019b2ef89a4 100644 --- a/app/views/shared/_group_form.html.haml +++ b/app/views/shared/_group_form.html.haml @@ -6,7 +6,7 @@ .form-group.group-name-holder.col-sm-12 = f.label :name, class: 'label-bold' do = _("Group name") - = f.text_field :name, placeholder: 'My Awesome Group', class: 'form-control input-lg', + = f.text_field :name, placeholder: _('My Awesome Group'), class: 'form-control input-lg', required: true, title: _('Please fill in a descriptive name for your group.'), autofocus: true @@ -22,7 +22,7 @@ - if parent %strong= parent.full_path + '/' = f.hidden_field :parent_id - = f.text_field :path, placeholder: 'my-awesome-group', class: 'form-control js-validate-group-path', + = f.text_field :path, placeholder: _('my-awesome-group'), class: 'form-control js-validate-group-path', autofocus: local_assigns[:autofocus] || false, required: true, pattern: Gitlab::PathRegex::NAMESPACE_FORMAT_REGEX_JS, title: _('Please choose a group URL with no special characters.'), diff --git a/app/views/shared/_group_tips.html.haml b/app/views/shared/_group_tips.html.haml index 46e4340511a..2d7f8e36139 100644 --- a/app/views/shared/_group_tips.html.haml +++ b/app/views/shared/_group_tips.html.haml @@ -1,5 +1,5 @@ %ul - %li A group is a collection of several projects - %li Members of a group may only view projects they have permission to access - %li Group project URLs are prefixed with the group namespace - %li Existing projects may be moved into a group + %li= _('A group is a collection of several projects') + %li= _('Members of a group may only view projects they have permission to access') + %li= _('Group project URLs are prefixed with the group namespace') + %li= _('Existing projects may be moved into a group') diff --git a/app/views/shared/_label_row.html.haml b/app/views/shared/_label_row.html.haml index b05d903fabe..cd303dd7a3d 100644 --- a/app/views/shared/_label_row.html.haml +++ b/app/views/shared/_label_row.html.haml @@ -13,7 +13,7 @@ %ul.label-links - if show_label_issues_link %li.label-link-item.inline - = link_to_label(label) { 'Issues' } + = link_to_label(label) { _('Issues') } - if show_label_merge_requests_link · %li.label-link-item.inline diff --git a/app/views/shared/_milestone_expired.html.haml b/app/views/shared/_milestone_expired.html.haml index 099e3ac8462..48a97a18ca9 100644 --- a/app/views/shared/_milestone_expired.html.haml +++ b/app/views/shared/_milestone_expired.html.haml @@ -1,6 +1,6 @@ - if milestone.expired? and not milestone.closed? - .status-box.status-box-expired.append-bottom-5 Expired + .status-box.status-box-expired.append-bottom-5= _('Expired') - if milestone.upcoming? - .status-box.status-box-mr-merged.append-bottom-5 Upcoming + .status-box.status-box-mr-merged.append-bottom-5= _('Upcoming') - if milestone.closed? - .status-box.status-box-closed.append-bottom-5 Closed + .status-box.status-box-closed.append-bottom-5= _('Closed') diff --git a/app/views/shared/_milestones_filter.html.haml b/app/views/shared/_milestones_filter.html.haml index 6c1ac20d544..eb50960202a 100644 --- a/app/views/shared/_milestones_filter.html.haml +++ b/app/views/shared/_milestones_filter.html.haml @@ -1,13 +1,13 @@ %ul.nav-links.mobile-separator.nav.nav-tabs %li{ class: milestone_class_for_state(params[:state], 'opened', true) }> = link_to milestones_filter_path(state: 'opened') do - Open + = _('Open') %span.badge.badge-pill= counts[:opened] %li{ class: milestone_class_for_state(params[:state], 'closed') }> = link_to milestones_filter_path(state: 'closed', sort: 'due_date_desc') do - Closed + = _('Closed') %span.badge.badge-pill= counts[:closed] %li{ class: milestone_class_for_state(params[:state], 'all') }> = link_to milestones_filter_path(state: 'all', sort: 'due_date_desc') do - All + = _('All') %span.badge.badge-pill= counts[:all] diff --git a/app/views/shared/_mini_pipeline_graph.html.haml b/app/views/shared/_mini_pipeline_graph.html.haml index a1f21c2a83e..172f3d85472 100644 --- a/app/views/shared/_mini_pipeline_graph.html.haml +++ b/app/views/shared/_mini_pipeline_graph.html.haml @@ -14,4 +14,4 @@ %li.js-builds-dropdown-loading.hidden .loading-container.text-center - %span.spinner{ 'aria-label': 'Loading' } + %span.spinner{ 'aria-label': _('Loading') } diff --git a/app/views/shared/_no_ssh.html.haml b/app/views/shared/_no_ssh.html.haml index fbfd4d0e9a9..2b04e3e1c98 100644 --- a/app/views/shared/_no_ssh.html.haml +++ b/app/views/shared/_no_ssh.html.haml @@ -1,7 +1,7 @@ - if show_no_ssh_key_message? %div{ class: 'no-ssh-key-message gl-alert gl-alert-warning', role: 'alert' } = sprite_icon('warning', size: 16, css_class: 'gl-icon s16 gl-alert-icon gl-alert-icon-no-title') - %button{ class: 'gl-alert-dismiss hide-no-ssh-message', type: 'button', 'aria-label': 'Dismiss' } + %button{ class: 'gl-alert-dismiss hide-no-ssh-message', type: 'button', 'aria-label': _('Dismiss') } = sprite_icon('close', size: 16, css_class: 'gl-icon s16') .gl-alert-body = s_("MissingSSHKeyWarningLink|You won't be able to pull or push project code via SSH until you add an SSH key to your profile").html_safe diff --git a/app/views/shared/_personal_access_tokens_created_container.html.haml b/app/views/shared/_personal_access_tokens_created_container.html.haml deleted file mode 100644 index df4577e2862..00000000000 --- a/app/views/shared/_personal_access_tokens_created_container.html.haml +++ /dev/null @@ -1,15 +0,0 @@ -- container_title = local_assigns.fetch(:container_title, _('Your New Personal Access Token')) -- clipboard_button_title = local_assigns.fetch(:clipboard_button_title, _('Copy personal access token')) - -.created-personal-access-token-container - %h5.prepend-top-0 - = container_title - .form-group - .input-group - = text_field_tag 'created-personal-access-token', new_token_value, readonly: true, class: "qa-created-personal-access-token form-control js-select-on-focus", 'aria-describedby' => "created-token-help-block" - %span.input-group-append - = clipboard_button(text: new_token_value, title: clipboard_button_title, placement: "left", class: "input-group-text btn-default btn-clipboard") - %span#created-token-help-block.form-text.text-muted.text-danger - = _("Make sure you save it - you won't be able to access it again.") - -%hr diff --git a/app/views/shared/_personal_access_tokens_form.html.haml b/app/views/shared/_personal_access_tokens_form.html.haml deleted file mode 100644 index 71f3447ebc7..00000000000 --- a/app/views/shared/_personal_access_tokens_form.html.haml +++ /dev/null @@ -1,31 +0,0 @@ -- type = impersonation ? s_('Profiles|impersonation') : s_('Profiles|personal access') - -%h5.prepend-top-0 - = _('Add a %{type} token') % { type: type } -%p.profile-settings-content - = _("Pick a name for the application, and we'll give you a unique %{type} token.") % { type: type } - -= form_for token, url: path, method: :post, html: { class: 'js-requires-input' } do |f| - - = form_errors(token) - - .row - .form-group.col-md-6 - = f.label :name, _('Name'), class: 'label-bold' - = f.text_field :name, class: "form-control", required: true, data: { qa_selector: 'personal_access_token_name_field' } - - .row - .form-group.col-md-6 - = f.label :expires_at, _('Expires at'), class: 'label-bold' - .input-icon-wrapper - - = render_if_exists 'personal_access_tokens/callout_max_personal_access_token_lifetime' - - = f.text_field :expires_at, class: "datepicker form-control", placeholder: 'YYYY-MM-DD', data: { qa_selector: 'expiry_date_field' } - - .form-group - = f.label :scopes, _('Scopes'), class: 'label-bold' - = render 'shared/tokens/scopes_form', prefix: 'personal_access_token', token: token, scopes: scopes - - .prepend-top-default - = f.submit _('Create %{type} token') % { type: type }, class: "btn btn-success", data: { qa_selector: 'create_token_button' } diff --git a/app/views/shared/_project_limit.html.haml b/app/views/shared/_project_limit.html.haml index 2c52eccccb6..88f213612fc 100644 --- a/app/views/shared/_project_limit.html.haml +++ b/app/views/shared/_project_limit.html.haml @@ -1,8 +1,8 @@ - if cookies[:hide_project_limit_message].blank? && !current_user.hide_project_limit && !current_user.can_create_project? && current_user.projects_limit > 0 .project-limit-message.alert.alert-warning.d-none.d-sm-block - You won't be able to create new projects because you have reached your project limit. + = _("You won't be able to create new projects because you have reached your project limit.") .float-right - = link_to "Don't show again", profile_path(user: {hide_project_limit: true}), method: :put, class: 'alert-link' + = link_to _("Don't show again"), profile_path(user: {hide_project_limit: true}), method: :put, class: 'alert-link' | - = link_to 'Remind later', '#', class: 'hide-project-limit-message alert-link' + = link_to _('Remind later'), '#', class: 'hide-project-limit-message alert-link' diff --git a/app/views/shared/_recaptcha_form.html.haml b/app/views/shared/_recaptcha_form.html.haml index 10f358402c1..245a86721eb 100644 --- a/app/views/shared/_recaptcha_form.html.haml +++ b/app/views/shared/_recaptcha_form.html.haml @@ -17,4 +17,4 @@ - if has_submit .row-content-block.footer-block - = f.submit "Submit #{humanized_resource_name}", class: 'btn btn-success' + = f.submit _("Submit %{humanized_resource_name}") % { humanized_resource_name: humanized_resource_name }, class: 'btn btn-success' diff --git a/app/views/shared/_ref_dropdown.html.haml b/app/views/shared/_ref_dropdown.html.haml index 8b2a3bee407..ee2b2a17e21 100644 --- a/app/views/shared/_ref_dropdown.html.haml +++ b/app/views/shared/_ref_dropdown.html.haml @@ -1,7 +1,7 @@ - dropdown_class = local_assigns.fetch(:dropdown_class, '') .dropdown-menu.dropdown-menu-selectable.git-revision-dropdown{ class: dropdown_class } - = dropdown_title "Select Git revision" - = dropdown_filter "Filter by Git revision" + = dropdown_title _('Select Git revision') + = dropdown_filter _('Filter by Git revision') = dropdown_content = dropdown_loading diff --git a/app/views/shared/_service_settings.html.haml b/app/views/shared/_service_settings.html.haml index 3da4b77b5eb..a9203459914 100644 --- a/app/views/shared/_service_settings.html.haml +++ b/app/views/shared/_service_settings.html.haml @@ -1,4 +1,5 @@ = form_errors(@service) +- trigger_events = Feature.enabled?(:integration_form_refactor) ? ServiceEventSerializer.new(service: @service).represent(@service.configurable_events).to_json : [] - if lookup_context.template_exists?('help', "projects/services/#{@service.to_param}", true) = render "projects/services/#{@service.to_param}/help", subject: @service @@ -8,9 +9,10 @@ = markdown @service.help .service-settings - .js-vue-integration-settings{ data: { show_active: @service.show_active_box?.to_s, activated: (@service.active || @service.new_record?).to_s, disabled: disable_fields_service?(@service).to_s } } + .js-vue-integration-settings{ data: { show_active: @service.show_active_box?.to_s, activated: (@service.active || @service.new_record?).to_s, type: @service.to_param, merge_request_events: @service.merge_requests_events.to_s, +commit_events: @service.commit_events.to_s, enable_comments: @service.comment_on_event_enabled.to_s, comment_detail: @service.comment_detail, trigger_events: trigger_events } } - - if @service.configurable_events.present? + - if @service.configurable_events.present? && !@service.is_a?(JiraService) && Feature.disabled?(:integration_form_refactor) .form-group.row %label.col-form-label.col-sm-2= _('Trigger') @@ -31,32 +33,5 @@ %p.text-muted = @service.class.event_description(event) - - if @service.configurable_event_actions.present? - .form-group.row - %label.col-form-label.col-sm-2= _('Event Actions') - - .col-sm-10 - - @service.configurable_event_actions.each do |action| - .form-group - .form-check - = form.check_box service_event_action_field_name(action), class: 'form-check-input' - = form.label service_event_action_field_name(action), class: 'form-check-label' do - %strong - = event_action_description(action) - - %p.text-muted - = event_action_description(action) - - @service.global_fields.each do |field| - - type = field[:type] - - - if type == 'fieldset' - - fields = field[:fields] - - legend = field[:legend] - - %fieldset - %legend= legend - - fields.each do |subfield| - = render 'shared/field', form: form, field: subfield - - else - = render 'shared/field', form: form, field: field + = render 'shared/field', form: form, field: field diff --git a/app/views/shared/access_tokens/_created_container.html.haml b/app/views/shared/access_tokens/_created_container.html.haml new file mode 100644 index 00000000000..f11ef1e01de --- /dev/null +++ b/app/views/shared/access_tokens/_created_container.html.haml @@ -0,0 +1,12 @@ +.created-personal-access-token-container + %h5.prepend-top-0 + = _('Your new %{type}') % { type: type } + .form-group + .input-group + = text_field_tag 'created-personal-access-token', new_token_value, readonly: true, class: 'qa-created-access-token form-control js-select-on-focus', 'aria-describedby' => 'created-token-help-block' + %span.input-group-append + = clipboard_button(text: new_token_value, title: _('Copy %{type}') % { type: type }, placement: 'left', class: 'input-group-text btn-default btn-clipboard') + %span#created-token-help-block.form-text.text-muted.text-danger + = _("Make sure you save it - you won't be able to access it again.") + +%hr diff --git a/app/views/shared/access_tokens/_form.html.haml b/app/views/shared/access_tokens/_form.html.haml new file mode 100644 index 00000000000..cb7f907308f --- /dev/null +++ b/app/views/shared/access_tokens/_form.html.haml @@ -0,0 +1,34 @@ +- title = local_assigns.fetch(:title, _('Add a %{type}') % { type: type }) +- prefix = local_assigns.fetch(:prefix, :personal_access_token) + +%h5.prepend-top-0 + = title +%p.profile-settings-content + = _("Enter the name of your application, and we'll return a unique %{type}.") % { type: type } + += form_for token, as: prefix, url: path, method: :post, html: { class: 'js-requires-input' } do |f| + + = form_errors(token) + + .row + .form-group.col-md-6 + = f.label :name, _('Name'), class: 'label-bold' + = f.text_field :name, class: 'form-control', required: true, data: { qa_selector: 'access_token_name_field' } + + .row + .form-group.col-md-6 + = f.label :expires_at, _('Expires at'), class: 'label-bold' + .input-icon-wrapper + + = render_if_exists 'personal_access_tokens/callout_max_personal_access_token_lifetime' + + .js-access-tokens-expires-at + %expires-at-field + = f.text_field :expires_at, class: 'datepicker form-control gl-datepicker-input', placeholder: 'YYYY-MM-DD', autocomplete: 'off', inputmode: 'none', data: { qa_selector: 'expiry_date_field' } + + .form-group + = f.label :scopes, _('Scopes'), class: 'label-bold' + = render 'shared/tokens/scopes_form', prefix: prefix, token: token, scopes: scopes + + .prepend-top-default + = f.submit _('Create %{type}') % { type: type }, class: 'btn btn-success', data: { qa_selector: 'create_token_button' } diff --git a/app/views/shared/_personal_access_tokens_table.html.haml b/app/views/shared/access_tokens/_table.html.haml index 823117f37ca..5518c31cb06 100644 --- a/app/views/shared/_personal_access_tokens_table.html.haml +++ b/app/views/shared/access_tokens/_table.html.haml @@ -1,8 +1,10 @@ -- type = impersonation ? s_('Profiles|Impersonation') : s_('Profiles|Personal Access') +- no_active_tokens_message = local_assigns.fetch(:no_active_tokens_message, _('This user has no active %{type}.') % { type: type_plural }) +- impersonation = local_assigns.fetch(:impersonation, false) + %hr %h5 - = _('Active %{type} Tokens (%{token_length})') % { type: type, token_length: active_tokens.length } + = _('Active %{type} (%{token_length})') % { type: type_plural, token_length: active_tokens.length } - if impersonation %p.profile-settings-content = _("To see all the user's personal access tokens you must impersonate them first.") @@ -25,12 +27,11 @@ %td - if token.expires? %span{ class: ('text-warning' if token.expires_soon?) } - In #{distance_of_time_in_words_to_now(token.expires_at)} + = _('In %{time_to_now}') % { time_to_now: distance_of_time_in_words_to_now(token.expires_at) } - else %span.token-never-expires-label= _('Never') - %td= token.scopes.present? ? token.scopes.join(", ") : _('<no scopes selected>') - - path = impersonation ? revoke_admin_user_impersonation_token_path(token.user, token) : revoke_profile_personal_access_token_path(token) - %td= link_to _('Revoke'), path, method: :put, class: "btn btn-danger float-right qa-revoke-button", data: { confirm: _('Are you sure you want to revoke this %{type} Token? This action cannot be undone.') % { type: type } } + %td= token.scopes.present? ? token.scopes.join(', ') : _('<no scopes selected>') + %td= link_to _('Revoke'), revoke_route_helper.call(token), method: :put, class: 'btn btn-danger float-right qa-revoke-button', data: { confirm: _('Are you sure you want to revoke this %{type}? This action cannot be undone.') % { type: type } } - else .settings-message.text-center - = _('This user has no active %{type} Tokens.') % { type: type } + = no_active_tokens_message diff --git a/app/views/shared/boards/components/_board.html.haml b/app/views/shared/boards/components/_board.html.haml index ffb406ac35b..2a5b72d478a 100644 --- a/app/views/shared/boards/components/_board.html.haml +++ b/app/views/shared/boards/components/_board.html.haml @@ -38,8 +38,7 @@ ":description" => "list.label.description", "tooltipPlacement" => "bottom", ":size" => '(!list.isExpanded ? "sm" : "")', - ":scoped" => "showScopedLabels(list.label)", - ":scoped-labels-documentation-link" => "helpLink" } + ":scoped" => "showScopedLabels(list.label)" } - if can?(current_user, :admin_list, current_board_parent) %board-delete{ "inline-template" => true, diff --git a/app/views/shared/boards/components/sidebar/_labels.html.haml b/app/views/shared/boards/components/sidebar/_labels.html.haml index a1088dc5222..58ffa3942ef 100644 --- a/app/views/shared/boards/components/sidebar/_labels.html.haml +++ b/app/views/shared/boards/components/sidebar/_labels.html.haml @@ -12,8 +12,7 @@ ":background-color" => "label.color", ":title" => "label.title", ":description" => "label.description", - ":scoped" => "showScopedLabels(label)", - ":scoped-labels-documentation-link" => "helpLink" } + ":scoped" => "showScopedLabels(label)" } - if can_admin_issue? .selectbox diff --git a/app/views/projects/deploy_keys/_index.html.haml b/app/views/shared/deploy_keys/_index.html.haml index 6b3b824f72f..f28e745f4c5 100644 --- a/app/views/projects/deploy_keys/_index.html.haml +++ b/app/views/shared/deploy_keys/_index.html.haml @@ -1,15 +1,14 @@ - expanded = expanded_by_default? %section.qa-deploy-keys-settings.settings.no-animate#js-deploy-keys-settings{ class: ('expanded' if expanded), data: { qa_selector: 'deploy_keys_settings' } } .settings-header - %h4 - Deploy Keys + %h4= _('Deploy Keys') %button.btn.js-settings-toggle{ type: 'button' } = expanded ? 'Collapse' : 'Expand' %p - Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one. + = _('Deploy keys allow read-only or read-write (if enabled) access to your repository. Deploy keys can be used for CI, staging or production servers. You can create a deploy key or add an existing one.') .settings-content %h5.prepend-top-0 - Create a new deploy key for this project + = _('Create a new deploy key for this project') = render @deploy_keys.form_partial_path %hr #js-deploy-keys{ data: { endpoint: project_deploy_keys_path(@project), project_id: @project.id } } diff --git a/app/views/projects/deploy_keys/_form.html.haml b/app/views/shared/deploy_keys/_project_group_form.html.haml index 568930595a2..8edd1d9deb8 100644 --- a/app/views/projects/deploy_keys/_form.html.haml +++ b/app/views/shared/deploy_keys/_project_group_form.html.haml @@ -8,17 +8,17 @@ = f.text_area :key, class: "form-control", rows: 5, required: true .form-group.row %p.light.append-bottom-0 - Paste a machine public key here. Read more about how to generate it + = _('Paste a machine public key here. Read more about how to generate it') = link_to "here", help_page_path("ssh/README") = f.fields_for :deploy_keys_projects do |deploy_keys_project_form| .form-group.row = deploy_keys_project_form.label :can_push do = deploy_keys_project_form.check_box :can_push - %strong Write access allowed + %strong= _('Write access allowed') .form-group.row %p.light.append-bottom-0 - Allow this key to push to repository as well? (Default only allows pull access.) + = _('Allow this key to push to repository as well? (Default only allows pull access.)') .form-group.row = f.submit "Add key", class: "btn-success btn" diff --git a/app/views/shared/deploy_tokens/_form.html.haml b/app/views/shared/deploy_tokens/_form.html.haml index 5751ed9cb7a..512644518fa 100644 --- a/app/views/shared/deploy_tokens/_form.html.haml +++ b/app/views/shared/deploy_tokens/_form.html.haml @@ -35,5 +35,15 @@ = label_tag ("deploy_token_write_registry"), 'write_registry', class: 'label-bold form-check-label' .text-secondary= s_('DeployTokens|Allows write access to the registry images') + %fieldset.form-group.form-check + = f.check_box :read_package_registry, class: 'form-check-input' + = label_tag ("deploy_token_read_package_registry"), 'read_package_registry', class: 'label-bold form-check-label' + .text-secondary= s_('DeployTokens|Allows read access to the package registry') + + %fieldset.form-group.form-check + = f.check_box :write_package_registry, class: 'form-check-input' + = label_tag ("deploy_token_write_package_registry"), 'write_package_registry', class: 'label-bold form-check-label' + .text-secondary= s_('DeployTokens|Allows write access to the package registry') + .prepend-top-default = f.submit s_('DeployTokens|Create deploy token'), class: 'btn btn-success qa-create-deploy-token' diff --git a/app/views/shared/file_hooks/_index.html.haml b/app/views/shared/file_hooks/_index.html.haml index 74eb6c94116..0e1f41bbbf6 100644 --- a/app/views/shared/file_hooks/_index.html.haml +++ b/app/views/shared/file_hooks/_index.html.haml @@ -19,6 +19,10 @@ %li .monospace = File.basename(file) + - if File.dirname(file).ends_with?('plugins') + .text-warning + = _('Plugins directory is deprecated and will be removed in 14.0. Please move this file into /file_hooks directory.') + - else .card.bg-light.text-center .nothing-here-block= _('No file hooks found.') diff --git a/app/views/shared/hook_logs/_content.html.haml b/app/views/shared/hook_logs/_content.html.haml index f3b56df0c96..6b056e93460 100644 --- a/app/views/shared/hook_logs/_content.html.haml +++ b/app/views/shared/hook_logs/_content.html.haml @@ -31,7 +31,7 @@ %h5 Request body: %pre :escaped - #{JSON.pretty_generate(hook_log.request_data)} + #{Gitlab::Json.pretty_generate(hook_log.request_data)} %h5 Response headers: %pre - hook_log.response_headers.each do |k,v| diff --git a/app/views/shared/integrations/_form.html.haml b/app/views/shared/integrations/_form.html.haml index 0ddab1368c2..4ec7f286c7a 100644 --- a/app/views/shared/integrations/_form.html.haml +++ b/app/views/shared/integrations/_form.html.haml @@ -10,5 +10,5 @@ - if integration.editable? .footer-block.row-content-block - = service_save_button(integration) + = service_save_button = link_to _('Cancel'), scoped_integration_path(integration), class: 'btn btn-cancel' diff --git a/app/views/shared/integrations/_integrations.html.haml b/app/views/shared/integrations/_index.html.haml index b2359aca016..2dbd612ea38 100644 --- a/app/views/shared/integrations/_integrations.html.haml +++ b/app/views/shared/integrations/_index.html.haml @@ -3,7 +3,7 @@ %col %col %col.d-none.d-sm-table-column - %col{ width: 120 } + %col{ width: 130 } %thead{ role: 'rowgroup' } %tr{ role: 'row' } %th{ role: 'columnheader', scope: 'col', 'aria-colindex': 1 } @@ -13,13 +13,14 @@ %tbody{ role: 'rowgroup' } - integrations.each do |integration| + - activated_label = (integration.activated? ? s_("ProjectService|%{service_title}: status on") : s_("ProjectService|%{service_title}: status off")) % { service_title: integration.title } %tr{ role: 'row' } - %td{ role: 'cell', 'aria-colindex': 1 } - = boolean_to_icon integration.activated? + %td{ role: 'cell', 'aria-colindex': 1, 'aria-label': activated_label } + = boolean_to_icon integration.operating? %td{ role: 'cell', 'aria-colindex': 2 } - = link_to scoped_edit_integration_path(integration) do + = link_to scoped_edit_integration_path(integration), { data: { qa_selector: "#{integration.to_param}_link" } } do %strong= integration.title - %td.d-none.d-sm-block{ role: 'cell', 'aria-colindex': 3 } + %td.d-none.d-sm-table-cell{ role: 'cell', 'aria-colindex': 3 } = integration.description %td{ role: 'cell', 'aria-colindex': 4 } - if integration.updated_at.present? diff --git a/app/views/shared/issuable/_bulk_update_sidebar.html.haml b/app/views/shared/issuable/_bulk_update_sidebar.html.haml index a05a13814ac..4bc6c1dee37 100644 --- a/app/views/shared/issuable/_bulk_update_sidebar.html.haml +++ b/app/views/shared/issuable/_bulk_update_sidebar.html.haml @@ -5,45 +5,49 @@ = form_tag [:bulk_update, @project.namespace.becomes(Namespace), @project, type], method: :post, class: "bulk-update" do .block.issuable-sidebar-header .filter-item.inline.update-issues-btn.float-left - = button_tag "Update all", class: "btn update-selected-issues btn-info", disabled: true - = button_tag "Cancel", class: "btn btn-default js-bulk-update-menu-hide float-right" + = button_tag _('Update all'), class: "btn update-selected-issues btn-info", disabled: true + = button_tag _('Cancel'), class: "btn btn-default js-bulk-update-menu-hide float-right" .block .title - Status + = _('Status') .filter-item - = dropdown_tag("Select status", options: { toggle_class: "js-issue-status", title: "Change status", dropdown_class: "dropdown-menu-status dropdown-menu-selectable", data: { field_name: "update[state_event]", default_label: "Status" } } ) do + = dropdown_tag(_("Select status"), options: { toggle_class: "js-issue-status", title: _("Change status"), dropdown_class: "dropdown-menu-status dropdown-menu-selectable", data: { field_name: "update[state_event]", default_label: _("Status") } } ) do %ul %li - %a{ href: "#", data: { id: "reopen" } } Open + %a{ href: "#", data: { id: "reopen" } } + = _('Open') %li - %a{ href: "#", data: { id: "close" } } Closed + %a{ href: "#", data: { id: "close" } } + = _('Closed') .block .title - Assignee + = _('Assignee') .filter-item - field_name = "update[assignee_ids][]" - = dropdown_tag("Select assignee", options: { toggle_class: "js-user-search js-update-assignee js-filter-submit js-filter-bulk-update", title: "Assign to", filter: true, dropdown_class: "dropdown-menu-user dropdown-menu-selectable", - placeholder: "Search authors", data: { first_user: (current_user.username if current_user), null_user: true, current_user: true, project_id: @project.id, field_name: field_name } }) + = dropdown_tag(_("Select assignee"), options: { toggle_class: "js-user-search js-update-assignee js-filter-submit js-filter-bulk-update", title: _("Assign to"), filter: true, dropdown_class: "dropdown-menu-user dropdown-menu-selectable", + placeholder: _("Search authors"), data: { first_user: (current_user.username if current_user), null_user: true, current_user: true, project_id: @project.id, field_name: field_name } }) .block .title - Milestone + = _('Milestone') .filter-item - = dropdown_tag("Select milestone", options: { title: "Assign milestone", toggle_class: "js-milestone-select js-extra-options js-filter-submit js-filter-bulk-update", filter: true, dropdown_class: "dropdown-menu-selectable dropdown-menu-milestone", placeholder: "Search milestones", data: { show_no: true, field_name: "update[milestone_id]", project_id: @project.id, milestones: project_milestones_path(@project, :json), use_id: true, default_label: "Milestone" } }) + = dropdown_tag(_("Select milestone"), options: { title: _("Assign milestone"), toggle_class: "js-milestone-select js-extra-options js-filter-submit js-filter-bulk-update", filter: true, dropdown_class: "dropdown-menu-selectable dropdown-menu-milestone", placeholder: _("Search milestones"), data: { show_no: true, field_name: "update[milestone_id]", project_id: @project.id, milestones: project_milestones_path(@project, :json), use_id: true, default_label: _("Milestone") } }) .block .title - Labels + = _('Labels') .filter-item.labels-filter - = render "shared/issuable/label_dropdown", classes: ["js-filter-bulk-update", "js-multiselect"], dropdown_title: "Apply a label", show_create: false, show_footer: false, extra_options: false, filter_submit: false, data_options: { persist_when_hide: "true", field_name: "update[label_ids][]", show_no: false, show_any: false, use_id: true, default_label: "Labels" }, label_name: "Select labels", no_default_styles: true + = render "shared/issuable/label_dropdown", classes: ["js-filter-bulk-update", "js-multiselect"], dropdown_title: _("Apply a label"), show_create: false, show_footer: false, extra_options: false, filter_submit: false, data_options: { persist_when_hide: "true", field_name: "update[label_ids][]", show_no: false, show_any: false, use_id: true, default_label: _("Labels") }, label_name: _("Select labels"), no_default_styles: true .block .title - Subscriptions + = _('Subscriptions') .filter-item - = dropdown_tag("Select subscription", options: { toggle_class: "js-subscription-event", title: "Change subscription", dropdown_class: "dropdown-menu-selectable", data: { field_name: "update[subscription_event]", default_label: "Subscription" } } ) do + = dropdown_tag(_("Select subscription"), options: { toggle_class: "js-subscription-event", title: _("Change subscription"), dropdown_class: "dropdown-menu-selectable", data: { field_name: "update[subscription_event]", default_label: _("Subscription") } } ) do %ul %li - %a{ href: "#", data: { id: "subscribe" } } Subscribe + %a{ href: "#", data: { id: "subscribe" } } + = _('Subscribe') %li - %a{ href: "#", data: { id: "unsubscribe" } } Unsubscribe + %a{ href: "#", data: { id: "unsubscribe" } } + = _('Unsubscribe') = hidden_field_tag "update[issuable_ids]", [] = hidden_field_tag :state_event, params[:state_event] diff --git a/app/views/shared/issuable/_close_reopen_button.html.haml b/app/views/shared/issuable/_close_reopen_button.html.haml index 2eb96a7bc9b..5f7cfdc9d03 100644 --- a/app/views/shared/issuable/_close_reopen_button.html.haml +++ b/app/views/shared/issuable/_close_reopen_button.html.haml @@ -2,17 +2,20 @@ - display_issuable_type = issuable_display_type(issuable) - button_method = issuable_close_reopen_button_method(issuable) - are_close_and_open_buttons_hidden = issuable_button_hidden?(issuable, true) && issuable_button_hidden?(issuable, false) +- add_blocked_class = false +- if defined? warn_before_close + - add_blocked_class = warn_before_close - if is_current_user - if can_update - = link_to "Close #{display_issuable_type}", close_issuable_path(issuable), method: button_method, - class: "d-none d-sm-none d-md-block btn btn-grouped btn-close js-btn-issue-action #{issuable_button_visibility(issuable, true)}", title: "Close #{display_issuable_type}", data: { qa_selector: 'close_issue_button' } + = link_to _("Close %{display_issuable_type}") % { display_issuable_type: display_issuable_type }, close_issuable_path(issuable), method: button_method, + class: "d-none d-sm-none d-md-block btn btn-grouped btn-close js-btn-issue-action #{issuable_button_visibility(issuable, true)} #{(add_blocked_class ? 'btn-issue-blocked' : '')}", title: _("Close %{display_issuable_type}") % { display_issuable_type: display_issuable_type }, data: { qa_selector: 'close_issue_button' } - if can_reopen - = link_to "Reopen #{display_issuable_type}", reopen_issuable_path(issuable), method: button_method, - class: "d-none d-sm-none d-md-block btn btn-grouped btn-reopen js-btn-issue-action #{issuable_button_visibility(issuable, false)}", title: "Reopen #{display_issuable_type}", data: { qa_selector: 'reopen_issue_button' } + = link_to _("Reopen %{display_issuable_type}") % { display_issuable_type: display_issuable_type }, reopen_issuable_path(issuable), method: button_method, + class: "d-none d-sm-none d-md-block btn btn-grouped btn-reopen js-btn-issue-action #{issuable_button_visibility(issuable, false)}", title: _("Reopen %{display_issuable_type}") % { display_issuable_type: display_issuable_type }, data: { qa_selector: 'reopen_issue_button' } - else - if can_update && !are_close_and_open_buttons_hidden - = render 'shared/issuable/close_reopen_report_toggle', issuable: issuable + = render 'shared/issuable/close_reopen_report_toggle', issuable: issuable, warn_before_close: add_blocked_class - else - = link_to 'Report abuse', new_abuse_report_path(user_id: issuable.author.id, ref_url: issuable_url(issuable)), - class: 'd-none d-sm-none d-md-block btn btn-grouped btn-close-color', title: 'Report abuse' + = link_to _('Report abuse'), new_abuse_report_path(user_id: issuable.author.id, ref_url: issuable_url(issuable)), + class: 'd-none d-sm-none d-md-block btn btn-grouped btn-close-color', title: _('Report abuse') diff --git a/app/views/shared/issuable/_close_reopen_report_toggle.html.haml b/app/views/shared/issuable/_close_reopen_report_toggle.html.haml index 0d59c9304b4..9d718083d2d 100644 --- a/app/views/shared/issuable/_close_reopen_report_toggle.html.haml +++ b/app/views/shared/issuable/_close_reopen_report_toggle.html.haml @@ -5,45 +5,46 @@ - button_class = "#{button_responsive_class} btn btn-grouped js-issuable-close-button js-btn-issue-action issuable-close-button" - toggle_class = "#{button_responsive_class} btn btn-nr dropdown-toggle js-issuable-close-toggle" - button_method = issuable_close_reopen_button_method(issuable) +- add_blocked_class = false +- if defined? warn_before_close + - add_blocked_class = !issuable.closed? && warn_before_close .float-left.btn-group.prepend-left-10.issuable-close-dropdown.droplab-dropdown.js-issuable-close-dropdown = link_to "#{display_button_action} #{display_issuable_type}", close_reopen_issuable_path(issuable), - method: button_method, class: "#{button_class} btn-#{button_action}", title: "#{display_button_action} #{display_issuable_type}" + method: button_method, class: "#{button_class} btn-#{button_action} #{(add_blocked_class ? 'btn-issue-blocked' : '')}", title: "#{display_button_action} #{display_issuable_type}", data: { qa_selector: 'close_issue_button' } = button_tag type: 'button', class: "#{toggle_class} btn-#{button_action}-color", - data: { 'dropdown-trigger' => '#issuable-close-menu' }, 'aria-label' => 'Toggle dropdown' do + data: { 'dropdown-trigger' => '#issuable-close-menu' }, 'aria-label' => _('Toggle dropdown') do = icon('caret-down', class: 'toggle-icon icon') %ul#issuable-close-menu.js-issuable-close-menu.dropdown-menu{ data: { dropdown: true } } %li.close-item{ class: "#{issuable_button_visibility(issuable, true) || 'droplab-item-selected'}", - data: { text: "Close #{display_issuable_type}", url: close_issuable_path(issuable), + data: { text: _("Close %{display_issuable_type}") % { display_issuable_type: display_issuable_type }, url: close_issuable_path(issuable), button_class: "#{button_class} btn-close", toggle_class: "#{toggle_class} btn-close-color", method: button_method } } %button.btn.btn-transparent = icon('check', class: 'icon') .description %strong.title - Close + = _('Close') = display_issuable_type %li.reopen-item{ class: "#{issuable_button_visibility(issuable, false) || 'droplab-item-selected'}", - data: { text: "Reopen #{display_issuable_type}", url: reopen_issuable_path(issuable), + data: { text: _("Reopen %{display_issuable_type}") % { display_issuable_type: display_issuable_type }, url: reopen_issuable_path(issuable), button_class: "#{button_class} btn-reopen", toggle_class: "#{toggle_class} btn-reopen-color", method: button_method } } %button.btn.btn-transparent = icon('check', class: 'icon') .description %strong.title - Reopen + = _('Reopen') = display_issuable_type %li.divider.droplab-item-ignore - %li.report-item{ data: { text: 'Report abuse', url: new_abuse_report_path(user_id: issuable.author.id, ref_url: issuable_url(issuable)), + %li.report-item{ data: { text: _('Report abuse'), url: new_abuse_report_path(user_id: issuable.author.id, ref_url: issuable_url(issuable)), button_class: "#{button_class} btn-close-color", toggle_class: "#{toggle_class} btn-close-color", method: '' } } %button.btn.btn-transparent = icon('check', class: 'icon') .description - %strong.title Report abuse + %strong.title= _('Report abuse') %p.text - Report - = display_issuable_type.pluralize - that are abusive, inappropriate or spam. + = _('Report %{display_issuable_type} that are abusive, inappropriate or spam.') % { display_issuable_type: display_issuable_type.pluralize } diff --git a/app/views/shared/issuable/_label_dropdown.html.haml b/app/views/shared/issuable/_label_dropdown.html.haml index bca5db16bd3..535af522c1a 100644 --- a/app/views/shared/issuable/_label_dropdown.html.haml +++ b/app/views/shared/issuable/_label_dropdown.html.haml @@ -8,10 +8,11 @@ - data_options = local_assigns.fetch(:data_options, {}) - classes = local_assigns.fetch(:classes, []) - selected = local_assigns.fetch(:selected, nil) -- dropdown_title = local_assigns.fetch(:dropdown_title, "Filter by label") -- dropdown_data = label_dropdown_data(edit_context, labels: labels_filter_path_with_defaults(only_group_labels: edit_context.is_a?(Group)), default_label: "Labels") +- dropdown_title = local_assigns.fetch(:dropdown_title, _('Filter by label')) +- dropdown_data = label_dropdown_data(edit_context, labels: labels_filter_path_with_defaults(only_group_labels: edit_context.is_a?(Group)), default_label: _('Labels')) + - dropdown_data.merge!(data_options) -- label_name = local_assigns.fetch(:label_name, "Labels") +- label_name = local_assigns.fetch(:label_name, _('Labels')) - no_default_styles = local_assigns.fetch(:no_default_styles, false) - classes << 'js-extra-options' if extra_options - classes << 'js-filter-submit' if filter_submit diff --git a/app/views/shared/issuable/_label_page_default.html.haml b/app/views/shared/issuable/_label_page_default.html.haml index a0fb5229fc3..43e80c9db27 100644 --- a/app/views/shared/issuable/_label_page_default.html.haml +++ b/app/views/shared/issuable/_label_page_default.html.haml @@ -3,7 +3,7 @@ - show_title = local_assigns.fetch(:show_title, true) - show_create = local_assigns.fetch(:show_create, true) - show_footer = local_assigns.fetch(:show_footer, true) -- filter_placeholder = local_assigns.fetch(:filter_placeholder, 'Search') +- filter_placeholder = local_assigns.fetch(:filter_placeholder, _('Search')) - show_boards_content = local_assigns.fetch(:show_boards_content, false) - subject = @project || @group .dropdown-page-one diff --git a/app/views/shared/issuable/_nav.html.haml b/app/views/shared/issuable/_nav.html.haml index 93408e0bfc0..c715cd8f736 100644 --- a/app/views/shared/issuable/_nav.html.haml +++ b/app/views/shared/issuable/_nav.html.haml @@ -4,20 +4,20 @@ %ul.nav-links.issues-state-filters.mobile-separator.nav.nav-tabs %li{ class: active_when(params[:state] == 'opened') }> - = link_to page_filter_path(state: 'opened'), id: 'state-opened', title: "Filter by #{page_context_word} that are currently opened.", data: { state: 'opened' } do + = link_to page_filter_path(state: 'opened'), id: 'state-opened', title: _("Filter by %{page_context_word} that are currently opened.") % { page_context_word: page_context_word }, data: { state: 'opened' } do #{issuables_state_counter_text(type, :opened, display_count)} - if type == :merge_requests %li{ class: active_when(params[:state] == 'merged') }> - = link_to page_filter_path(state: 'merged'), id: 'state-merged', title: 'Filter by merge requests that are currently merged.', data: { state: 'merged' } do + = link_to page_filter_path(state: 'merged'), id: 'state-merged', title: _('Filter by merge requests that are currently merged.'), data: { state: 'merged' } do #{issuables_state_counter_text(type, :merged, display_count)} %li{ class: active_when(params[:state] == 'closed') }> - = link_to page_filter_path(state: 'closed'), id: 'state-closed', title: 'Filter by merge requests that are currently closed and unmerged.', data: { state: 'closed' } do + = link_to page_filter_path(state: 'closed'), id: 'state-closed', title: _('Filter by merge requests that are currently closed and unmerged.'), data: { state: 'closed' } do #{issuables_state_counter_text(type, :closed, display_count)} - else %li{ class: active_when(params[:state] == 'closed') }> - = link_to page_filter_path(state: 'closed'), id: 'state-closed', title: 'Filter by issues that are currently closed.', data: { state: 'closed', qa_selector: 'closed_issues_link' } do + = link_to page_filter_path(state: 'closed'), id: 'state-closed', title: _('Filter by issues that are currently closed.'), data: { state: 'closed', qa_selector: 'closed_issues_link' } do #{issuables_state_counter_text(type, :closed, display_count)} = render 'shared/issuable/nav_links/all', page_context_word: page_context_word, counter: issuables_state_counter_text(type, :all, display_count) diff --git a/app/views/shared/issuable/_search_bar.html.haml b/app/views/shared/issuable/_search_bar.html.haml index d9ca0b8869f..34be9291f1f 100644 --- a/app/views/shared/issuable/_search_bar.html.haml +++ b/app/views/shared/issuable/_search_bar.html.haml @@ -1,6 +1,7 @@ - type = local_assigns.fetch(:type) - board = local_assigns.fetch(:board, nil) - show_sorting_dropdown = local_assigns.fetch(:show_sorting_dropdown, true) +- placeholder = local_assigns[:placeholder] || _('Search or filter results...') - is_not_boards_modal_or_productivity_analytics = type != :boards_modal && type != :productivity_analytics - block_css_class = is_not_boards_modal_or_productivity_analytics ? 'row-content-block second-block' : '' - user_can_admin_list = board && can?(current_user, :admin_list, board.resource_parent) @@ -29,7 +30,7 @@ .scroll-container %ul.tokens-container.list-unstyled %li.input-token - %input.form-control.filtered-search{ search_filter_input_options(type) } + %input.form-control.filtered-search{ search_filter_input_options(type, placeholder) } #js-dropdown-hint.filtered-search-input-dropdown-menu.dropdown-menu.hint-dropdown %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } } %li.filter-dropdown-item{ data: {hint: "#{'{{hint}}'}", tag: "#{'{{tag}}'}", action: "#{'{{hint === \'search\' ? \'submit\' : \'\' }}'}" } } @@ -73,6 +74,7 @@ user: User.new(username: '{{username}}', name: '{{name}}'), avatar: { lazy: true, url: '{{avatar_url}}' } = render_if_exists 'shared/issuable/approver_dropdown' + = render_if_exists 'shared/issuable/approved_by_dropdown' #js-dropdown-milestone.filtered-search-input-dropdown-menu.dropdown-menu %ul{ data: { dropdown: true } } %li.filter-dropdown-item{ data: { value: 'None' } } diff --git a/app/views/shared/issuable/_sidebar.html.haml b/app/views/shared/issuable/_sidebar.html.haml index e20573ed3a7..a1c56cdb64f 100644 --- a/app/views/shared/issuable/_sidebar.html.haml +++ b/app/views/shared/issuable/_sidebar.html.haml @@ -15,7 +15,7 @@ - if signed_in %span.issuable-header-text.hide-collapsed.float-left = _('To Do') - %a.gutter-toggle.float-right.js-sidebar-toggle.has-tooltip{ role: "button", href: "#", "aria-label" => "Toggle sidebar", title: sidebar_gutter_tooltip_text, data: { container: 'body', placement: 'left', boundary: 'viewport' } } + %a.gutter-toggle.float-right.js-sidebar-toggle.has-tooltip{ role: "button", href: "#", "aria-label" => _('Toggle sidebar'), title: sidebar_gutter_tooltip_text, data: { container: 'body', placement: 'left', boundary: 'viewport' } } = sidebar_gutter_toggle_icon - if signed_in = render "shared/issuable/sidebar_todo", issuable_sidebar: issuable_sidebar @@ -65,7 +65,7 @@ .sidebar-collapsed-icon.has-tooltip{ data: { placement: 'left', container: 'body', html: 'true', boundary: 'viewport' }, title: sidebar_due_date_tooltip_label(issuable_sidebar[:due_date]) } = icon('calendar', 'aria-hidden': 'true') %span.js-due-date-sidebar-value - = issuable_sidebar[:due_date].try(:to_s, :medium) || 'None' + = issuable_sidebar[:due_date].try(:to_s, :medium) || _('None') .title.hide-collapsed = _('Due date') = icon('spinner spin', class: 'hidden block-loading', 'aria-hidden': 'true') diff --git a/app/views/shared/issuable/_sidebar_assignees.html.haml b/app/views/shared/issuable/_sidebar_assignees.html.haml index b5a27f2f17d..4192ecd2238 100644 --- a/app/views/shared/issuable/_sidebar_assignees.html.haml +++ b/app/views/shared/issuable/_sidebar_assignees.html.haml @@ -1,7 +1,7 @@ - issuable_type = issuable_sidebar[:type] - signed_in = !!issuable_sidebar.dig(:current_user, :id) -#js-vue-sidebar-assignees{ data: { field: "#{issuable_type}", signed_in: signed_in } } +#js-vue-sidebar-assignees{ data: { field: issuable_type, signed_in: signed_in } } .title.hide-collapsed = _('Assignee') .spinner.spinner-sm.align-bottom diff --git a/app/views/shared/issuable/form/_branch_chooser.html.haml b/app/views/shared/issuable/form/_branch_chooser.html.haml index d8253924e0a..3794a3b3845 100644 --- a/app/views/shared/issuable/form/_branch_chooser.html.haml +++ b/app/views/shared/issuable/form/_branch_chooser.html.haml @@ -6,7 +6,7 @@ - source_title, target_title = format_mr_branch_names(@merge_request) -.form-group.row.d-flex.gl-pl-3.gl-pr-3.branch-selector +.form-group.row.d-flex.gl-pl-3-deprecated-no-really-do-not-use-me.gl-pr-3-deprecated-no-really-do-not-use-me.branch-selector .align-self-center %span = _('From <code>%{source_title}</code> into').html_safe % { source_title: source_title } diff --git a/app/views/shared/members/_badge.html.haml b/app/views/shared/members/_badge.html.haml new file mode 100644 index 00000000000..e304207f3e9 --- /dev/null +++ b/app/views/shared/members/_badge.html.haml @@ -0,0 +1,4 @@ +- type ||= 'info' + +%span.px-1.py-1 + %span{ class: "badge badge-#{type}" }= yield diff --git a/app/views/shared/members/_blocked_badge.html.haml b/app/views/shared/members/_blocked_badge.html.haml new file mode 100644 index 00000000000..95335ebe74d --- /dev/null +++ b/app/views/shared/members/_blocked_badge.html.haml @@ -0,0 +1,3 @@ +- if user.blocked? + = render 'shared/members/badge', type: 'danger' do + = _("Blocked") diff --git a/app/views/shared/members/_its_you_badge.html.haml b/app/views/shared/members/_its_you_badge.html.haml new file mode 100644 index 00000000000..b53ffd8032d --- /dev/null +++ b/app/views/shared/members/_its_you_badge.html.haml @@ -0,0 +1,3 @@ +- if user == current_user + = render 'shared/members/badge', type: 'success' do + = _("It's you") diff --git a/app/views/shared/members/_member.html.haml b/app/views/shared/members/_member.html.haml index d74030c566f..f7d90a588c7 100644 --- a/app/views/shared/members/_member.html.haml +++ b/app/views/shared/members/_member.html.haml @@ -13,24 +13,23 @@ - if user = image_tag avatar_icon_for_user(user, 40), class: "avatar s40 flex-shrink-0 flex-grow-0", alt: '' .user-info - = link_to user.name, user_path(user), class: 'member js-user-link', data: { user_id: user.id } - = user_status(user) - %span.cgray= user.to_reference + %span.mr-1 + = link_to user.name, user_path(user), class: 'member js-user-link', data: { user_id: user.id } + = user_status(user) + %span.cgray= user.to_reference - = render_if_exists 'shared/members/ee/sso_badge', member: member + .mx-n1.d-inline-flex.flex-wrap + = render_if_exists 'shared/members/ee/sso_badge', member: member - - if user == current_user - %span.badge.badge-success.prepend-left-5= _("It's you") + = render_if_exists 'shared/members/ee/gma_badge', member: member - = render_if_exists 'shared/members/ee/license_badge', user: user, group: @group + = render 'shared/members/its_you_badge', user: user, current_user: current_user - - if user.blocked? - %label.badge.badge-danger - %strong= _("Blocked") + = render_if_exists 'shared/members/ee/license_badge', user: user, group: @group - - if user.two_factor_enabled? - %label.badge.badge-info - = _("2FA") + = render 'shared/members/blocked_badge', user: user + + = render 'shared/members/two_factor_auth_badge', user: user - if source.instance_of?(Group) && source != @group · @@ -68,7 +67,7 @@ class: 'btn btn-default align-self-center mr-sm-2', title: _('Resend invite') - - if user != current_user && member.can_update? + - if user != current_user && member.can_update? && !user&.project_bot? = form_for member, remote: true, html: { class: "js-edit-member-form form-group #{'d-sm-flex' unless force_mobile_view}" } do |f| = f.hidden_field :access_level .member-form-control.dropdown{ class: [("mr-sm-2 d-sm-inline-block" unless force_mobile_view)] } @@ -118,7 +117,7 @@ method: :delete, data: { confirm: leave_confirmation_message(member.source) }, class: "btn btn-remove align-self-center m-0 #{'ml-sm-2' unless force_mobile_view}" - - else + - elsif !user&.project_bot? = link_to member, method: :delete, data: { confirm: remove_member_message(member), qa_selector: 'delete_member_button' }, diff --git a/app/views/shared/members/_two_factor_auth_badge.html.haml b/app/views/shared/members/_two_factor_auth_badge.html.haml new file mode 100644 index 00000000000..34850c135d6 --- /dev/null +++ b/app/views/shared/members/_two_factor_auth_badge.html.haml @@ -0,0 +1,3 @@ +- if user.two_factor_enabled? + = render 'shared/members/badge', type: 'info' do + = _("2FA") diff --git a/app/views/shared/milestones/_issuable.html.haml b/app/views/shared/milestones/_issuable.html.haml index 0adfe2f0c04..f8bf3e7ad6a 100644 --- a/app/views/shared/milestones/_issuable.html.haml +++ b/app/views/shared/milestones/_issuable.html.haml @@ -25,5 +25,5 @@ %span.assignee-icon - assignees.each do |assignee| = link_to polymorphic_path(issuable_type_args, { milestone_title: @milestone.title, assignee_id: assignee.id, state: 'all' }), - class: 'has-tooltip', title: "Assigned to #{assignee.name}", data: { container: 'body' } do + class: 'has-tooltip', title: _("Assigned to %{assignee_name}") % { assignee_name: assignee.name }, data: { container: 'body' } do - image_tag(avatar_icon_for_user(assignee, 16), class: "avatar s16", alt: '') diff --git a/app/views/shared/milestones/_issues_tab.html.haml b/app/views/shared/milestones/_issues_tab.html.haml index d7e4f2ed5a0..6684f6d752a 100644 --- a/app/views/shared/milestones/_issues_tab.html.haml +++ b/app/views/shared/milestones/_issues_tab.html.haml @@ -8,8 +8,8 @@ .row.prepend-top-default .col-md-4 - = render 'shared/milestones/issuables', args.merge(title: 'Unstarted Issues (open and unassigned)', issuables: issues.opened.unassigned, id: 'unassigned', show_counter: true) + = render 'shared/milestones/issuables', args.merge(title: s_('Milestones|Unstarted Issues (open and unassigned)'), issuables: issues.opened.unassigned, id: 'unassigned', show_counter: true) .col-md-4 - = render 'shared/milestones/issuables', args.merge(title: 'Ongoing Issues (open and assigned)', issuables: issues.opened.assigned, id: 'ongoing', show_counter: true) + = render 'shared/milestones/issuables', args.merge(title: s_('Milestones|Ongoing Issues (open and assigned)'), issuables: issues.opened.assigned, id: 'ongoing', show_counter: true) .col-md-4 - = render 'shared/milestones/issuables', args.merge(title: 'Completed Issues (closed)', issuables: issues.closed, id: 'closed', show_counter: true) + = render 'shared/milestones/issuables', args.merge(title: s_('Milestones|Completed Issues (closed)'), issuables: issues.closed, id: 'closed', show_counter: true) diff --git a/app/views/shared/milestones/_labels_tab.html.haml b/app/views/shared/milestones/_labels_tab.html.haml index 6d79b0d31b2..3b4d29ca7b0 100644 --- a/app/views/shared/milestones/_labels_tab.html.haml +++ b/app/views/shared/milestones/_labels_tab.html.haml @@ -9,6 +9,6 @@ .float-right.d-none.d-lg-block.d-xl-block = link_to milestones_issues_path(options.merge(state: 'opened')), class: 'btn btn-transparent btn-action' do - - pluralize milestone_issues_by_label_count(@milestone, label, state: :opened), 'open issue' + - pluralize milestone_issues_by_label_count(@milestone, label, state: :opened), _('open issue') = link_to milestones_issues_path(options.merge(state: 'closed')), class: 'btn btn-transparent btn-action' do - - pluralize milestone_issues_by_label_count(@milestone, label, state: :closed), 'closed issue' + - pluralize milestone_issues_by_label_count(@milestone, label, state: :closed), _('closed issue') diff --git a/app/views/shared/milestones/_merge_requests_tab.haml b/app/views/shared/milestones/_merge_requests_tab.haml index 9c193f901e2..4dba2473efc 100644 --- a/app/views/shared/milestones/_merge_requests_tab.haml +++ b/app/views/shared/milestones/_merge_requests_tab.haml @@ -3,10 +3,10 @@ .row.prepend-top-default .col-md-3 - = render 'shared/milestones/issuables', args.merge(title: 'Work in progress (open and unassigned)', issuables: merge_requests.opened.unassigned, id: 'unassigned', show_counter: true) + = render 'shared/milestones/issuables', args.merge(title: _('Work in progress (open and unassigned)'), issuables: merge_requests.opened.unassigned, id: 'unassigned', show_counter: true) .col-md-3 - = render 'shared/milestones/issuables', args.merge(title: 'Waiting for merge (open and assigned)', issuables: merge_requests.opened.assigned, id: 'ongoing', show_counter: true) + = render 'shared/milestones/issuables', args.merge(title: _('Waiting for merge (open and assigned)'), issuables: merge_requests.opened.assigned, id: 'ongoing', show_counter: true) .col-md-3 - = render 'shared/milestones/issuables', args.merge(title: 'Rejected (closed)', issuables: merge_requests.closed, id: 'closed', show_counter: true) + = render 'shared/milestones/issuables', args.merge(title: _('Rejected (closed)'), issuables: merge_requests.closed, id: 'closed', show_counter: true) .col-md-3 - = render 'shared/milestones/issuables', args.merge(title: 'Merged', issuables: merge_requests.merged, id: 'merged', primary: true, show_counter: true) + = render 'shared/milestones/issuables', args.merge(title: _('Merged'), issuables: merge_requests.merged, id: 'merged', primary: true, show_counter: true) diff --git a/app/views/shared/milestones/_milestone.html.haml b/app/views/shared/milestones/_milestone.html.haml index 451c2c2ba10..9f61082d605 100644 --- a/app/views/shared/milestones/_milestone.html.haml +++ b/app/views/shared/milestones/_milestone.html.haml @@ -1,6 +1,6 @@ - dashboard = local_assigns[:dashboard] - custom_dom_id = dom_id(milestone.try(:milestone) ? milestone.milestone : milestone) -- milestone_type = milestone.group_milestone? ? 'Group Milestone' : 'Project Milestone' +- milestone_type = milestone.group_milestone? ? s_('Milestones|Group Milestone') : s_('Milestones|Project Milestone') %li{ class: "milestone milestone-#{milestone.closed? ? 'closed' : 'open'}", id: custom_dom_id } .row @@ -42,17 +42,17 @@ .col-sm-4.milestone-progress = milestone_progress_bar(milestone) - = link_to pluralize(milestone.total_issues_count, 'Issue'), issues_path + = link_to pluralize(milestone.total_issues_count, _('Issue')), issues_path - if milestone.merge_requests_enabled? · - = link_to pluralize(milestone.merge_requests_visible_to_user(current_user).size, 'Merge Request'), merge_requests_path + = link_to pluralize(milestone.merge_requests_visible_to_user(current_user).size, _('Merge Request')), merge_requests_path .float-lg-right.light #{milestone.percent_complete}% complete .col-sm-2 .milestone-actions.d-flex.justify-content-sm-start.justify-content-md-end - if @project - if can_admin_project_milestones? and milestone.active? - if can_admin_group_milestones? - %button.js-promote-project-milestone-button.btn.btn-blank.btn-sm.btn-grouped.has-tooltip{ title: _('Promote to Group Milestone'), + %button.js-promote-project-milestone-button.btn.btn-blank.btn-sm.btn-grouped.has-tooltip{ title: s_('Milestones|Promote to Group Milestone'), disabled: true, type: 'button', data: { url: promote_project_milestone_path(milestone.project, milestone), @@ -63,15 +63,15 @@ toggle: 'modal' } } = sprite_icon('level-up', size: 14) - = link_to 'Close Milestone', project_milestone_path(@project, milestone, milestone: {state_event: :close }), method: :put, remote: true, class: "btn btn-sm btn-close btn-grouped" + = link_to s_('Milestones|Close Milestone'), project_milestone_path(@project, milestone, milestone: {state_event: :close }), method: :put, remote: true, class: "btn btn-sm btn-close btn-grouped" - unless milestone.active? - = link_to 'Reopen Milestone', project_milestone_path(@project, milestone, milestone: {state_event: :activate }), method: :put, class: "btn btn-grouped btn-reopen" + = link_to s_('Milestones|Reopen Milestone'), project_milestone_path(@project, milestone, milestone: {state_event: :activate }), method: :put, class: "btn btn-grouped btn-reopen" - if @group - if can?(current_user, :admin_milestone, @group) - if milestone.closed? - = link_to 'Reopen Milestone', group_milestone_route(milestone, {state_event: :activate }), method: :put, class: "btn btn-sm btn-grouped btn-reopen" + = link_to s_('Milestones|Reopen Milestone'), group_milestone_route(milestone, {state_event: :activate }), method: :put, class: "btn btn-sm btn-grouped btn-reopen" - else - = link_to 'Close Milestone', group_milestone_route(milestone, {state_event: :close }), method: :put, class: "btn btn-sm btn-grouped btn-close" + = link_to s_('Milestones|Close Milestone'), group_milestone_route(milestone, {state_event: :close }), method: :put, class: "btn btn-sm btn-grouped btn-close" - if dashboard .label-badge.label-badge-gray = milestone_type diff --git a/app/views/shared/milestones/_top.html.haml b/app/views/shared/milestones/_top.html.haml index 8d911d4247e..5f53e6316af 100644 --- a/app/views/shared/milestones/_top.html.haml +++ b/app/views/shared/milestones/_top.html.haml @@ -21,10 +21,10 @@ %table.table %thead %tr - %th Project - %th Open issues - %th State - %th Due date + %th= _('Project') + %th= _('Open issues') + %th= _('State') + %th= _('Due date') %tr %td - project_name = group ? milestone.project.name : milestone.project.full_name @@ -33,8 +33,8 @@ = milestone.milestone.issues_visible_to_user(current_user).opened.count %td - if milestone.closed? - Closed + = _('Closed') - else - Open + = _('Open') %td = milestone.expires_at diff --git a/app/views/shared/notes/_form.html.haml b/app/views/shared/notes/_form.html.haml index d91bc6e57c9..327745e4f4d 100644 --- a/app/views/shared/notes/_form.html.haml +++ b/app/views/shared/notes/_form.html.haml @@ -5,7 +5,7 @@ - else - preview_url = preview_markdown_path(@project) -= form_for form_resources, url: new_form_url, remote: true, html: { :'data-type' => 'json', multipart: true, id: nil, class: "new-note js-new-note-form js-quick-submit common-note-form", "data-noteable-iid" => @note.noteable.try(:iid), }, authenticity_token: true do |f| += form_for form_resources, url: new_form_url, remote: true, html: { :'data-type' => 'json', multipart: true, id: nil, class: "new-note js-new-note-form js-quick-submit common-note-form discussion-reply-holder", "data-noteable-iid" => @note.noteable.try(:iid), }, authenticity_token: true do |f| = hidden_field_tag :view, diff_view = hidden_field_tag :line_type = hidden_field_tag :merge_request_diff_head_sha, @note.noteable.try(:diff_head_sha) @@ -24,7 +24,7 @@ -# DiffNote = f.hidden_field :position - .discussion-form-container + .discussion-form-container.discussion-with-resolve-btn.flex-column.p-0 = render layout: 'projects/md_preview', locals: { url: preview_url, referenced_users: true } do = render 'projects/zen', f: f, attr: :note, diff --git a/app/views/shared/notes/_note.html.haml b/app/views/shared/notes/_note.html.haml index 50bc4fb35df..df09c4338a1 100644 --- a/app/views/shared/notes/_note.html.haml +++ b/app/views/shared/notes/_note.html.haml @@ -40,9 +40,10 @@ - if note.system %span.system-note-message = markdown_field(note, :note) - %span.system-note-separator - · - %a.system-note-separator{ href: "##{dom_id(note)}" }= time_ago_with_tooltip(note.created_at, placement: 'bottom', html_class: 'note-created-ago') + - if note.created_at + %span.system-note-separator + · + %a.system-note-separator{ href: "##{dom_id(note)}" }= time_ago_with_tooltip(note.created_at, placement: 'bottom', html_class: 'note-created-ago') - unless note.system? .note-actions - if note.for_personal_snippet? diff --git a/app/views/shared/snippets/_form.html.haml b/app/views/shared/snippets/_form.html.haml index 396b6e56ea9..4695692fb53 100644 --- a/app/views/shared/snippets/_form.html.haml +++ b/app/views/shared/snippets/_form.html.haml @@ -1,7 +1,3 @@ -- if Feature.disabled?(:monaco_snippets) - - content_for :page_specific_javascripts do - = page_specific_javascript_tag('lib/ace.js') - - if Feature.enabled?(:snippets_edit_vue) #js-snippet-edit.snippet-form{ data: {'project_path': @snippet.project&.full_path, 'snippet-gid': @snippet.new_record? ? '' : @snippet.to_global_id, 'markdown-preview-path': preview_markdown_path(parent), 'markdown-docs-path': help_page_path('user/markdown'), 'visibility-help-link': help_page_path("public_access/public_access") } } - else @@ -24,7 +20,7 @@ = text_field_tag nil, nil, class: 'form-control', placeholder: description_placeholder, data: { qa_selector: 'description_placeholder' } .js-expanded{ class: ('d-none' if !is_expanded) } = render layout: 'projects/md_preview', locals: { url: preview_markdown_path(@project), referenced_users: true } do - = render 'projects/zen', f: f, attr: :description, classes: 'note-textarea', placeholder: description_placeholder, qa_selector: 'description_field' + = render 'projects/zen', f: f, attr: :description, classes: 'note-textarea', placeholder: description_placeholder, qa_selector: 'snippet_description_field' = render 'shared/notes/hints' .form-group.file-editor @@ -48,9 +44,9 @@ .form-actions - if @snippet.new_record? - = f.submit 'Create snippet', class: "btn-success btn qa-create-snippet-button" + = f.submit 'Create snippet', class: "btn-success btn", data: { qa_selector: 'submit_button' } - else - = f.submit 'Save changes', class: "btn-success btn" + = f.submit 'Save changes', class: "btn-success btn", data: { qa_selector: 'submit_button' } - if @snippet.project_id = link_to "Cancel", project_snippets_path(@project), class: "btn btn-cancel" diff --git a/app/views/shared/snippets/_header.html.haml b/app/views/shared/snippets/_header.html.haml index 1243bdab6dd..e663d57ae6a 100644 --- a/app/views/shared/snippets/_header.html.haml +++ b/app/views/shared/snippets/_header.html.haml @@ -21,7 +21,7 @@ = markdown_field(@snippet, :title) - if @snippet.description.present? - .description{ data: { qa_selector: 'snippet_description' } } + .description{ data: { qa_selector: 'snippet_description_field' } } .md = markdown_field(@snippet, :description) %textarea.hidden.js-task-list-field @@ -34,7 +34,7 @@ .embed-snippet .input-group .input-group-prepend - %button.btn.btn-svg.embed-toggle.input-group-text.qa-embed-type{ 'data-toggle': 'dropdown', type: 'button' } + %button.btn.btn-svg.embed-toggle.input-group-text{ 'data-toggle': 'dropdown', type: 'button' } %span.js-embed-action= _("Embed") = sprite_icon('angle-down', size: 12, css_class: 'caret-down') %ul.dropdown-menu.dropdown-menu-selectable.embed-toggle-list diff --git a/app/views/shared/snippets/_snippet.html.haml b/app/views/shared/snippets/_snippet.html.haml index 3fea2c1e3fc..128ddbb8e8b 100644 --- a/app/views/shared/snippets/_snippet.html.haml +++ b/app/views/shared/snippets/_snippet.html.haml @@ -1,6 +1,5 @@ - link_project = local_assigns.fetch(:link_project, false) - notes_count = @noteable_meta_data[snippet.id].user_notes_count -- file_name = snippet_file_name(snippet) %li.snippet-row.py-3 = image_tag avatar_icon_for_user(snippet.author), class: "avatar s40 d-none d-sm-block", alt: '' @@ -8,10 +7,6 @@ .title = link_to gitlab_snippet_path(snippet) do = snippet.title - - if file_name.present? - %span.snippet-filename.d-none.d-sm-inline-block.ml-2 - = sprite_icon('doc-code', size: 16, css_class: 'file-icon align-text-bottom') - = file_name %ul.controls %li diff --git a/app/views/shared/tokens/_scopes_form.html.haml b/app/views/shared/tokens/_scopes_form.html.haml index a5d3e1c8de0..82e32597c94 100644 --- a/app/views/shared/tokens/_scopes_form.html.haml +++ b/app/views/shared/tokens/_scopes_form.html.haml @@ -6,4 +6,4 @@ %fieldset.form-group.form-check = check_box_tag "#{prefix}[scopes][]", scope, token.scopes.include?(scope), id: "#{prefix}_scopes_#{scope}", class: "form-check-input qa-#{scope}-radio" = label_tag ("#{prefix}_scopes_#{scope}"), scope, class: 'label-bold form-check-label' - .text-secondary= t scope, scope: [:doorkeeper, :scope_desc] + .text-secondary= t scope, scope: scope_description(prefix) diff --git a/app/views/snippets/show.html.haml b/app/views/snippets/show.html.haml index 741e38e3d84..819f02b78fe 100644 --- a/app/views/snippets/show.html.haml +++ b/app/views/snippets/show.html.haml @@ -4,7 +4,7 @@ - breadcrumb_title @snippet.to_reference - page_title "#{@snippet.title} (#{@snippet.to_reference})", _("Snippets") -- if Feature.enabled?(:snippets_vue) +- if Feature.enabled?(:snippets_vue, default_enabled: true) #js-snippet-view{ data: {'qa-selector': 'snippet_view', 'snippet-gid': @snippet.to_global_id} } - else = render 'shared/snippets/header' diff --git a/app/views/users/_deletion_guidance.html.haml b/app/views/users/_deletion_guidance.html.haml index 0545cab538c..7169aebea74 100644 --- a/app/views/users/_deletion_guidance.html.haml +++ b/app/views/users/_deletion_guidance.html.haml @@ -3,8 +3,9 @@ %ul %li %p - Certain user content will be moved to a system-wide "Ghost User" in order to maintain content for posterity. For further information, please refer to the - = link_to 'user account deletion documentation.', help_page_path("user/profile/account/delete_account", anchor: "associated-records") + - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path("user/profile/account/delete_account", anchor: "associated-records") } + = _('Certain user content will be moved to a system-wide "Ghost User" in order to maintain content for posterity. For further information, please refer to the %{link_start}user account deletion documentation.%{link_end}').html_safe % { link_start: link_start, link_end: '</a>'.html_safe } - personal_projects_count = user.personal_projects.count - unless personal_projects_count.zero? - %li #{pluralize(personal_projects_count, 'personal project')} will be removed and cannot be restored + %li + = n_('personal project will be removed and cannot be restored', '%d personal projects will be removed and cannot be restored', personal_projects_count) diff --git a/app/views/users/calendar_activities.html.haml b/app/views/users/calendar_activities.html.haml index 7516dfe1602..a5197a9950b 100644 --- a/app/views/users/calendar_activities.html.haml +++ b/app/views/users/calendar_activities.html.haml @@ -22,14 +22,14 @@ - elsif event.target = link_to event.target.to_reference, [event.project.namespace.becomes(Namespace), event.project, event.target], class: 'has-tooltip', title: event.target_title - at + = s_('UserProfile|at') %strong - if event.project = link_to_project(event.project) - else = event.resource_parent_name - else - made a private contribution + = s_('UserProfile|made a private contribution') - else %p = _('No contributions were found') |