diff options
Diffstat (limited to 'app/views')
269 files changed, 1291 insertions, 1145 deletions
diff --git a/app/views/admin/application_settings/_account_and_limit.html.haml b/app/views/admin/application_settings/_account_and_limit.html.haml index c0e42f22119..c091a2180c5 100644 --- a/app/views/admin/application_settings/_account_and_limit.html.haml +++ b/app/views/admin/application_settings/_account_and_limit.html.haml @@ -17,14 +17,14 @@ .form-group = f.label :receive_max_input_size, _('Maximum push size (MB)'), class: 'label-light' - = f.number_field :receive_max_input_size, class: 'form-control gl-form-input qa-receive-max-input-size-field', title: _('Maximum size limit for a single commit.'), data: { toggle: 'tooltip', container: 'body' } + = f.number_field :receive_max_input_size, class: 'form-control gl-form-input', title: _('Maximum size limit for a single commit.'), data: { toggle: 'tooltip', container: 'body', qa_selector: 'receive_max_input_size_field' } .form-group = f.label :max_export_size, _('Maximum export size (MB)'), class: 'label-light' = f.number_field :max_export_size, class: 'form-control gl-form-input', title: _('Maximum size of export files.'), data: { toggle: 'tooltip', container: 'body' } %span.form-text.text-muted= _('Set to 0 for no size limit.') .form-group = f.label :max_import_size, _('Maximum import size (MB)'), class: 'label-light' - = f.number_field :max_import_size, class: 'form-control gl-form-input qa-receive-max-import-size-field', title: _('Maximum size of import files.'), data: { toggle: 'tooltip', container: 'body' } + = f.number_field :max_import_size, class: 'form-control gl-form-input', title: _('Maximum size of import files.'), data: { toggle: 'tooltip', container: 'body' } %span.form-text.text-muted= _('Only effective when remote storage is enabled. Set to 0 for no size limit.') .form-group = f.label :session_expire_delay, _('Session duration (minutes)'), class: 'label-light' @@ -54,10 +54,10 @@ - dormant_users_help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: dormant_users_help_link } = f.gitlab_ui_checkbox_component :deactivate_dormant_users, _('Deactivate dormant users after a period of inactivity'), help_text: _('Users can reactivate their account by signing in. %{link_start}Learn more.%{link_end}').html_safe % { link_start: dormant_users_help_link_start, link_end: '</a>'.html_safe } .form-group - = f.label :deactivate_dormant_users_period, _('Period of inactivity (days)'), class: 'label-light' - = f.number_field :deactivate_dormant_users_period, class: 'form-control gl-form-input', min: '1' + = f.label :deactivate_dormant_users_period, _('Days of inactivity before deactivation'), class: 'label-light' + = f.number_field :deactivate_dormant_users_period, class: 'form-control gl-form-input', min: '90', step: '1' .form-text.text-muted - = _('Period of inactivity before deactivation.') + = _('Must be 90 days or more.') .form-group = f.label :personal_access_token_prefix, _('Personal Access Token prefix'), class: 'label-light' @@ -67,6 +67,6 @@ = f.gitlab_ui_checkbox_component :user_show_add_ssh_key_message, _("Inform users without uploaded SSH keys that they can't push over SSH until one is added") = render 'admin/application_settings/invitation_flow_enforcement', form: f - = render_if_exists 'admin/application_settings/updating_name_disabled_for_users', form: f + = render 'admin/application_settings/user_restrictions', form: f = render_if_exists 'admin/application_settings/availability_on_namespace_setting', form: f - = f.submit _('Save changes'), class: 'qa-save-changes-button', pajamas_button: true + = f.submit _('Save changes'), pajamas_button: true, data: { qa_selector: 'save_changes_button' } diff --git a/app/views/admin/application_settings/_ci_cd.html.haml b/app/views/admin/application_settings/_ci_cd.html.haml index 05aea2b343d..f6635ad17ef 100644 --- a/app/views/admin/application_settings/_ci_cd.html.haml +++ b/app/views/admin/application_settings/_ci_cd.html.haml @@ -53,8 +53,7 @@ = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'specify-a-custom-cicd-configuration-file'), target: '_blank', rel: 'noopener noreferrer' .form-group = f.gitlab_ui_checkbox_component :suggest_pipeline_enabled, s_('AdminSettings|Enable pipeline suggestion banner'), help_text: s_('AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file.') - - if Feature.enabled?(:enforce_runner_token_expires_at) - #js-runner-token-expiration-intervals{ data: runner_token_expiration_interval_attributes } + #js-runner-token-expiration-intervals{ data: runner_token_expiration_interval_attributes } = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_eks.html.haml b/app/views/admin/application_settings/_eks.html.haml index 0bb9be497d9..62c61ad356f 100644 --- a/app/views/admin/application_settings/_eks.html.haml +++ b/app/views/admin/application_settings/_eks.html.haml @@ -31,4 +31,4 @@ .form-text.text-muted = _('Only required if not using role instance credentials.') - = f.submit _('Save changes'), class: "gl-button btn btn-confirm" + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_email.html.haml b/app/views/admin/application_settings/_email.html.haml index fd65d4029f5..e0ff1f4be43 100644 --- a/app/views/admin/application_settings/_email.html.haml +++ b/app/views/admin/application_settings/_email.html.haml @@ -21,4 +21,4 @@ .form-group = f.gitlab_ui_checkbox_component :user_deactivation_emails_enabled, _('Enable user deactivation emails'), help_text: _('Send emails to users upon account deactivation.') - = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' } + = f.submit _('Save changes'), pajamas_button: true, data: { qa_selector: 'save_changes_button' } diff --git a/app/views/admin/application_settings/_external_authorization_service_form.html.haml b/app/views/admin/application_settings/_external_authorization_service_form.html.haml index 7919fde631f..a5e10846488 100644 --- a/app/views/admin/application_settings/_external_authorization_service_form.html.haml +++ b/app/views/admin/application_settings/_external_authorization_service_form.html.haml @@ -47,4 +47,4 @@ = f.text_field :external_authorization_service_default_label, class: 'form-control gl-form-input' %span.form-text.text-muted = external_authorization_client_url_help_text - = f.submit _('Save changes'), class: "gl-button btn btn-confirm" + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_floc.html.haml b/app/views/admin/application_settings/_floc.html.haml index e56ba635890..cb8b2d3dfcd 100644 --- a/app/views/admin/application_settings/_floc.html.haml +++ b/app/views/admin/application_settings/_floc.html.haml @@ -19,4 +19,4 @@ .form-group = f.gitlab_ui_checkbox_component :floc_enabled, s_('FloC|Participate in FLoC') - = f.submit _('Save changes'), class: 'gl-button btn btn-confirm' + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_gitaly.html.haml b/app/views/admin/application_settings/_gitaly.html.haml index ade6dac606a..f459ff5abc4 100644 --- a/app/views/admin/application_settings/_gitaly.html.haml +++ b/app/views/admin/application_settings/_gitaly.html.haml @@ -1,4 +1,4 @@ -= form_for @application_setting, url: preferences_admin_application_settings_path(anchor: 'js-gitaly-settings'), html: { class: 'fieldset-form' } do |f| += gitlab_ui_form_for @application_setting, url: preferences_admin_application_settings_path(anchor: 'js-gitaly-settings'), html: { class: 'fieldset-form' } do |f| = form_errors(@application_setting) %fieldset @@ -18,4 +18,4 @@ .form-text.text-muted = _('Timeout for moderately fast Gitaly operations (in seconds). Provide a value between Default timeout and Fast timeout.') - = f.submit _('Save changes'), class: "gl-button btn btn-confirm" + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_gitpod.html.haml b/app/views/admin/application_settings/_gitpod.html.haml index df534f18bde..09817a9172f 100644 --- a/app/views/admin/application_settings/_gitpod.html.haml +++ b/app/views/admin/application_settings/_gitpod.html.haml @@ -26,4 +26,4 @@ = s_('Gitpod|The URL to your Gitpod instance configured to read your GitLab projects, such as https://gitpod.example.com.') - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('integration/gitpod', anchor: 'enable-gitpod-in-your-user-settings') } = s_('Gitpod|To use the integration, each user must also enable Gitpod on their GitLab account. %{link_start}How do I enable it?%{link_end} ').html_safe % { link_start: link_start, link_end: '</a>'.html_safe } - = f.submit _('Save changes'), class: 'gl-button btn btn-confirm' + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_help_page.html.haml b/app/views/admin/application_settings/_help_page.html.haml index 21eb4caf579..11ebad07e9a 100644 --- a/app/views/admin/application_settings/_help_page.html.haml +++ b/app/views/admin/application_settings/_help_page.html.haml @@ -21,4 +21,4 @@ - docs_link_url = help_page_path('user/admin_area/settings/help_page', anchor: 'destination-requirements') - docs_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: docs_link_url } %span.form-text.text-muted#support_help_block= html_escape(_('Requests for pages at %{code_start}%{help_text_url}%{code_end} redirect to the URL. The destination must meet certain requirements. %{docs_link_start}Learn more.%{docs_link_end}')) % { code_start: '<code>'.html_safe, help_text_url: help_url, code_end: '</code>'.html_safe, docs_link_start: docs_link_start, docs_link_end: '</a>'.html_safe } - = f.submit _('Save changes'), class: "gl-button btn btn-confirm" + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_import_export_limits.html.haml b/app/views/admin/application_settings/_import_export_limits.html.haml index bc4a1577f90..8cb7915f847 100644 --- a/app/views/admin/application_settings/_import_export_limits.html.haml +++ b/app/views/admin/application_settings/_import_export_limits.html.haml @@ -1,4 +1,4 @@ -= form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-import-export-limits-settings'), html: { class: 'fieldset-form' } do |f| += gitlab_ui_form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-import-export-limits-settings'), html: { class: 'fieldset-form' } do |f| = form_errors(@application_setting) %fieldset @@ -35,4 +35,4 @@ = f.label :group_download_export_limit, _('Maximum group export download requests per minute'), class: 'label-bold' = f.number_field :group_download_export_limit, class: 'form-control gl-form-input' - = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' } + = f.submit _('Save changes'), data: { qa_selector: 'save_changes_button' }, pajamas_button: true diff --git a/app/views/admin/application_settings/_ip_limits.html.haml b/app/views/admin/application_settings/_ip_limits.html.haml index 4362ae9cb9b..01d7bf0af67 100644 --- a/app/views/admin/application_settings/_ip_limits.html.haml +++ b/app/views/admin/application_settings/_ip_limits.html.haml @@ -66,4 +66,4 @@ .form-text.text-muted = html_escape(_("If blank, defaults to %{code_open}Retry later%{code_close}.")) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe } - = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' } + = f.submit _('Save changes'), data: { qa_selector: 'save_changes_button' }, pajamas_button: true diff --git a/app/views/admin/application_settings/_issue_limits.html.haml b/app/views/admin/application_settings/_issue_limits.html.haml index 431e2a64c46..147aab443b2 100644 --- a/app/views/admin/application_settings/_issue_limits.html.haml +++ b/app/views/admin/application_settings/_issue_limits.html.haml @@ -6,4 +6,4 @@ = f.label :issues_create_limit, _('Maximum number of requests per minute') = f.number_field :issues_create_limit, class: 'form-control gl-form-input' - = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' } + = f.submit _('Save changes'), data: { qa_selector: 'save_changes_button' }, pajamas_button: true diff --git a/app/views/admin/application_settings/_jira_connect_application_key.html.haml b/app/views/admin/application_settings/_jira_connect_application_key.html.haml index e3df408cd4c..b67e7680720 100644 --- a/app/views/admin/application_settings/_jira_connect_application_key.html.haml +++ b/app/views/admin/application_settings/_jira_connect_application_key.html.haml @@ -18,4 +18,4 @@ .form-group = f.label :jira_connect_application_key, s_('JiraConnect|Jira Connect Application ID'), class: 'label-bold' = f.text_field :jira_connect_application_key, class: 'form-control gl-form-input' - = f.submit _('Save changes'), class: 'gl-button btn btn-confirm' + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_localization.html.haml b/app/views/admin/application_settings/_localization.html.haml index a6ed48ef4fe..90cb34395d8 100644 --- a/app/views/admin/application_settings/_localization.html.haml +++ b/app/views/admin/application_settings/_localization.html.haml @@ -15,5 +15,5 @@ - time_tracking_help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: time_tracking_help_link } = f.gitlab_ui_checkbox_component :time_tracking_limit_to_hours, _('Limit display of time tracking units to hours.'), help_text: _('Display time tracking in issues in total hours only. %{link_start}What is time tracking?%{link_end}').html_safe % { link_start: time_tracking_help_link_start, link_end: '</a>'.html_safe } - = f.submit _('Save changes'), class: "gl-button btn btn-confirm" + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_network_rate_limits.html.haml b/app/views/admin/application_settings/_network_rate_limits.html.haml index f1857a9749a..300180f7b9a 100644 --- a/app/views/admin/application_settings/_network_rate_limits.html.haml +++ b/app/views/admin/application_settings/_network_rate_limits.html.haml @@ -30,4 +30,4 @@ = f.label :"throttle_authenticated_#{setting_fragment}_period_in_seconds", _('Authenticated API rate limit period in seconds'), class: 'label-bold' = f.number_field :"throttle_authenticated_#{setting_fragment}_period_in_seconds", class: 'form-control gl-form-input' - = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' } + = f.submit _('Save changes'), pajamas_button: true, data: { qa_selector: 'save_changes_button' } diff --git a/app/views/admin/application_settings/_note_limits.html.haml b/app/views/admin/application_settings/_note_limits.html.haml index 40760b3c45e..99cf0ebc669 100644 --- a/app/views/admin/application_settings/_note_limits.html.haml +++ b/app/views/admin/application_settings/_note_limits.html.haml @@ -1,4 +1,4 @@ -= form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-note-limits-settings'), html: { class: 'fieldset-form' } do |f| += gitlab_ui_form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-note-limits-settings'), html: { class: 'fieldset-form' } do |f| = form_errors(@application_setting) %fieldset @@ -12,4 +12,4 @@ = _('List of users who are allowed to exceed the rate limit. Example: username1, username2') - = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' } + = f.submit _('Save changes'), data: { qa_selector: 'save_changes_button' }, pajamas_button: true diff --git a/app/views/admin/application_settings/_outbound.html.haml b/app/views/admin/application_settings/_outbound.html.haml index bacfe056683..3505a3bf3ee 100644 --- a/app/views/admin/application_settings/_outbound.html.haml +++ b/app/views/admin/application_settings/_outbound.html.haml @@ -22,4 +22,4 @@ s_('OutboundRequests|Enforce DNS rebinding attack protection'), help_text: _('OutboundRequests|Resolve IP addresses once and uses them to submit requests.') - = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' } + = f.submit _('Save changes'), pajamas_button: true, data: { qa_selector: 'save_changes_button' } diff --git a/app/views/admin/application_settings/_package_registry.html.haml b/app/views/admin/application_settings/_package_registry.html.haml index 4bdfa5bfe83..3506038ca68 100644 --- a/app/views/admin/application_settings/_package_registry.html.haml +++ b/app/views/admin/application_settings/_package_registry.html.haml @@ -20,12 +20,12 @@ %ul.nav-links.scrolling-tabs.mobile-separator.nav.nav-tabs.mb-3 - @plans.each_with_index do |plan, index| %li - = link_to admin_plan_limits_path(anchor: 'js-package-settings'), data: { target: "div#plan#{index}", action: "plan#{index}", toggle: 'tab'}, class: index == 0 ? 'active': '' do + = link_to admin_plan_limits_path(anchor: 'js-package-settings'), data: { target: "div#plan-package#{index}", action: "plan#{index}", toggle: 'tab'}, class: index == 0 ? 'active': '' do = plan.name.capitalize .tab-content - @plans.each_with_index do |plan, index| - .tab-pane{ :id => "plan#{index}", class: index == 0 ? 'active': '' } - = form_for plan.actual_limits, url: admin_plan_limits_path(anchor: 'js-package-settings'), html: { class: 'fieldset-form' }, method: :post do |f| + .tab-pane{ :id => "plan-package#{index}", class: index == 0 ? 'active': '' } + = gitlab_ui_form_for plan.actual_limits, url: admin_plan_limits_path(anchor: 'js-package-settings'), html: { class: 'fieldset-form' }, method: :post do |f| = form_errors(plan) %fieldset = f.hidden_field(:plan_id, value: plan.id) @@ -53,4 +53,4 @@ .form-group = f.label :generic_packages_max_file_size, _('Generic package file size in bytes'), class: 'label-bold' = f.number_field :generic_packages_max_file_size, class: 'form-control gl-form-input' - = f.submit _('Save %{name} size limits').html_safe % { name: plan.name.capitalize }, class: 'btn gl-button btn-confirm' + = f.submit _('Save %{name} size limits').html_safe % { name: plan.name.capitalize }, pajamas_button: true diff --git a/app/views/admin/application_settings/_pages.html.haml b/app/views/admin/application_settings/_pages.html.haml index cf43d3ddeca..97d9426581e 100644 --- a/app/views/admin/application_settings/_pages.html.haml +++ b/app/views/admin/application_settings/_pages.html.haml @@ -46,4 +46,4 @@ = f.gitlab_ui_checkbox_component :lets_encrypt_terms_of_service_accepted, s_("AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF).").html_safe % { link_start: terms_of_service_link_start, link_end: '</a>'.html_safe } - = f.submit _('Save changes'), class: "gl-button btn btn-confirm" + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_performance.html.haml b/app/views/admin/application_settings/_performance.html.haml index e0ba8d93fbd..86a01e1785e 100644 --- a/app/views/admin/application_settings/_performance.html.haml +++ b/app/views/admin/application_settings/_performance.html.haml @@ -23,4 +23,4 @@ .form-text.text-muted = _('Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3).') - = f.submit _('Save changes'), class: "gl-button btn btn-confirm" + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_performance_bar.html.haml b/app/views/admin/application_settings/_performance_bar.html.haml index 4e37c4c3c98..d4f6d84ea74 100644 --- a/app/views/admin/application_settings/_performance_bar.html.haml +++ b/app/views/admin/application_settings/_performance_bar.html.haml @@ -10,4 +10,4 @@ = f.label :performance_bar_allowed_group_path, _('Allow access to members of the following group'), class: 'label-bold' = f.text_field :performance_bar_allowed_group_path, class: 'form-control gl-form-input', placeholder: 'my-org/my-group', value: @application_setting.performance_bar_allowed_group&.full_path - = f.submit _('Save changes'), class: 'gl-button btn btn-confirm qa-save-changes-button' + = f.submit _('Save changes'), pajamas_button: true, data: { qa_selector: 'save_changes_button' } diff --git a/app/views/admin/application_settings/_pipeline_limits.html.haml b/app/views/admin/application_settings/_pipeline_limits.html.haml index e93823172db..b7dffe63777 100644 --- a/app/views/admin/application_settings/_pipeline_limits.html.haml +++ b/app/views/admin/application_settings/_pipeline_limits.html.haml @@ -6,4 +6,4 @@ = f.label :pipeline_limit_per_project_user_sha, _('Maximum number of requests per minute') = f.number_field :pipeline_limit_per_project_user_sha, class: 'form-control gl-form-input' - = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' } + = f.submit _('Save changes'), data: { qa_selector: 'save_changes_button' }, pajamas_button: true diff --git a/app/views/admin/application_settings/_prometheus.html.haml b/app/views/admin/application_settings/_prometheus.html.haml index 982531e9a2f..3db1272c77b 100644 --- a/app/views/admin/application_settings/_prometheus.html.haml +++ b/app/views/admin/application_settings/_prometheus.html.haml @@ -18,4 +18,4 @@ .form-text.text-muted Only track method calls that take longer to complete than the given duration. - = f.submit _('Save changes'), class: "gl-button btn btn-confirm" + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_protected_paths.html.haml b/app/views/admin/application_settings/_protected_paths.html.haml index 1f3f67c71c7..3a7a951d137 100644 --- a/app/views/admin/application_settings/_protected_paths.html.haml +++ b/app/views/admin/application_settings/_protected_paths.html.haml @@ -21,4 +21,4 @@ - relative_url_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: relative_url_link } = _('All paths are relative to the GitLab URL. Do not include %{relative_url_link_start}relative URLs%{relative_url_link_end}.').html_safe % { relative_url_link_start: relative_url_link_start, relative_url_link_end: '</a>'.html_safe } - = f.submit _('Save changes'), class: 'gl-button btn btn-confirm' + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_registry.html.haml b/app/views/admin/application_settings/_registry.html.haml index 856db32e088..6a8ef86a56e 100644 --- a/app/views/admin/application_settings/_registry.html.haml +++ b/app/views/admin/application_settings/_registry.html.haml @@ -34,4 +34,4 @@ = f.gitlab_ui_checkbox_component :container_registry_expiration_policies_caching, _("Enable container expiration caching."), help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link } - = f.submit _('Save changes'), class: "gl-button btn btn-confirm" + = f.submit _('Save changes'), pajamas_button: true 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 dad8d5f3fae..869f26ceb10 100644 --- a/app/views/admin/application_settings/_repository_mirrors_form.html.haml +++ b/app/views/admin/application_settings/_repository_mirrors_form.html.haml @@ -9,4 +9,4 @@ = render_if_exists 'admin/application_settings/mirror_settings', form: f - = f.submit _('Save changes'), class: "gl-button btn btn-confirm" + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_repository_storage.html.haml b/app/views/admin/application_settings/_repository_storage.html.haml index 9e7f2812d64..12dd8816783 100644 --- a/app/views/admin/application_settings/_repository_storage.html.haml +++ b/app/views/admin/application_settings/_repository_storage.html.haml @@ -27,4 +27,4 @@ = storage_form.text_field storage, class: 'form-text-input' = storage_form.label storage, storage, class: 'label-bold form-check-label' %br - = f.submit _('Save changes'), class: "gl-button btn btn-confirm" + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_sentry.html.haml b/app/views/admin/application_settings/_sentry.html.haml index cfd34f6ca15..20164cfe88d 100644 --- a/app/views/admin/application_settings/_sentry.html.haml +++ b/app/views/admin/application_settings/_sentry.html.haml @@ -17,4 +17,4 @@ = f.label :sentry_environment, _('Environment'), class: 'label-light' = f.text_field :sentry_environment, class: 'form-control gl-form-input', placeholder: Rails.env - = f.submit _('Save changes'), class: 'gl-button btn btn-confirm' + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_sidekiq_job_limits.html.haml b/app/views/admin/application_settings/_sidekiq_job_limits.html.haml index eaf4bbf4702..068a8155450 100644 --- a/app/views/admin/application_settings/_sidekiq_job_limits.html.haml +++ b/app/views/admin/application_settings/_sidekiq_job_limits.html.haml @@ -1,4 +1,4 @@ -= form_for @application_setting, url: preferences_admin_application_settings_path(anchor: 'js-sidekiq-job-limits-settings'), html: { class: 'fieldset-form' } do |f| += gitlab_ui_form_for @application_setting, url: preferences_admin_application_settings_path(anchor: 'js-sidekiq-job-limits-settings'), html: { class: 'fieldset-form' } do |f| = form_errors(@application_setting) %fieldset @@ -18,4 +18,4 @@ .form-text.text-muted = _("Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs.") - = f.submit _('Save changes'), class: "gl-button btn btn-confirm" + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_signin.html.haml b/app/views/admin/application_settings/_signin.html.haml index 48f0b9b2c31..3e2551d753a 100644 --- a/app/views/admin/application_settings/_signin.html.haml +++ b/app/views/admin/application_settings/_signin.html.haml @@ -55,4 +55,4 @@ = f.label :sign_in_text, _('Sign-in text'), class: 'label-bold' = f.text_area :sign_in_text, class: 'form-control gl-form-input', rows: 4 %span.form-text.text-muted#home_help_block= _("Add text to the sign-in page. Markdown enabled.") - = f.submit _('Save changes'), class: "gl-button btn btn-confirm" + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_snowplow.html.haml b/app/views/admin/application_settings/_snowplow.html.haml index 8684b909853..4e7d9b8ab21 100644 --- a/app/views/admin/application_settings/_snowplow.html.haml +++ b/app/views/admin/application_settings/_snowplow.html.haml @@ -31,4 +31,4 @@ .form-text.text-muted = _('The Snowplow cookie domain.') - = f.submit _('Save changes'), class: 'gl-button btn btn-confirm', data: { qa_selector: 'save_changes_button' } + = f.submit _('Save changes'), data: { qa_selector: 'save_changes_button' }, pajamas_button: true diff --git a/app/views/admin/application_settings/_sourcegraph.html.haml b/app/views/admin/application_settings/_sourcegraph.html.haml index 9e99b496ad0..b56ca12baec 100644 --- a/app/views/admin/application_settings/_sourcegraph.html.haml +++ b/app/views/admin/application_settings/_sourcegraph.html.haml @@ -29,4 +29,4 @@ = f.text_field :sourcegraph_url, class: 'form-control gl-form-input', placeholder: s_('SourcegraphAdmin|https://sourcegraph.example.com') .form-text.text-muted = s_('SourcegraphAdmin|Configure the URL to a Sourcegraph instance which can read your GitLab projects.') - = f.submit s_('SourcegraphAdmin|Save changes'), class: 'gl-button btn btn-confirm' + = f.submit s_('SourcegraphAdmin|Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_terms.html.haml b/app/views/admin/application_settings/_terms.html.haml index a4b6e061c43..8da441d5245 100644 --- a/app/views/admin/application_settings/_terms.html.haml +++ b/app/views/admin/application_settings/_terms.html.haml @@ -11,4 +11,4 @@ .form-text.text-muted = _("Markdown supported.") = link_to _('What is Markdown?'), help_page_path('user/markdown.md'), target: '_blank', rel: 'noopener noreferrer' - = f.submit _("Save changes"), class: "gl-button btn btn-confirm" + = f.submit _("Save changes"), pajamas_button: true diff --git a/app/views/admin/application_settings/_third_party_offers.html.haml b/app/views/admin/application_settings/_third_party_offers.html.haml index 20a60ac870a..ed809c6db52 100644 --- a/app/views/admin/application_settings/_third_party_offers.html.haml +++ b/app/views/admin/application_settings/_third_party_offers.html.haml @@ -16,4 +16,4 @@ = f.gitlab_ui_checkbox_component :hide_third_party_offers, _('Do not display content for customer experience improvement and offers from third parties') - = f.submit _('Save changes'), class: "gl-button btn btn-confirm" + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_usage.html.haml b/app/views/admin/application_settings/_usage.html.haml index 046b59dbd18..2eda3eab8c7 100644 --- a/app/views/admin/application_settings/_usage.html.haml +++ b/app/views/admin/application_settings/_usage.html.haml @@ -50,4 +50,4 @@ %li = s_('AdminSettings|Restrict group access by IP address. %{link_start}Learn more%{link_end}.').html_safe % { link_start: restrict_ip_link, link_end: link_end } - = f.submit _('Save changes'), class: "gl-button btn btn-confirm" + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/_user_restrictions.html.haml b/app/views/admin/application_settings/_user_restrictions.html.haml new file mode 100644 index 00000000000..de8faa6705f --- /dev/null +++ b/app/views/admin/application_settings/_user_restrictions.html.haml @@ -0,0 +1,6 @@ +- form = local_assigns.fetch(:form) + +.form-group + = label_tag _('User restrictions') + = render_if_exists 'admin/application_settings/updating_name_disabled_for_users', form: form + = form.gitlab_ui_checkbox_component :can_create_group, _("Allow users to create top-level groups") diff --git a/app/views/admin/application_settings/_users_api_limits.html.haml b/app/views/admin/application_settings/_users_api_limits.html.haml index 3918c76b12c..ca6f1113c4a 100644 --- a/app/views/admin/application_settings/_users_api_limits.html.haml +++ b/app/views/admin/application_settings/_users_api_limits.html.haml @@ -1,4 +1,4 @@ -= form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-users-api-limits-settings'), html: { class: 'fieldset-form' } do |f| += gitlab_ui_form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-users-api-limits-settings'), html: { class: 'fieldset-form' } do |f| = form_errors(@application_setting) %fieldset @@ -11,4 +11,4 @@ .form-text.text-muted{ id: 'users-api-limit-users-allowlist-field-description' } = _('List of users who are allowed to exceed the rate limit. Example: username1, username2') - = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' } + = f.submit _('Save changes'), data: { qa_selector: 'save_changes_button' }, pajamas_button: true diff --git a/app/views/admin/application_settings/_whats_new.html.haml b/app/views/admin/application_settings/_whats_new.html.haml index 3248969ca16..986402ad5f1 100644 --- a/app/views/admin/application_settings/_whats_new.html.haml +++ b/app/views/admin/application_settings/_whats_new.html.haml @@ -5,4 +5,4 @@ .gl-mb-4 = f.gitlab_ui_radio_component :whats_new_variant, variant, whats_new_variants_label(variant), help_text: whats_new_variants_description(variant) - = f.submit _('Save changes'), class: "gl-button btn btn-confirm" + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/admin/application_settings/appearances/preview_sign_in.html.haml b/app/views/admin/application_settings/appearances/preview_sign_in.html.haml index 2e4ab714048..1c2350e2835 100644 --- a/app/views/admin/application_settings/appearances/preview_sign_in.html.haml +++ b/app/views/admin/application_settings/appearances/preview_sign_in.html.haml @@ -9,5 +9,5 @@ = label_tag :password = password_field_tag :password, nil, disabled: true, class: "form-control gl-form-input bottom", title: title .form-group - = button_tag _("Sign in"), disabled: true, class: "btn gl-button btn-confirm", type: "button", title: title - + = render Pajamas::ButtonComponent.new(variant: :confirm, disabled: true, button_options: { title: title }) do + = _("Sign in") diff --git a/app/views/admin/application_settings/ci_cd.html.haml b/app/views/admin/application_settings/ci_cd.html.haml index f0f7e6868da..b7244c45871 100644 --- a/app/views/admin/application_settings/ci_cd.html.haml +++ b/app/views/admin/application_settings/ci_cd.html.haml @@ -10,7 +10,7 @@ %p.settings-message.text-center - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('ci/variables/index', anchor: 'protected-cicd-variables') } = s_('Environment variables on this GitLab instance are configured to be %{link_start}protected%{link_end} by default.').html_safe % { link_start: link_start, link_end: '</a>'.html_safe } - #js-instance-variables{ data: { endpoint: admin_ci_variables_path, group: 'true', maskable_regex: ci_variable_maskable_regex, protected_by_default: ci_variable_protected_by_default?.to_s} } + #js-instance-variables{ data: { endpoint: admin_ci_variables_path, maskable_regex: ci_variable_maskable_regex, protected_by_default: ci_variable_protected_by_default?.to_s} } %section.settings.as-ci-cd.no-animate#js-ci-cd-settings{ class: ('expanded' if expanded_by_default?) } .settings-header @@ -38,12 +38,11 @@ .settings-content = render 'registry' -- if Feature.enabled?(:runner_registration_control) - %section.settings.as-runner.no-animate#js-runner-settings{ class: ('expanded' if expanded_by_default?) } - .settings-header - %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only - = s_('Runners|Runner registration') - = render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do - = expanded_by_default? ? 'Collapse' : 'Expand' - .settings-content - = render 'runner_registrars_form' +%section.settings.as-runner.no-animate#js-runner-settings{ class: ('expanded' if expanded_by_default?) } + .settings-header + %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only + = s_('Runners|Runner registration') + = render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do + = expanded_by_default? ? 'Collapse' : 'Expand' + .settings-content + = render 'runner_registrars_form' diff --git a/app/views/admin/application_settings/general.html.haml b/app/views/admin/application_settings/general.html.haml index cd63873a893..ec5d1ef4a34 100644 --- a/app/views/admin/application_settings/general.html.haml +++ b/app/views/admin/application_settings/general.html.haml @@ -24,6 +24,8 @@ .settings-content = render 'account_and_limit' += render_if_exists 'admin/application_settings/free_user_cap' + %section.settings.as-diff-limits.no-animate#js-merge-request-settings{ class: ('expanded' if expanded_by_default?) } .settings-header %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only @@ -102,7 +104,7 @@ = f.gitlab_ui_checkbox_component :web_ide_clientside_preview_enabled, s_('IDE|Live Preview'), help_text: s_('Preview JavaScript projects in the Web IDE with CodeSandbox Live Preview. %{link_start}Learn more.%{link_end} ').html_safe % { link_start: link_start, link_end: '</a>'.html_safe } - = f.submit _('Save changes'), class: "gl-button btn btn-confirm" + = f.submit _('Save changes'), pajamas_button: true = render_if_exists 'admin/application_settings/maintenance_mode_settings_form' = render 'admin/application_settings/gitpod' diff --git a/app/views/admin/application_settings/service_usage_data.html.haml b/app/views/admin/application_settings/service_usage_data.html.haml index 25c8bd12345..06bb9df84c4 100644 --- a/app/views/admin/application_settings/service_usage_data.html.haml +++ b/app/views/admin/application_settings/service_usage_data.html.haml @@ -5,25 +5,26 @@ - @content_class = "limit-container-width" unless fluid_layout - payload_class = 'js-service-ping-payload' -%h3= name +%section.js-search-settings-section + %h3= name -- if @service_ping_data_present - = render Pajamas::ButtonComponent.new(button_options: { class: 'js-payload-preview-trigger gl-mr-2', data: { payload_selector: ".#{payload_class}" } } ) do - = gl_loading_icon(css_class: 'js-spinner gl-display-none', inline: true) - %span.js-text.gl-display-inline= _('Preview payload') - = render Pajamas::ButtonComponent.new(button_options: { class: 'js-payload-download-trigger gl-mr-2', data: { endpoint: usage_data_admin_application_settings_path(format: :json) } } ) do - = gl_loading_icon(css_class: 'js-spinner gl-display-none', inline: true) - %span.js-text.gl-display-inline= _('Download payload') - %pre.js-syntax-highlight.code.highlight.gl-mt-2.gl-display-none{ class: payload_class, data: { endpoint: usage_data_admin_application_settings_path(format: :html) } } -- else - = render Pajamas::AlertComponent.new(variant: :warning, - dismissible: false, - title: _('Service Ping payload not found in the application cache')) do |c| + - if @service_ping_data_present + = render Pajamas::ButtonComponent.new(button_options: { class: 'js-payload-preview-trigger gl-mr-2', data: { payload_selector: ".#{payload_class}" } } ) do + = gl_loading_icon(css_class: 'js-spinner gl-display-none', inline: true) + %span.js-text.gl-display-inline= _('Preview payload') + = render Pajamas::ButtonComponent.new(button_options: { class: 'js-payload-download-trigger gl-mr-2', data: { endpoint: usage_data_admin_application_settings_path(format: :json) } } ) do + = gl_loading_icon(css_class: 'js-spinner gl-display-none', inline: true) + %span.js-text.gl-display-inline= _('Download payload') + %pre.js-syntax-highlight.code.highlight.gl-mt-2.gl-display-none{ class: payload_class, data: { endpoint: usage_data_admin_application_settings_path(format: :html) } } + - else + = render Pajamas::AlertComponent.new(variant: :warning, + dismissible: false, + title: _('Service Ping payload not found in the application cache')) do |c| - = c.body do - - enable_service_ping_link_url = help_page_path('user/admin_area/settings/usage_statistics', anchor: 'enable-or-disable-usage-statistics') - - enable_service_ping_link = '<a href="%{url}">'.html_safe % { url: enable_service_ping_link_url } - - generate_manually_link_url = help_page_path('administration/troubleshooting/gitlab_rails_cheat_sheet', anchor: 'generate-service-ping') - - generate_manually_link = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: generate_manually_link_url } + = c.body do + - enable_service_ping_link_url = help_page_path('user/admin_area/settings/usage_statistics', anchor: 'enable-or-disable-usage-statistics') + - enable_service_ping_link = '<a href="%{url}">'.html_safe % { url: enable_service_ping_link_url } + - generate_manually_link_url = help_page_path('administration/troubleshooting/gitlab_rails_cheat_sheet', anchor: 'generate-service-ping') + - generate_manually_link = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: generate_manually_link_url } - = html_escape(s_('%{enable_service_ping_link_start}Enable%{link_end} or %{generate_manually_link_start}generate%{link_end} Service Ping to preview and download service usage data payload.')) % { enable_service_ping_link_start: enable_service_ping_link, generate_manually_link_start: generate_manually_link, link_end: '</a>'.html_safe } + = html_escape(s_('%{enable_service_ping_link_start}Enable%{link_end} or %{generate_manually_link_start}generate%{link_end} Service Ping to preview and download service usage data payload.')) % { enable_service_ping_link_start: enable_service_ping_link, generate_manually_link_start: generate_manually_link, link_end: '</a>'.html_safe } diff --git a/app/views/admin/applications/_form.html.haml b/app/views/admin/applications/_form.html.haml index fd73d4c5671..83347034cc5 100644 --- a/app/views/admin/applications/_form.html.haml +++ b/app/views/admin/applications/_form.html.haml @@ -36,5 +36,5 @@ = render 'shared/tokens/scopes_form', prefix: 'doorkeeper_application', token: application, scopes: @scopes, f: f .form-actions - = f.submit _('Save application'), class: "gl-button btn btn-confirm wide" + = f.submit _('Save application'), pajamas_button: true = link_to _('Cancel'), admin_applications_path, class: "gl-button btn btn-default btn-cancel" diff --git a/app/views/admin/background_jobs/show.html.haml b/app/views/admin/background_jobs/show.html.haml index 6d2cab06010..15ce9b692f0 100644 --- a/app/views/admin/background_jobs/show.html.haml +++ b/app/views/admin/background_jobs/show.html.haml @@ -7,5 +7,4 @@ = html_escape(_('GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs')) % { linkStart: sidekiq_link_start, linkEnd: '</a>'.html_safe } %hr -.card.gl-rounded-0 - %iframe{ src: sidekiq_path, width: '100%', height: 970, style: "border: 0" } +%iframe{ src: sidekiq_path, width: '100%', height: 970, style: "border: 0" } diff --git a/app/views/admin/broadcast_messages/_table.html.haml b/app/views/admin/broadcast_messages/_table.html.haml new file mode 100644 index 00000000000..c5cd333f9dd --- /dev/null +++ b/app/views/admin/broadcast_messages/_table.html.haml @@ -0,0 +1,38 @@ +- targeted_broadcast_messages_enabled = Feature.enabled?(:role_targeted_broadcast_messages) + +- if @broadcast_messages.any? + .table-responsive + %table.table.b-table.gl-table + %thead + %tr + %th= _('Status') + %th= _('Preview') + %th= _('Starts') + %th= _('Ends') + - if targeted_broadcast_messages_enabled + %th= _('Target roles') + %th= _('Target Path') + %th= _('Type') + %th + %tbody + - @broadcast_messages.each do |message| + %tr + %td + = broadcast_message_status(message) + %td + = broadcast_message(message, preview: true) + %td + = message.starts_at + %td + = message.ends_at + - if targeted_broadcast_messages_enabled + %td + = target_access_levels_display(message.target_access_levels) + %td + = message.target_path + %td + = message.broadcast_type.capitalize + %td.gl-white-space-nowrap< + = link_to sprite_icon('pencil', css_class: 'gl-icon'), edit_admin_broadcast_message_path(message), title: _('Edit'), class: 'btn btn-icon gl-button' + = link_to sprite_icon('remove', css_class: 'gl-icon'), admin_broadcast_message_path(message), method: :delete, remote: true, title: _('Remove'), class: 'js-remove-tr btn btn-icon gl-button btn-danger gl-ml-3' + = paginate @broadcast_messages, theme: 'gitlab' diff --git a/app/views/admin/broadcast_messages/index.html.haml b/app/views/admin/broadcast_messages/index.html.haml index 46924393a27..7559365e49a 100644 --- a/app/views/admin/broadcast_messages/index.html.haml +++ b/app/views/admin/broadcast_messages/index.html.haml @@ -1,49 +1,30 @@ - breadcrumb_title _("Messages") - page_title _("Broadcast Messages") -- targeted_broadcast_messages_enabled = Feature.enabled?(:role_targeted_broadcast_messages) +- vue_app_enabled = Feature.enabled?(:vue_broadcast_messages, current_user) %h1.page-title.gl-font-size-h-display = _('Broadcast Messages') %p.light = _('Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more.') -= render 'form' - -%br.clearfix - -- if @broadcast_messages.any? - .table-responsive - %table.table.b-table.gl-table - %thead - %tr - %th= _('Status') - %th= _('Preview') - %th= _('Starts') - %th= _('Ends') - - if targeted_broadcast_messages_enabled - %th= _('Target roles') - %th= _('Target Path') - %th= _('Type') - %th - %tbody - - @broadcast_messages.each do |message| - %tr - %td - = broadcast_message_status(message) - %td - = broadcast_message(message, preview: true) - %td - = message.starts_at - %td - = message.ends_at - - if targeted_broadcast_messages_enabled - %td - = target_access_levels_display(message.target_access_levels) - %td - = message.target_path - %td - = message.broadcast_type.capitalize - %td.gl-white-space-nowrap< - = link_to sprite_icon('pencil', css_class: 'gl-icon'), edit_admin_broadcast_message_path(message), title: _('Edit'), class: 'btn btn-icon gl-button' - = link_to sprite_icon('remove', css_class: 'gl-icon'), admin_broadcast_message_path(message), method: :delete, remote: true, title: _('Remove'), class: 'js-remove-tr btn btn-icon gl-button btn-danger gl-ml-3' - = paginate @broadcast_messages, theme: 'gitlab' +- if vue_app_enabled + #js-broadcast-messages{ data: { + page: params[:page] || 1, + messages_count: @broadcast_messages.total_count, + messages: @broadcast_messages.map { |message| { + id: message.id, + status: broadcast_message_status(message), + preview: broadcast_message(message, preview: true), + starts_at: message.starts_at.to_s, + ends_at: message.ends_at.to_s, + target_roles: target_access_levels_display(message.target_access_levels), + target_path: message.target_path, + type: message.broadcast_type.capitalize, + edit_path: edit_admin_broadcast_message_path(message), + delete_path: admin_broadcast_message_path(message) + '.js' + } }.to_json + } } +- else + = render 'form' + %br.clearfix + = render 'table' diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index 271f89a6b08..ccea1714973 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -35,7 +35,7 @@ = link_to(s_('AdminArea|New project'), new_project_path, class: "btn gl-button btn-default") = c.footer do .d-flex.align-items-center - = link_to(s_('AdminArea|View latest projects'), admin_projects_path) + = link_to(s_('AdminArea|View latest projects'), admin_projects_path(sort: 'created_desc')) = sprite_icon('chevron-right', size: 12, css_class: 'gl-text-gray-700 gl-ml-2') .col-md-4.gl-mb-6 = render Pajamas::CardComponent.new(**component_params) do |c| @@ -71,7 +71,7 @@ = link_to(s_('AdminArea|New group'), new_admin_group_path, class: "btn gl-button btn-default") = c.footer do .d-flex.align-items-center - = link_to(s_('AdminArea|View latest groups'), admin_groups_path) + = link_to(s_('AdminArea|View latest groups'), admin_groups_path(sort: 'created_desc')) = sprite_icon('chevron-right', size: 12, css_class: 'gl-text-gray-700 gl-ml-2') .row .col-md-4.gl-mb-6 diff --git a/app/views/admin/deploy_keys/edit.html.haml b/app/views/admin/deploy_keys/edit.html.haml index 12a1c0c3de2..acdf503727d 100644 --- a/app/views/admin/deploy_keys/edit.html.haml +++ b/app/views/admin/deploy_keys/edit.html.haml @@ -3,8 +3,8 @@ %hr %div - = form_for [:admin, @deploy_key], html: { class: 'deploy-key-form' } do |f| + = gitlab_ui_form_for [:admin, @deploy_key], html: { class: 'deploy-key-form' } do |f| = render partial: 'shared/deploy_keys/form', locals: { form: f, deploy_key: @deploy_key } .form-actions - = f.submit _('Save changes'), class: 'btn gl-button btn-confirm' + = f.submit _('Save changes'), pajamas_button: true = link_to _('Cancel'), admin_deploy_keys_path, class: 'btn gl-button btn-default btn-cancel' diff --git a/app/views/admin/deploy_keys/new.html.haml b/app/views/admin/deploy_keys/new.html.haml index 74882900756..a03d6cb5a94 100644 --- a/app/views/admin/deploy_keys/new.html.haml +++ b/app/views/admin/deploy_keys/new.html.haml @@ -3,8 +3,9 @@ %hr %div - = form_for [:admin, @deploy_key], html: { class: 'deploy-key-form' } do |f| + = gitlab_ui_form_for [:admin, @deploy_key], html: { class: 'deploy-key-form' } do |f| = render partial: 'shared/deploy_keys/form', locals: { form: f, deploy_key: @deploy_key } .form-actions - = f.submit 'Create', class: 'btn gl-button btn-confirm', data: { qa_selector: "add_deploy_key_button" } - = link_to _('Cancel'), admin_deploy_keys_path, class: 'btn gl-button btn-default btn-cancel' + = f.submit 'Create', data: { qa_selector: "add_deploy_key_button" }, pajamas_button: true + = render Pajamas::ButtonComponent.new(href: admin_deploy_keys_path) do + = _('Cancel') diff --git a/app/views/admin/groups/_form.html.haml b/app/views/admin/groups/_form.html.haml index 69e9e4260b4..7adba0d023b 100644 --- a/app/views/admin/groups/_form.html.haml +++ b/app/views/admin/groups/_form.html.haml @@ -35,10 +35,10 @@ = c.body do = render 'shared/group_tips' .gl-mt-5 - = f.submit _('Create group'), class: "gl-button btn btn-confirm" + = f.submit _('Create group'), pajamas_button: true = link_to _('Cancel'), admin_groups_path, class: "gl-button btn btn-default btn-cancel" - else .gl-mt-5 - = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' } + = f.submit _('Save changes'), data: { qa_selector: 'save_changes_button' }, pajamas_button: true = link_to _('Cancel'), admin_group_path(@group), class: "gl-button btn btn-cancel" diff --git a/app/views/admin/groups/_group.html.haml b/app/views/admin/groups/_group.html.haml index c27ff348f59..a1afb1ddbfa 100644 --- a/app/views/admin/groups/_group.html.haml +++ b/app/views/admin/groups/_group.html.haml @@ -1,7 +1,6 @@ - group = local_assigns.fetch(:group) -- css_class = "gl-display-flex!#{' no-description' if group.description.blank?}" -%li.group-row.gl-py-3.gl-align-items-center{ class: css_class, data: { qa_selector: 'group_row_content' } } +%li.group-row.gl-py-3.gl-align-items-center{ class: 'gl-display-flex!', data: { qa_selector: 'group_row_content' } } .avatar-container.rect-avatar.s40.gl-flex-shrink-0 = group_icon(group, class: "avatar s40") diff --git a/app/views/admin/groups/show.html.haml b/app/views/admin/groups/show.html.haml index a57d3170cbd..6d370919460 100644 --- a/app/views/admin/groups/show.html.haml +++ b/app/views/admin/groups/show.html.haml @@ -13,123 +13,112 @@ %hr .row .col-md-6 - .card - .card-header + = render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-5' }, body_options: { class: 'gl-p-0' }) do |c| + - c.header do = _('Group info:') - %ul.content-list - %li - .avatar-container.rect-avatar.s60 - = group_icon(@group, class: "avatar s60") - %li - %span.light= _('Name:') - %strong - = link_to @group.name, group_path(@group) - %li - %span.light= _('Path:') - %strong - = @group.path - - %li - %span.light= _('Description:') - %strong - = @group.description - - %li - %span.light= _('Visibility level:') - %strong - = visibility_level_label(@group.visibility_level) - - %li - %span.light= _('Created on:') - %strong - = @group.created_at.to_s(:medium) - - %li - %span.light= _('ID:') - %strong - = @group.id - - = render_if_exists 'admin/namespace_plan_info', namespace: @group - - %li - = render 'shared/storage_counter_statistics', storage_size: @group.storage_size, storage_details: @group - - %li - %span.light= _('Group Git LFS status:') - %strong - = group_lfs_status(@group) - = link_to sprite_icon('question-o'), help_page_path('topics/git/lfs/index') - - = render_if_exists 'namespaces/shared_runner_status', namespace: @group - = render_if_exists 'namespaces/additional_minutes_status', namespace: @group + - c.body do + %ul.content-list.content-list-items-padding + %li + .avatar-container.rect-avatar.s60 + = group_icon(@group, class: "avatar s60") + %li + %span.light= _('Name:') + %strong + = link_to @group.name, group_path(@group) + %li + %span.light= _('Path:') + %strong + = @group.path + + %li + %span.light= _('Description:') + %strong + = @group.description + + %li + %span.light= _('Visibility level:') + %strong + = visibility_level_label(@group.visibility_level) + + %li + %span.light= _('Created on:') + %strong + = @group.created_at.to_s(:medium) + + %li + %span.light= _('ID:') + %strong + = @group.id + + = render_if_exists 'admin/namespace_plan_info', namespace: @group + + %li + = render 'shared/storage_counter_statistics', storage_size: @group.storage_size, storage_details: @group + + %li + %span.light= _('Group Git LFS status:') + %strong + = group_lfs_status(@group) + = link_to sprite_icon('question-o'), help_page_path('topics/git/lfs/index') + + = render_if_exists 'namespaces/shared_runner_status', namespace: @group + = render_if_exists 'namespaces/additional_minutes_status', namespace: @group = render 'shared/custom_attributes', custom_attributes: @group.custom_attributes = render_if_exists 'ldap_group_links/ldap_group_links_show', group: @group - .card - .card-header + = render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-5' }, body_options: { class: 'gl-p-0' }) do |c| + - c.header do = _('Projects') = gl_badge_tag @group.projects.count - %ul.content-list - - @projects.each do |project| - %li - %strong - = link_to project.full_name, [:admin, project] - = gl_badge_tag storage_counter(project.statistics.storage_size) - %span.float-right.light - %span.monospace= project.full_path + '.git' - - unless @projects.size < Kaminari.config.default_per_page - .card-footer - = paginate @projects, param_name: 'projects_page', theme: 'gitlab' - - - shared_projects = @group.shared_projects.sort_by(&:name) - - unless shared_projects.empty? - .card - .card-header - = _('Projects shared with %{group_name}') % { group_name: @group.name } - = gl_badge_tag shared_projects.size - %ul.content-list - - shared_projects.each do |project| + - c.body do + %ul.content-list.content-list-items-padding + - @projects.each do |project| %li %strong = link_to project.full_name, [:admin, project] = gl_badge_tag storage_counter(project.statistics.storage_size) %span.float-right.light %span.monospace= project.full_path + '.git' + - unless @projects.size < Kaminari.config.default_per_page + - c.footer do + = paginate @projects, param_name: 'projects_page', theme: 'gitlab' + + - shared_projects = @group.shared_projects.sort_by(&:name) + - unless shared_projects.empty? + = render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-5' }, body_options: { class: 'gl-p-0' }) do |c| + - c.header do + = _('Projects shared with %{group_name}') % { group_name: @group.name } + = gl_badge_tag shared_projects.size + - c.body do + %ul.content-list.content-list-items-padding + - shared_projects.each do |project| + %li + %strong + = link_to project.full_name, [:admin, project] + = gl_badge_tag storage_counter(project.statistics.storage_size) + %span.float-right.light + %span.monospace= project.full_path + '.git' .col-md-6 = render 'shared/admin/admin_note' - if can?(current_user, :admin_group_member, @group) - .card - .card-header - = _('Add user(s) to the group:') - .card-body.form-holder - %p.light - - help_link_open = '<strong><a href="%{help_url}">'.html_safe % { help_url: help_page_url("user/permissions") } - = html_escape(_('Read more about project permissions %{help_link_open}here%{help_link_close}')) % { help_link_open: help_link_open, help_link_close: '</a></strong>'.html_safe } - - = form_tag admin_group_members_update_path(@group), id: "new_project_member", class: "bulk_import", method: :put do - %div - = users_select_tag(:user_id, multiple: true, email_user: true, skip_ldap: @group.ldap_synced?, scope: :all) - .gl-mt-3 - = select_tag :access_level, options_for_select(@group.access_level_roles), class: "project-access-select select2" - %hr - = button_tag _('Add users to group'), class: "gl-button btn btn-confirm" = render 'shared/members/requests', membership_source: @group, group: @group, requesters: @requesters, force_mobile_view: true - .card - .card-header + = render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-5' }, body_options: { class: 'gl-p-0' }) do |c| + - c.header do = html_escape(_("%{group_name} group members")) % { group_name: "<strong>#{html_escape(@group.name)}</strong>".html_safe } = gl_badge_tag @group.users_count = render 'shared/members/manage_access_button', path: group_group_members_path(@group) - %ul.content-list.group-users-list.content-list.members-list - = render partial: 'shared/members/member', - collection: @members, as: :member, - locals: { membership_source: @group, - group: @group, - current_user_is_group_owner: current_user_is_group_owner } + - c.body do + %ul.content-list.group-users-list.members-list + = render partial: 'shared/members/member', + collection: @members, as: :member, + locals: { membership_source: @group, + group: @group, + current_user_is_group_owner: current_user_is_group_owner } - unless @members.size < Kaminari.config.default_per_page - .card-footer + - c.footer do = paginate @members, param_name: 'members_page', theme: 'gitlab' diff --git a/app/views/admin/hooks/edit.html.haml b/app/views/admin/hooks/edit.html.haml index 224afbff39a..14d37b77a41 100644 --- a/app/views/admin/hooks/edit.html.haml +++ b/app/views/admin/hooks/edit.html.haml @@ -11,7 +11,7 @@ = gitlab_ui_form_for @hook, as: :hook, url: admin_hook_path do |f| = render partial: 'form', locals: { form: f, hook: @hook } .form-actions - %span>= f.submit _('Save changes'), class: 'btn gl-button btn-confirm gl-mr-3' + %span>= f.submit _('Save changes'), class: 'gl-mr-3', pajamas_button: true = render 'shared/web_hooks/test_button', hook: @hook = link_to _('Delete'), admin_hook_path(@hook), method: :delete, class: 'btn gl-button btn-danger float-right', aria: { label: s_('Webhooks|Delete webhook') }, data: { confirm: s_('Webhooks|Are you sure you want to delete this webhook?'), confirm_btn_variant: 'danger' } diff --git a/app/views/admin/hooks/index.html.haml b/app/views/admin/hooks/index.html.haml index f23d77c8da5..d4aeb8dc7e8 100644 --- a/app/views/admin/hooks/index.html.haml +++ b/app/views/admin/hooks/index.html.haml @@ -7,7 +7,7 @@ .col-lg-8.gl-mb-3 = gitlab_ui_form_for @hook, as: :hook, url: admin_hooks_path do |f| = render partial: 'form', locals: { form: f, hook: @hook } - = f.submit _('Add system hook'), class: 'btn gl-button btn-confirm' + = f.submit _('Add system hook'), pajamas_button: true = render 'shared/web_hooks/index', hooks: @hooks, hook_class: @hook.class diff --git a/app/views/admin/impersonation_tokens/index.html.haml b/app/views/admin/impersonation_tokens/index.html.haml index 2c526bb38d8..8cf1d8555ce 100644 --- a/app/views/admin/impersonation_tokens/index.html.haml +++ b/app/views/admin/impersonation_tokens/index.html.haml @@ -8,12 +8,10 @@ .row.gl-mt-3 .col-lg-12 - - if @new_impersonation_token - = render 'shared/access_tokens/created_container', - type: type, - new_token_value: @new_impersonation_token + #js-new-access-token-app{ data: { access_token_type: type } } = render 'shared/access_tokens/form', + ajax: true, type: type, title: _('Add an impersonation token'), path: admin_user_impersonation_tokens_path, @@ -22,9 +20,4 @@ scopes: @scopes, help_path: help_page_path('api/index', anchor: '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) } + #js-access-token-table-app{ data: { access_token_type: type, access_token_type_plural: type_plural, initial_active_access_tokens: @active_impersonation_tokens.to_json, information: _("To see all the user's personal access tokens you must impersonate them first.") } } diff --git a/app/views/admin/projects/_projects.html.haml b/app/views/admin/projects/_projects.html.haml index f56b77813b5..c7c30673d74 100644 --- a/app/views/admin/projects/_projects.html.haml +++ b/app/views/admin/projects/_projects.html.haml @@ -1,32 +1,33 @@ .js-projects-list-holder - if @projects.any? - %ul.projects-list.content-list.admin-projects + %ul.content-list - @projects.each do |project| - %li.project-row{ class: ('no-description' if project.description.blank?) } - .controls - = link_to _('Edit'), edit_project_path(project), id: "edit_#{dom_id(project)}", class: "btn gl-button btn-default" - %button.delete-project-button.gl-button.btn.btn-danger{ data: { delete_project_url: admin_project_path(project), project_name: project.name } } - = s_('AdminProjects|Delete') + %li.project-row.gl-align-items-center{ class: 'gl-display-flex!' } + .avatar-container.rect-avatar.s40.gl-flex-shrink-0 + = project_icon(project, alt: '', class: 'avatar project-avatar s40', width: 40, height: 40) + .gl-min-w-0.gl-flex-grow-1 + .title + = link_to(admin_project_path(project)) do + %span.project-full-name + %span.namespace-name + - if project.namespace + = project.namespace.human_name + \/ + %span.project-name + = project.name - .stats + - if project.description.present? + .description + = markdown_field(project, :description) + .stats.gl-text-gray-500.gl-flex-shrink-0.gl-display-none.gl-sm-display-flex = gl_badge_tag storage_counter(project.statistics&.storage_size) = render_if_exists 'admin/projects/archived', project: project - .title - = link_to(admin_project_path(project)) do - .dash-project-avatar - .avatar-container.rect-avatar.s40 - = project_icon(project, alt: '', class: 'avatar project-avatar s40', width: 40, height: 40) - %span.project-full-name - %span.namespace-name - - if project.namespace - = project.namespace.human_name - \/ - %span.project-name - = project.name - - if project.description.present? - .description - = markdown_field(project, :description) + .controls.gl-flex-shrink-0.gl-ml-5 + = render Pajamas::ButtonComponent.new(href: edit_project_path(project), button_options: { id: dom_id(project, :edit) }) do + = s_('Edit') + = render Pajamas::ButtonComponent.new(variant: :danger, button_options: { class: 'delete-project-button', data: { delete_project_url: admin_project_path(project), project_name: project.name } } ) do + = s_('AdminProjects|Delete') = paginate @projects, theme: 'gitlab' - else diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml index eabb7e51227..a60c3996cf2 100644 --- a/app/views/admin/projects/show.html.haml +++ b/app/views/admin/projects/show.html.haml @@ -2,7 +2,6 @@ - add_to_breadcrumbs _("Projects"), admin_projects_path - breadcrumb_title @project.full_name - page_title @project.full_name, _("Projects") -- @content_class = "admin-projects" - current_user_is_group_owner = @group && @group.has_owner?(current_user) %h1.page-title.gl-font-size-h-display diff --git a/app/views/admin/users/_projects.html.haml b/app/views/admin/users/_projects.html.haml index a9f5c560b41..3ccf3ef4f2a 100644 --- a/app/views/admin/users/_projects.html.haml +++ b/app/views/admin/users/_projects.html.haml @@ -1,13 +1,17 @@ - if local_assigns.has_key?(:contributed_projects) && contributed_projects.present? - .card.contributed-projects - .card-header= _('Projects contributed to') - = render 'shared/projects/list', - projects: contributed_projects.sort_by(&:star_count).reverse, - projects_limit: 5, stars: true, avatar: false + = render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-5' }, body_options: { class: 'gl-py-0' }) do |c| + - c.header do + = _('Projects contributed to') + - c.body do + = render 'shared/projects/list', + projects: contributed_projects.sort_by(&:star_count).reverse, + projects_limit: 5, stars: true, avatar: false - if local_assigns.has_key?(:projects) && projects.present? - .card - .card-header= _('Personal projects') - = render 'shared/projects/list', - projects: projects.sort_by(&:star_count).reverse, - projects_limit: 10, stars: true, avatar: false + = render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-5' }, body_options: { class: 'gl-py-0' }) do |c| + - c.header do + = _('Personal projects') + - c.body do + = render 'shared/projects/list', + projects: projects.sort_by(&:star_count).reverse, + projects_limit: 10, stars: true, avatar: false diff --git a/app/views/admin/users/_user_detail_note.html.haml b/app/views/admin/users/_user_detail_note.html.haml index cc4827327c9..c8625833a70 100644 --- a/app/views/admin/users/_user_detail_note.html.haml +++ b/app/views/admin/users/_user_detail_note.html.haml @@ -1,7 +1,7 @@ - if @user.note.present? - text = @user.note - .card - .card-header + = render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-5' }, body_options: { class: 'gl-pb-0'}) do |c| + - c.header do = _('Admin Note') - .card-body + - c.body do %p= text diff --git a/app/views/admin/users/projects.html.haml b/app/views/admin/users/projects.html.haml index 2f6c08f123e..ff87cf8f866 100644 --- a/app/views/admin/users/projects.html.haml +++ b/app/views/admin/users/projects.html.haml @@ -4,20 +4,22 @@ = render 'admin/users/head' - if @user.groups.any? - .card - .card-header= _('Groups') - %ul.hover-list - - @user.group_members.includes(:source).each do |group_member| # rubocop: disable CodeReuse/ActiveRecord - - group = group_member.group - %li.group_member - %strong= link_to group.name, admin_group_path(group) - – access to - #{pluralize(group.projects.count, 'project')} - .float-right - %span.light.vertical-align-middle= group_member.human_access - - unless group_member.owner? - = link_to group_group_member_path(group, group_member), data: { confirm: remove_member_message(group_member), confirm_btn_variant: 'danger', testid: 'remove-user' }, aria: { label: _('Remove') }, method: :delete, remote: true, class: "btn btn-sm btn-danger gl-button btn-icon gl-ml-3", title: _('Remove user from group') do - = sprite_icon('remove', size: 16, css_class: 'gl-icon') + = render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-5' }, body_options: { class: 'gl-py-0 gl-px-0'}) do |c| + - c.header do + = _('Groups') + - c.body do + %ul.hover-list + - @user.group_members.includes(:source).each do |group_member| # rubocop: disable CodeReuse/ActiveRecord + - group = group_member.group + %li.group_member + %strong= link_to group.name, admin_group_path(group) + – access to + #{pluralize(group.projects.count, 'project')} + .float-right + %span.light.vertical-align-middle= group_member.human_access + - unless group_member.owner? + = link_to group_group_member_path(group, group_member), data: { confirm: remove_member_message(group_member), confirm_btn_variant: 'danger', testid: 'remove-user' }, aria: { label: _('Remove') }, method: :delete, remote: true, class: "btn btn-sm btn-danger gl-button btn-icon gl-ml-3", title: _('Remove user from group') do + = sprite_icon('remove', size: 16, css_class: 'gl-icon') .row .col-md-6 @@ -28,23 +30,25 @@ .col-md-6 - .card - .card-header= _('Joined projects (%{projects_count})') % { projects_count: @joined_projects.count } - %ul.hover-list - - @joined_projects.sort_by(&:full_name).each do |project| - - member = project.team.find_member(@user.id) - %li.project_member - .list-item-name - = link_to admin_project_path(project), class: dom_class(project) do - = project.full_name + = render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-5' }, body_options: { class: 'gl-py-0 gl-px-0'}) do |c| + - c.header do + = _('Joined projects (%{projects_count})') % { projects_count: @joined_projects.count } + - c.body do + %ul.hover-list + - @joined_projects.sort_by(&:full_name).each do |project| + - member = project.team.find_member(@user.id) + %li.project_member + .list-item-name + = link_to admin_project_path(project), class: dom_class(project) do + = project.full_name - - if member - .float-right - - if member.owner? - %span.light= _('Owner') - - else - %span.light.vertical-align-middle= member.human_access + - if member + .float-right + - if member.owner? + %span.light= _('Owner') + - else + %span.light.vertical-align-middle= member.human_access - - if member.respond_to? :project - = link_to project_project_member_path(project, member), data: { confirm: remove_member_message(member), confirm_btn_variant: 'danger' }, aria: { label: _('Remove') }, remote: true, method: :delete, class: "btn btn-sm btn-danger gl-button btn-icon gl-ml-3", title: _('Remove user from project') do - = sprite_icon('remove', size: 16, css_class: 'gl-icon') + - if member.respond_to? :project + = link_to project_project_member_path(project, member), data: { confirm: remove_member_message(member), confirm_btn_variant: 'danger' }, aria: { label: _('Remove') }, remote: true, method: :delete, class: "btn btn-sm btn-danger gl-button btn-icon gl-ml-3", title: _('Remove user from project') do + = sprite_icon('remove', size: 16, css_class: 'gl-icon') diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml index 9197d6684e0..7edea81a123 100644 --- a/app/views/admin/users/show.html.haml +++ b/app/views/admin/users/show.html.haml @@ -5,138 +5,140 @@ .row .col-md-6 - .card - .card-header + = render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-5' }, body_options: { class: 'gl-py-2'}) do |c| + - c.header do = @user.name - %ul.content-list - %li - = image_tag avatar_icon_for_user(@user, 60, current_user: current_user), class: "avatar s60" - %li - %span.light= _('Profile page:') - %strong - = link_to user_path(@user) do - = @user.username + - c.body do + %ul.content-list + %li + = render Pajamas::AvatarComponent.new(@user, size: 64, class: 'gl-mr-3') + %li + %span.light= _('Profile page:') + %strong + = link_to user_path(@user) do + = @user.username -# Rendered on mobile only so order of cards can be different on desktop vs mobile .gl-md-display-none = render 'admin/users/profile', user: @user = render 'admin/users/user_detail_note' - .card - .card-header + = render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-5' }, body_options: { class: 'gl-py-2'}) do |c| + - c.header do = _('Account:') - %ul.content-list - %li - %span.light= _('Name:') - %strong= @user.name - %li - %span.light= _('Username:') - %strong - = @user.username - %li - %span.light= _('Email:') - %strong - = render partial: 'shared/email_with_badge', locals: { email: mail_to(@user.email), verified: @user.confirmed? } - - @user.emails.reject(&:user_primary_email?).each do |email| - %li - %span.light= _('Secondary email:') + - c.body do + %ul.content-list + %li + %span.light= _('Name:') + %strong= @user.name + %li + %span.light= _('Username:') %strong - = render partial: 'shared/email_with_badge', locals: { email: email.email, verified: email.confirmed? } - = link_to remove_email_admin_user_path(@user, email), data: { confirm: _("Are you sure you want to remove %{email}?") % { email: email.email }, 'confirm-btn-variant': 'danger' }, method: :delete, class: "btn btn-sm btn-danger gl-button btn-icon float-right", title: _('Remove secondary email'), id: "remove_email_#{email.id}" do - = sprite_icon('close', size: 16, css_class: 'gl-icon') - %li - %span.light ID: - %strong{ data: { qa_selector: 'user_id_content' } } - = @user.id - %li - %span.light= _('Namespace ID:') - %strong - = @user.namespace_id - - %li.two-factor-status - %span.light= _('Two-factor Authentication:') - %strong{ class: @user.two_factor_enabled? ? 'cgreen' : 'cred' } - - if @user.two_factor_enabled? - = _('Enabled') - = link_to _('Disable'), disable_two_factor_admin_user_path(@user), aria: { label: _('Disable') }, data: { confirm: _('Are you sure?'), 'confirm-btn-variant': 'danger' }, method: :patch, class: 'btn gl-button btn-sm btn-danger float-right', title: _('Disable Two-factor Authentication') - - else - = _('Disabled') - - = render_if_exists 'admin/namespace_plan_info', namespace: @user.namespace - - %li - %span.light= _('External User:') - %strong - = @user.external? ? _('Yes') : _('No') - - = render_if_exists 'admin/users/provisioned_by', user: @user - - %li - %span.light= _('Can create groups:') - %strong - = @user.can_create_group ? _('Yes') : _('No') - %li - %span.light= _('Personal projects limit:') - %strong - = @user.projects_limit - %li - %span.light= _('Member since:') - %strong - = @user.created_at.to_s(:medium) - - if @user.confirmed_at - %li - %span.light= _('Confirmed at:') + = @user.username + %li + %span.light= _('Email:') %strong - = @user.confirmed_at.to_s(:medium) - - else + = render partial: 'shared/email_with_badge', locals: { email: mail_to(@user.email), verified: @user.confirmed? } + - @user.emails.reject(&:user_primary_email?).each do |email| + %li + %span.light= _('Secondary email:') + %strong + = render partial: 'shared/email_with_badge', locals: { email: email.email, verified: email.confirmed? } + = link_to remove_email_admin_user_path(@user, email), data: { confirm: _("Are you sure you want to remove %{email}?") % { email: email.email }, 'confirm-btn-variant': 'danger' }, method: :delete, class: "btn btn-sm btn-danger gl-button btn-icon float-right", title: _('Remove secondary email'), id: "remove_email_#{email.id}" do + = sprite_icon('close', size: 16, css_class: 'gl-icon') %li - %span.ligh= _('Confirmed:') - %strong.cred - = _('No') + %span.light ID: + %strong{ data: { qa_selector: 'user_id_content' } } + = @user.id + %li + %span.light= _('Namespace ID:') + %strong + = @user.namespace_id - %li - %span.light= _('Current sign-in IP:') - %strong - = @user.current_sign_in_ip || _('never') + %li.two-factor-status + %span.light= _('Two-factor Authentication:') + %strong{ class: @user.two_factor_enabled? ? 'cgreen' : 'cred' } + - if @user.two_factor_enabled? + = _('Enabled') + = link_to _('Disable'), disable_two_factor_admin_user_path(@user), aria: { label: _('Disable') }, data: { confirm: _('Are you sure?'), 'confirm-btn-variant': 'danger' }, method: :patch, class: 'btn gl-button btn-sm btn-danger float-right', title: _('Disable Two-factor Authentication') + - else + = _('Disabled') - %li - %span.light= _('Current sign-in at:') - %strong - = @user.current_sign_in_at&.to_s(:medium) || _('never') + = render_if_exists 'admin/namespace_plan_info', namespace: @user.namespace - %li - %span.light= _('Last sign-in IP:') - %strong - = @user.last_sign_in_ip || _('never') + %li + %span.light= _('External User:') + %strong + = @user.external? ? _('Yes') : _('No') - %li - %span.light= _('Last sign-in at:') - %strong - = @user.last_sign_in_at&.to_s(:medium) || _('never') + = render_if_exists 'admin/users/provisioned_by', user: @user - %li - %span.light= _('Sign-in count:') - %strong - = @user.sign_in_count + %li + %span.light= _('Can create groups:') + %strong + = @user.can_create_group ? _('Yes') : _('No') + %li + %span.light= _('Personal projects limit:') + %strong + = @user.projects_limit + %li + %span.light= _('Member since:') + %strong + = @user.created_at.to_s(:medium) + - if @user.confirmed_at + %li + %span.light= _('Confirmed at:') + %strong + = @user.confirmed_at.to_s(:medium) + - else + %li + %span.ligh= _('Confirmed:') + %strong.cred + = _('No') - %li - %span.light= _("Highest role:") - %strong - = Gitlab::Access.human_access_with_none(@user.highest_role) + %li + %span.light= _('Current sign-in IP:') + %strong + = @user.current_sign_in_ip || _('never') - = render_if_exists 'admin/users/using_license_seat', user: @user + %li + %span.light= _('Current sign-in at:') + %strong + = @user.current_sign_in_at&.to_s(:medium) || _('never') - - if @user.ldap_user? %li - %span.light= _('LDAP uid:') + %span.light= _('Last sign-in IP:') %strong - = @user.ldap_identity.extern_uid + = @user.last_sign_in_ip || _('never') - - if @user.created_by %li - %span.light= _('Created by:') + %span.light= _('Last sign-in at:') %strong - = link_to @user.created_by.name, [:admin, @user.created_by] + = @user.last_sign_in_at&.to_s(:medium) || _('never') + + %li + %span.light= _('Sign-in count:') + %strong + = @user.sign_in_count + + %li + %span.light= _("Highest role:") + %strong + = Gitlab::Access.human_access_with_none(@user.highest_role) + + = render_if_exists 'admin/users/using_license_seat', user: @user + + - if @user.ldap_user? + %li + %span.light= _('LDAP uid:') + %strong + = @user.ldap_identity.extern_uid + + - if @user.created_by + %li + %span.light= _('Created by:') + %strong + = link_to @user.created_by.name, [:admin, @user.created_by] - = render_if_exists 'namespaces/shared_runner_status', namespace: @user.namespace + = render_if_exists 'namespaces/shared_runner_status', namespace: @user.namespace = render_if_exists 'admin/users/credit_card_info', user: @user, link_to_match_page: true diff --git a/app/views/award_emoji/_awards_block.html.haml b/app/views/award_emoji/_awards_block.html.haml index 6ed46847482..3952a450c4a 100644 --- a/app/views/award_emoji/_awards_block.html.haml +++ b/app/views/award_emoji/_awards_block.html.haml @@ -1,7 +1,7 @@ - api_awards_path = local_assigns.fetch(:api_awards_path, nil) - if api_awards_path - .gl-display-flex.gl-flex-wrap.gl-justify-content-space-between + .gl-display-flex.gl-flex-wrap.gl-justify-content-space-between.gl-py-3 #js-vue-awards-block{ data: { path: api_awards_path, can_award_emoji: can?(current_user, :award_emoji, awardable).to_s } } = yield - else diff --git a/app/views/ci/variables/_index.html.haml b/app/views/ci/variables/_index.html.haml index 02c468cebd7..9ca11b35064 100644 --- a/app/views/ci/variables/_index.html.haml +++ b/app/views/ci/variables/_index.html.haml @@ -1,9 +1,11 @@ - save_endpoint = local_assigns.fetch(:save_endpoint, nil) - if ci_variable_protected_by_default? - %p.settings-message.text-center - - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('ci/variables/index', anchor: 'protected-cicd-variables') } - = s_('Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default.').html_safe % { link_start: link_start, link_end: '</a>'.html_safe } + = render Pajamas::AlertComponent.new(variant: :warning, show_icon: false, dismissible: false, + alert_options: { class: 'gl-mb-3'}) do |c| + = c.body do + - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('ci/variables/index', anchor: 'protected-cicd-variables') } + = _('Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default.').html_safe % { link_start: link_start, link_end: '</a>'.html_safe } - is_group = !@group.nil? - is_project = !@project.nil? diff --git a/app/views/ci/variables/_url_query_variable_row.html.haml b/app/views/ci/variables/_url_query_variable_row.html.haml index 9c34daf88bd..77bcacdb94b 100644 --- a/app/views/ci/variables/_url_query_variable_row.html.haml +++ b/app/views/ci/variables/_url_query_variable_row.html.haml @@ -15,12 +15,12 @@ %input.js-ci-variable-input-destroy{ type: "hidden", name: destroy_input_name } %select.js-ci-variable-input-variable-type.ci-variable-body-item.form-control.select-control.custom-select.table-section.section-15{ name: variable_type_input_name } = options_for_select(ci_variable_type_options, variable_type) - %input.js-ci-variable-input-key.ci-variable-body-item.qa-ci-variable-input-key.form-control.table-section.section-15{ type: "text", + %input.js-ci-variable-input-key.ci-variable-body-item.form-control.table-section.section-15{ type: "text", name: key_input_name, value: key, placeholder: s_('CiVariables|Input variable key') } .ci-variable-body-item.gl-show-field-errors.table-section.section-15.border-top-0.p-0 - %textarea.js-ci-variable-input-value.js-secret-value.qa-ci-variable-input-value.form-control{ rows: 1, + %textarea.js-ci-variable-input-value.js-secret-value.form-control{ rows: 1, name: value_input_name, placeholder: s_('CiVariables|Input variable value') } = value diff --git a/app/views/ci/variables/_variable_row.html.haml b/app/views/ci/variables/_variable_row.html.haml index 483c767d029..c5e518d8526 100644 --- a/app/views/ci/variables/_variable_row.html.haml +++ b/app/views/ci/variables/_variable_row.html.haml @@ -18,14 +18,14 @@ %input.js-ci-variable-input-destroy{ type: "hidden", name: destroy_input_name } %select.js-ci-variable-input-variable-type.ci-variable-body-item.form-control.select-control.custom-select.table-section.section-15{ name: variable_type_input_name } = options_for_select(ci_variable_type_options, variable_type) - %input.js-ci-variable-input-key.ci-variable-body-item.qa-ci-variable-input-key.form-control.gl-form-input.table-section.section-15{ type: "text", + %input.js-ci-variable-input-key.ci-variable-body-item.form-control.gl-form-input.table-section.section-15{ type: "text", name: key_input_name, value: key, placeholder: s_('CiVariables|Input variable key') } .ci-variable-body-item.gl-show-field-errors.table-section.section-15.border-top-0.p-0 - .form-control.js-secret-value-placeholder.qa-ci-variable-input-value.overflow-hidden{ class: ('hide' unless id) } + .form-control.js-secret-value-placeholder.overflow-hidden{ class: ('hide' unless id) } = '*' * 17 - %textarea.js-ci-variable-input-value.js-secret-value.qa-ci-variable-input-value.form-control.gl-form-input{ class: ('hide' if id), + %textarea.js-ci-variable-input-value.js-secret-value.form-control.gl-form-input{ class: ('hide' if id), rows: 1, name: value_input_name, placeholder: s_('CiVariables|Input variable value') } diff --git a/app/views/clusters/clusters/_health.html.haml b/app/views/clusters/clusters/_health.html.haml index 75609465eb3..9e7820d3136 100644 --- a/app/views/clusters/clusters/_health.html.haml +++ b/app/views/clusters/clusters/_health.html.haml @@ -1,4 +1,6 @@ -%section.settings.no-animate.expanded.cluster-health-graphs.qa-cluster-health-section#cluster-health +- add_page_specific_style 'page_bundles/prometheus' + +%section.settings.no-animate.expanded.cluster-health-graphs#cluster-health - if @cluster&.integration_prometheus_available? #prometheus-graphs{ data: @cluster.health_data(clusterable) } diff --git a/app/views/clusters/clusters/index.html.haml b/app/views/clusters/clusters/index.html.haml index abe9cc9f27d..7bc782df119 100644 --- a/app/views/clusters/clusters/index.html.haml +++ b/app/views/clusters/clusters/index.html.haml @@ -1,3 +1,4 @@ +- add_page_specific_style 'page_bundles/clusters' - breadcrumb_title _('Kubernetes') - page_title _('Kubernetes Clusters') diff --git a/app/views/clusters/clusters/user/_form.html.haml b/app/views/clusters/clusters/user/_form.html.haml index bf7b24181c1..557c95f8478 100644 --- a/app/views/clusters/clusters/user/_form.html.haml +++ b/app/views/clusters/clusters/user/_form.html.haml @@ -36,7 +36,7 @@ = platform_kubernetes_field.form_group :authorization_type, { help: '%{help_text} %{help_link}'.html_safe % { help_text: rbac_help_text, help_link: rbac_help_link } } do = platform_kubernetes_field.check_box :authorization_type, - { class: 'qa-rbac-checkbox', label: s_('ClusterIntegration|RBAC-enabled cluster'), + { data: { qa_selector: 'rbac_checkbox'}, label: s_('ClusterIntegration|RBAC-enabled cluster'), label_class: 'label-bold', inline: true }, 'rbac', 'abac' .form-group diff --git a/app/views/devise/registrations/new.html.haml b/app/views/devise/registrations/new.html.haml index b6719834358..8a960602536 100644 --- a/app/views/devise/registrations/new.html.haml +++ b/app/views/devise/registrations/new.html.haml @@ -9,7 +9,7 @@ .signup-page = render 'devise/shared/signup_box', - url: registration_path(resource_name), + url: registration_path(resource_name, glm_tracking_params.to_hash), button_text: _('Register'), borderless: Feature.enabled?(:restyle_login_page, @project), show_omniauth_providers: omniauth_enabled? && button_based_providers_enabled? diff --git a/app/views/devise/sessions/_new_ldap.html.haml b/app/views/devise/sessions/_new_ldap.html.haml index d06043c1750..7affbafbdeb 100644 --- a/app/views/devise/sessions/_new_ldap.html.haml +++ b/app/views/devise/sessions/_new_ldap.html.haml @@ -10,10 +10,10 @@ = label_tag :password = password_field_tag :password, nil, { autocomplete: 'current-password', class: "form-control gl-form-input bottom", title: _("This field is required."), data: { qa_selector: 'password_field' }, required: true } - if !hide_remember_me && devise_mapping.rememberable? - .remember-me.gl-px-5 - %label{ for: "remember_me" } - = check_box_tag :remember_me, '1', false, id: 'remember_me' - %span= _('Remember me') + .gl-px-5 + = render Pajamas::CheckboxTagComponent.new(name: 'remember_me') do |c| + = c.label do + = _('Remember me') .submit-container.move-submit-down.gl-px-5.gl-pb-5 = submit_tag submit_message, class: "gl-button btn btn-confirm", 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 d4f34a1cb3f..439a2fc4d96 100644 --- a/app/views/devise/shared/_omniauth_box.html.haml +++ b/app/views/devise/shared/_omniauth_box.html.haml @@ -13,8 +13,6 @@ %span.gl-button-text = label_for_provider(provider) - unless hide_remember_me - %fieldset - %label{ class: restyle_login_page_enabled ? 'gl-font-weight-normal' : '' } - = check_box_tag :remember_me, nil, false - %span - = _('Remember me') + = render Pajamas::CheckboxTagComponent.new(name: 'remember_me', value: nil) do |c| + = c.label do + = _('Remember me') diff --git a/app/views/devise/shared/_tabs_ldap.html.haml b/app/views/devise/shared/_tabs_ldap.html.haml index e81a5928983..76c4cf41a2d 100644 --- a/app/views/devise/shared/_tabs_ldap.html.haml +++ b/app/views/devise/shared/_tabs_ldap.html.haml @@ -1,7 +1,7 @@ - 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?} #{"nav-links-unboxed" if Feature.enabled?(:restyle_login_page, @project)}" } +%ul.nav-links.new-session-tabs.nav-tabs.nav{ class: "#{'custom-provider-tabs' if any_form_based_providers_enabled?} #{'nav-links-unboxed' if Feature.enabled?(:restyle_login_page, @project)}" } - 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', role: 'tab' diff --git a/app/views/discussions/_discussion.html.haml b/app/views/discussions/_discussion.html.haml index 477f6c73388..224930e28df 100644 --- a/app/views/discussions/_discussion.html.haml +++ b/app/views/discussions/_discussion.html.haml @@ -3,19 +3,13 @@ .timeline-entry-inner .timeline-content .discussion.js-toggle-container{ data: { discussion_id: discussion.id, is_expanded: expanded.to_s } } - .discussion-header - .timeline-icon + .discussion-header.gl-display-flex.gl--flex-center + .timeline-icon.gl-flex-shrink-0 = link_to user_path(discussion.author) do - = image_tag avatar_icon_for_user(discussion.author), class: "avatar s40" - .discussion-actions - %button.note-action-button.discussion-toggle-button.js-toggle-button{ type: "button", class: ("js-toggle-lazy-diff" unless expanded) } - = sprite_icon('chevron-up', css_class: "js-sidebar-collapse #{'hidden' unless expanded}") - = sprite_icon('chevron-down', css_class: "js-sidebar-expand #{'hidden' if expanded}") - %span.js-sidebar-collapse{ class: "#{'hidden' unless expanded}" }= _('Hide thread') - %span.js-sidebar-expand{ class: "#{'hidden' if expanded}" }= _('Show thread') + = render Pajamas::AvatarComponent.new(discussion.author, size: 32, class: 'gl-mr-3') = link_to_member(@project, discussion.author, avatar: false) - .inline.discussion-headline-light + .inline.discussion-headline-light.gl-mx-3 = discussion.author.to_reference started a thread @@ -42,10 +36,16 @@ an old version of the diff - = time_ago_with_tooltip(discussion.created_at, placement: "bottom", html_class: "note-created-ago") = render "discussions/headline", discussion: discussion + .discussion-actions.gl-ml-auto + %button.note-action-button.discussion-toggle-button.js-toggle-button{ type: "button", class: ("js-toggle-lazy-diff" unless expanded) } + = sprite_icon('chevron-up', css_class: "js-sidebar-collapse #{'hidden' unless expanded}") + = sprite_icon('chevron-down', css_class: "js-sidebar-expand #{'hidden' if expanded}") + %span.js-sidebar-collapse{ class: "#{'hidden' unless expanded}" }= _('Hide thread') + %span.js-sidebar-expand{ class: "#{'hidden' if expanded}" }= _('Show thread') + .discussion-body.js-toggle-content{ class: ("hide" unless expanded) } - if discussion.diff_discussion? && discussion.diff_file = render "discussions/diff_with_notes", discussion: discussion diff --git a/app/views/events/event/_common.html.haml b/app/views/events/event/_common.html.haml index 1f6ac29bffc..7ef3461a7fb 100644 --- a/app/views/events/event/_common.html.haml +++ b/app/views/events/event/_common.html.haml @@ -6,7 +6,7 @@ = inline_event_icon(event) - if event.target %span.event-type.d-inline-block.gl-mr-2{ class: event.action_name } - = event.action_name + = localized_action_name(event) %span.event-target-type.gl-mr-2= event.target_type_name = link_to event_target_path(event), class: 'has-tooltip event-target-link gl-mr-2', title: event.target_title do = event.target.reference_link_text diff --git a/app/views/groups/_import_group_from_another_instance_panel.html.haml b/app/views/groups/_import_group_from_another_instance_panel.html.haml index a9234753aa2..d48bf0173a4 100644 --- a/app/views/groups/_import_group_from_another_instance_panel.html.haml +++ b/app/views/groups/_import_group_from_another_instance_panel.html.haml @@ -1,5 +1,5 @@ -= form_with url: configure_import_bulk_imports_path(namespace_id: params[:parent_id]), class: 'group-form gl-show-field-errors' do |f| - .gl-border-l-solid.gl-border-r-solid.gl-border-gray-100.gl-border-1.gl-p-5 += gitlab_ui_form_with url: configure_import_bulk_imports_path(namespace_id: params[:parent_id]), class: 'gl-show-field-errors' do |f| + .gl-border-l-solid.gl-border-r-solid.gl-border-t-solid.gl-border-gray-100.gl-border-1.gl-p-5.gl-mt-4 .gl-display-flex.gl-align-items-center %h4.gl-display-flex = s_('GroupsNew|Import groups from another instance of GitLab') @@ -32,4 +32,4 @@ id: 'import_gitlab_token', data: { qa_selector: 'import_gitlab_token' } .gl-border-gray-100.gl-border-solid.gl-border-1.gl-bg-gray-10.gl-p-5 - = f.submit s_('GroupsNew|Connect instance'), class: 'btn gl-button btn-confirm', data: { qa_selector: 'connect_instance_button' } + = f.submit s_('GroupsNew|Connect instance'), pajamas_button: true, data: { qa_selector: 'connect_instance_button' } diff --git a/app/views/groups/_import_group_from_file_panel.html.haml b/app/views/groups/_import_group_from_file_panel.html.haml index 022777eea27..35e8b7dc977 100644 --- a/app/views/groups/_import_group_from_file_panel.html.haml +++ b/app/views/groups/_import_group_from_file_panel.html.haml @@ -2,7 +2,7 @@ - group_path = root_url - group_path << parent.full_path + '/' if parent -= form_for '', url: import_gitlab_group_path, namespace: 'import_group', class: 'group-form gl-show-field-errors', multipart: true do |f| += gitlab_ui_form_for '', url: import_gitlab_group_path, namespace: 'import_group', class: 'group-form gl-show-field-errors', multipart: true do |f| .gl-border-l-solid.gl-border-r-solid.gl-border-gray-100.gl-border-1.gl-p-5 %h4 = _('Import group from file') @@ -22,4 +22,4 @@ .gl-mt-3 = render 'shared/file_picker_button', f: f, field: :file, help_text: nil, classes: 'gl-button btn-confirm-secondary gl-mr-2' .gl-border-gray-100.gl-border-solid.gl-border-1.gl-bg-gray-10.gl-p-5 - = f.submit _('Import'), class: 'btn gl-button btn-confirm' + = f.submit _('Import'), pajamas_button: true diff --git a/app/views/groups/_personalize.html.haml b/app/views/groups/_personalize.html.haml index bae76952ef8..2f55aefb817 100644 --- a/app/views/groups/_personalize.html.haml +++ b/app/views/groups/_personalize.html.haml @@ -8,7 +8,7 @@ .row .form-group.col-sm-4 = label :user, :role, _('Role') - = select :user, :role, ::User.roles.keys.map { |role| [role.titleize, role] }, { selected: @current_user.role }, class: 'form-control' + = select :user, :role, ::User.roles.keys.map { |role| [localized_user_roles[role] || role.titleize, role] }, { selected: @current_user.role }, class: 'form-control' .row .form-group.col-sm-4 diff --git a/app/views/groups/boards/index.html.haml b/app/views/groups/boards/index.html.haml index bb56769bd3f..e5b5f6404bb 100644 --- a/app/views/groups/boards/index.html.haml +++ b/app/views/groups/boards/index.html.haml @@ -1 +1 @@ -= render "shared/boards/show", board: @boards.first += render "shared/boards/show", board: @board diff --git a/app/views/groups/merge_requests.html.haml b/app/views/groups/merge_requests.html.haml index 33fcda6129c..6c4a8b53764 100644 --- a/app/views/groups/merge_requests.html.haml +++ b/app/views/groups/merge_requests.html.haml @@ -1,24 +1,18 @@ -- @can_bulk_update = can?(current_user, :admin_merge_request, @group) && @group.licensed_feature_available?(:group_bulk_edit) +- @can_bulk_update = can?(current_user, :admin_merge_request, @group) && @group.licensed_feature_available?(:group_bulk_edit) && issuables_count_for_state(:merge_requests, :all) > 0 - page_title _("Merge requests") -- if issuables_count_for_state(:merge_requests, :all) == 0 - = render 'shared/issuable/search_bar', type: :merge_requests +.top-area + = render 'shared/issuable/nav', type: :merge_requests + - if current_user + .nav-controls + - if @can_bulk_update + = render_if_exists 'projects/merge_requests/bulk_update_button' - = render 'shared/empty_states/merge_requests', project_select_button: true -- else - .top-area - = render 'shared/issuable/nav', type: :merge_requests - - if current_user - .nav-controls - - if @can_bulk_update - = render_if_exists 'projects/merge_requests/bulk_update_button' + = render 'shared/new_project_item_select', path: 'merge_requests/new', label: _("merge request"), type: :merge_requests, with_feature_enabled: 'merge_requests', with_shared: false, include_projects_in_subgroups: true - = render 'shared/new_project_item_select', path: 'merge_requests/new', label: _("merge request"), type: :merge_requests, with_feature_enabled: 'merge_requests', with_shared: false, include_projects_in_subgroups: true += render 'shared/issuable/search_bar', type: :merge_requests +- if @can_bulk_update + = render_if_exists 'shared/issuable/group_bulk_update_sidebar', group: @group, type: :merge_requests - = render 'shared/issuable/search_bar', type: :merge_requests - - - if @can_bulk_update - = render_if_exists 'shared/issuable/group_bulk_update_sidebar', group: @group, type: :merge_requests - - = render 'shared/merge_requests' += render 'shared/merge_requests' diff --git a/app/views/groups/milestones/_form.html.haml b/app/views/groups/milestones/_form.html.haml index 3864b30eb1e..d4b1c3c27f1 100644 --- a/app/views/groups/milestones/_form.html.haml +++ b/app/views/groups/milestones/_form.html.haml @@ -21,8 +21,8 @@ .form-actions - if @milestone.new_record? - = f.submit _('Create milestone'), class: "btn-confirm gl-button btn", data: { qa_selector: "create_milestone_button" } + = f.submit _('Create milestone'), data: { qa_selector: "create_milestone_button" }, pajamas_button: true = link_to _("Cancel"), group_milestones_path(@group), class: "btn gl-button btn-cancel" - else - = f.submit _('Update milestone'), class: "btn-confirm gl-button btn" + = f.submit _('Update milestone'), pajamas_button: true = link_to _("Cancel"), group_milestone_path(@group, @milestone), class: "btn gl-button btn-cancel" diff --git a/app/views/groups/new.html.haml b/app/views/groups/new.html.haml index 8384c906eeb..657a582bdc5 100644 --- a/app/views/groups/new.html.haml +++ b/app/views/groups/new.html.haml @@ -16,7 +16,7 @@ #import-group-pane.tab-pane - if import_sources_enabled? - - if Feature.enabled?(:bulk_import) + - if BulkImports::Features.enabled? = render 'import_group_from_another_instance_panel' .gl-mt-7.gl-border-b-solid.gl-border-gray-100.gl-border-1 = render 'import_group_from_file_panel' diff --git a/app/views/groups/projects.html.haml b/app/views/groups/projects.html.haml index d5c22d9b1f2..e7ae54a8879 100644 --- a/app/views/groups/projects.html.haml +++ b/app/views/groups/projects.html.haml @@ -2,45 +2,46 @@ - page_title _("Projects") - @content_class = "limit-container-width" unless fluid_layout -.card.gl-mt-3 - .card-header - %strong= @group.name - projects: += render Pajamas::CardComponent.new(card_options: { class: 'gl-mt-3 js-search-settings-section' }, header_options: { class: 'gl-display-flex' }, body_options: { class: 'gl-py-0' }) do |c| + - c.header do + .gl-flex-grow-1 + = html_escape(_("%{strong_open}%{group_name}%{strong_close} projects:")) % { strong_open: '<strong>'.html_safe, group_name: @group.name, strong_close: '</strong>'.html_safe } - if can? current_user, :admin_group, @group .controls - = link_to new_project_path(namespace_id: @group.id), class: "btn gl-button btn-sm btn-confirm" do - New project - %ul.projects-list.content-list.group-settings-projects - - @projects.each do |project| - %li.project-row{ class: ('no-description' if project.description.blank?) } - .controls - = link_to _('Members'), project_project_members_path(project), id: "edit_#{dom_id(project)}", class: "btn gl-button" - = link_to _('Edit'), edit_project_path(project), id: "edit_#{dom_id(project)}", class: "btn gl-button" - = render 'delete_project_button', project: project + = render Pajamas::ButtonComponent.new(href: new_project_path(namespace_id: @group.id), size: :small, variant: :confirm) do + = _("New project") + - c.body do + %ul.content-list + - @projects.each do |project| + %li.project-row.gl-align-items-center{ class: 'gl-display-flex!' } + .avatar-container.rect-avatar.s40.gl-flex-shrink-0 + = project_icon(project, alt: '', class: 'avatar project-avatar s40', width: 40, height: 40) + .gl-min-w-0.gl-flex-grow-1 + .title + = link_to project_path(project), class: 'js-prefetch-document' do + %span.project-full-name + %span.namespace-name + - if project.namespace + = project.namespace.human_name + \/ + %span.project-name + = project.name + %span{ class: visibility_level_color(project.visibility_level) } + = visibility_level_icon(project.visibility_level) - .stats - = gl_badge_tag storage_counter(project.statistics&.storage_size) - = render 'project_badges', project: project + - if project.description.present? + .description + = markdown_field(project, :description) - .title - = link_to project_path(project), class: 'js-prefetch-document' do - .dash-project-avatar - .avatar-container.rect-avatar.s40 - = project_icon(project, alt: '', class: 'avatar project-avatar s40', width: 40, height: 40) - %span.project-full-name - %span.namespace-name - - if project.namespace - = project.namespace.human_name - \/ - %span.project-name - = project.name - %span{ class: visibility_level_color(project.visibility_level) } - = visibility_level_icon(project.visibility_level) + .stats.gl-text-gray-500.gl-flex-shrink-0.gl-display-none.gl-sm-display-flex + = gl_badge_tag storage_counter(project.statistics&.storage_size) + = render 'project_badges', project: project - - if project.description.present? - .description - = markdown_field(project, :description) - - if @projects.blank? - .nothing-here-block This group has no projects yet + .controls.gl-flex-shrink-0.gl-ml-5 + = link_to _('Members'), project_project_members_path(project), id: dom_id(project, :edit), class: "btn gl-button" + = link_to _('Edit'), edit_project_path(project), id: dom_id(project, :edit), class: "btn gl-button" + = render 'delete_project_button', project: project + - if @projects.blank? + .nothing-here-block= _("This group has no projects yet") = paginate @projects, theme: "gitlab" diff --git a/app/views/groups/settings/_pages_settings.html.haml b/app/views/groups/settings/_pages_settings.html.haml index 456e0b0f1d0..441e9333630 100644 --- a/app/views/groups/settings/_pages_settings.html.haml +++ b/app/views/groups/settings/_pages_settings.html.haml @@ -1,5 +1,5 @@ -= form_for @group, html: { multipart: true, class: 'gl-show-field-errors' }, authenticity_token: true do |f| += gitlab_ui_form_for @group, html: { multipart: true, class: 'gl-show-field-errors' }, authenticity_token: true do |f| = render_if_exists 'shared/pages/max_pages_size_input', form: f .gl-mt-3 - = f.submit s_('GitLabPages|Save changes'), class: 'btn gl-button btn-confirm' + = f.submit s_('GitLabPages|Save changes'), pajamas_button: true diff --git a/app/views/groups/settings/access_tokens/index.html.haml b/app/views/groups/settings/access_tokens/index.html.haml index ac6c5d1842c..5e3d814687e 100644 --- a/app/views/groups/settings/access_tokens/index.html.haml +++ b/app/views/groups/settings/access_tokens/index.html.haml @@ -4,7 +4,7 @@ - type_plural = _('group access tokens') - @content_class = 'limit-container-width' unless fluid_layout -.row.gl-mt-3 +.row.gl-mt-3.js-search-settings-section .col-lg-4 %h4.gl-mt-0 = page_title @@ -24,13 +24,11 @@ = _('You can enable group access token creation in %{link_start}group settings%{link_end}.').html_safe % { link_start: link_start, link_end: '</a>'.html_safe } .col-lg-8 - - if @new_resource_access_token - = render 'shared/access_tokens/created_container', - type: type, - new_token_value: @new_resource_access_token + #js-new-access-token-app{ data: { access_token_type: type } } - if current_user.can?(:create_resource_access_tokens, @group) = render 'shared/access_tokens/form', + ajax: true, type: type, path: group_settings_access_tokens_path(@group), resource: @group, @@ -41,10 +39,6 @@ prefix: :resource_access_token, help_path: help_page_path('user/group/settings/group_access_tokens', anchor: 'scopes-for-a-group-access-token') - = render 'shared/access_tokens/table', - active_tokens: @active_resource_access_tokens, - resource: @group, - type: type, - type_plural: type_plural, - revoke_route_helper: ->(token) { revoke_group_settings_access_token_path(id: token) }, - no_active_tokens_message: _('This group has no active access tokens.') + #js-access-token-table-app{ data: { access_token_type: type, access_token_type_plural: type_plural, initial_active_access_tokens: @active_resource_access_tokens.to_json, no_active_tokens_message: _('This group has no active access tokens.'), show_role: true + } } + diff --git a/app/views/groups/settings/ci_cd/_form.html.haml b/app/views/groups/settings/ci_cd/_form.html.haml index 59c67197f81..89e353b94b0 100644 --- a/app/views/groups/settings/ci_cd/_form.html.haml +++ b/app/views/groups/settings/ci_cd/_form.html.haml @@ -1,6 +1,6 @@ .row.gl-mt-3 .col-lg-12 - = form_for group, url: group_settings_ci_cd_path(group, anchor: 'js-general-pipeline-settings') do |f| + = gitlab_ui_form_for group, url: group_settings_ci_cd_path(group, anchor: 'js-general-pipeline-settings') do |f| %fieldset.builds-feature .form-group = f.label :max_artifacts_size, _('Maximum artifacts size'), class: 'label-bold' @@ -8,4 +8,4 @@ %p.form-text.text-muted = _("The maximum file size in megabytes for individual job artifacts.") = link_to s_('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'maximum-artifacts-size'), target: '_blank', rel: 'noopener noreferrer' - = f.submit _('Save changes'), class: "btn gl-button btn-confirm" + = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/groups/settings/ci_cd/show.html.haml b/app/views/groups/settings/ci_cd/show.html.haml index 88352ea351c..67b87f842f9 100644 --- a/app/views/groups/settings/ci_cd/show.html.haml +++ b/app/views/groups/settings/ci_cd/show.html.haml @@ -44,7 +44,7 @@ = expanded ? _('Collapse') : _('Expand') %p - auto_devops_url = help_page_path('topics/autodevops/index') - - quickstart_url = help_page_path('topics/autodevops/quick_start_guide') + - quickstart_url = help_page_path('topics/autodevops/cloud_deployments/auto_devops_with_gke') - auto_devops_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: auto_devops_url } - quickstart_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: quickstart_url } = s_('AutoDevOps|%{auto_devops_start}Automate building, testing, and deploying%{auto_devops_end} your applications based on your continuous integration and delivery configuration. %{quickstart_start}How do I get started?%{quickstart_end}').html_safe % { auto_devops_start: auto_devops_start, auto_devops_end: '</a>'.html_safe, quickstart_start: quickstart_start, quickstart_end: '</a>'.html_safe } diff --git a/app/views/groups/settings/integrations/index.html.haml b/app/views/groups/settings/integrations/index.html.haml index 1db8edb040b..ec99ceb5f8d 100644 --- a/app/views/groups/settings/integrations/index.html.haml +++ b/app/views/groups/settings/integrations/index.html.haml @@ -2,8 +2,9 @@ - page_title s_('Integrations|Group-level integration management') - @content_class = 'limit-container-width' unless fluid_layout -%h3= s_('Integrations|Group-level integration management') +%section.js-search-settings-section + %h3= s_('Integrations|Group-level integration management') -- integrations_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: integrations_help_page_path } -%p= s_("Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}.").html_safe % { integrations_link_start: integrations_link_start, link_end: "</a>".html_safe } -= render 'shared/integrations/index', integrations: @integrations + - integrations_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: integrations_help_page_path } + %p= s_("Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}.").html_safe % { integrations_link_start: integrations_link_start, link_end: "</a>".html_safe } + = render 'shared/integrations/index', integrations: @integrations diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index f474f8fbd3b..012a31c1ecf 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -3,9 +3,6 @@ - @skip_current_level_breadcrumb = true - add_page_specific_style 'page_bundles/group' -- if show_thanks_for_purchase_alert? - = render_if_exists 'shared/thanks_for_purchase_alert', plan_title: plan_title, quantity: params[:purchased_quantity].to_i - = render_if_exists 'shared/qrtly_reconciliation_alert', group: @group = render_if_exists 'shared/free_user_cap_alert', source: @group diff --git a/app/views/help/index.html.haml b/app/views/help/index.html.haml index 3992cb527ed..eaa58580454 100644 --- a/app/views/help/index.html.haml +++ b/app/views/help/index.html.haml @@ -34,14 +34,14 @@ .row.gl-mt-3 .col-md-8 - .documentation-index.md + .md = markdown(@help_index) .col-md-4 .card.links-card .card-header = _('Quick help') %ul.content-list - %li= link_to _('See our website for help'), support_url + %li= link_to _('See our website for help'), support_url, { class: 'gl-text-blue-600!' } %li %button.btn-blank.btn-link.js-trigger-search-bar{ type: 'button' } = _('Use the search bar on the top of this page') @@ -49,5 +49,5 @@ %button.btn-blank.btn-link.js-trigger-shortcut{ type: 'button' } = _('Use shortcuts') - unless Gitlab::CurrentSettings.help_page_hide_commercial_content? - %li= link_to _('Get a support subscription'), "https://#{ApplicationHelper.promo_host}/pricing/" - %li= link_to _('Compare GitLab editions'), "https://#{ApplicationHelper.promo_host}/features/#compare" + %li= link_to _('Get a support subscription'), "https://#{ApplicationHelper.promo_host}/pricing/", { class: 'gl-text-blue-600!' } + %li= link_to _('Compare GitLab editions'), "https://#{ApplicationHelper.promo_host}/features/#compare", { class: 'gl-text-blue-600!' } diff --git a/app/views/help/instance_configuration.html.haml b/app/views/help/instance_configuration.html.haml index b6d27123be4..4baedca820f 100644 --- a/app/views/help/instance_configuration.html.haml +++ b/app/views/help/instance_configuration.html.haml @@ -1,5 +1,5 @@ - page_title _('Instance Configuration') -.documentation.md +.md.gl-font-lg.gl-mt-3 %h1= _('Instance Configuration') %p diff --git a/app/views/help/show.html.haml b/app/views/help/show.html.haml index c41f6ea3ed4..39f45e8b649 100644 --- a/app/views/help/show.html.haml +++ b/app/views/help/show.html.haml @@ -1,5 +1,5 @@ - page_title @path.split("/").reverse.map(&:humanize) - @content_class = "limit-container-width" unless fluid_layout -.documentation.md.gl-mt-3 +.md.gl-font-lg.gl-mt-3 = markdown @markdown diff --git a/app/views/import/_githubish_status.html.haml b/app/views/import/_githubish_status.html.haml index 35fd5d6eda6..9ea52a8f82f 100644 --- a/app/views/import/_githubish_status.html.haml +++ b/app/views/import/_githubish_status.html.haml @@ -5,6 +5,7 @@ - paginatable = local_assigns.fetch(:paginatable, false) - default_namespace_path = (local_assigns[:default_namespace] || current_user.namespace).full_path - provider_title = Gitlab::ImportSources.title(provider) +- optional_stages = local_assigns.fetch(:optional_stages, []) - header_title _("New project"), new_project_path - add_to_breadcrumbs s_('ProjectsNew|Import project'), new_project_path(anchor: 'import_project') @@ -18,4 +19,5 @@ default_target_namespace: default_namespace_path, import_path: url_for([:import, provider, { format: :json }]), filterable: filterable.to_s, - paginatable: paginatable.to_s }.merge(extra_data) } + paginatable: paginatable.to_s, + optional_stages: optional_stages.to_json }.merge(extra_data) } diff --git a/app/views/import/fogbugz/new_user_map.html.haml b/app/views/import/fogbugz/new_user_map.html.haml index 28836055e0e..9d4c0f62134 100644 --- a/app/views/import/fogbugz/new_user_map.html.haml +++ b/app/views/import/fogbugz/new_user_map.html.haml @@ -23,23 +23,21 @@ %p = html_escape(_('Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. "By %{link_open}@johnsmith%{link_close}"). It will also associate and/or assign these issues and comments with the selected user.')) % { link_open: '<a href="#">'.html_safe, link_close: '</a>'.html_safe } - .table-holder - %table.table - %thead + %table.table + %thead + %tr + %th= _("ID") + %th= _("Name") + %th= _("Email") + %th= _("GitLab User") + %tbody + - @user_map.each do |id, user| %tr - %th= _("ID") - %th= _("Name") - %th= _("Email") - %th= _("GitLab User") - %tbody - - @user_map.each do |id, user| - %tr - %td= id - %td= text_field_tag "users[#{id}][name]", user[:name], class: 'form-control' - %td= text_field_tag "users[#{id}][email]", user[:email], class: 'form-control' - %td - = users_select_tag("users[#{id}][gitlab_user]", class: 'custom-form-control', - scope: :all, email_user: true, selected: user[:gitlab_user]) + %td= id + %td= text_field_tag "users[#{id}][name]", user[:name], class: 'form-control gl-form-input' + %td= text_field_tag "users[#{id}][email]", user[:email], class: 'form-control gl-form-input' + %td + .js-gitlab-user{ data: { name: "users[#{id}][gitlab_user]" } } .form-actions = submit_tag _('Continue to the next step'), class: 'gl-button btn btn-confirm' diff --git a/app/views/import/github/status.html.haml b/app/views/import/github/status.html.haml index 1b556cd0f7f..25afe9a7b1b 100644 --- a/app/views/import/github/status.html.haml +++ b/app/views/import/github/status.html.haml @@ -7,4 +7,7 @@ - paginatable = Feature.enabled?(:remove_legacy_github_client) -= render 'import/githubish_status', provider: 'github', paginatable: paginatable, default_namespace: @namespace += render 'import/githubish_status', + provider: 'github', paginatable: paginatable, + default_namespace: @namespace, + optional_stages: Gitlab::GithubImport::Settings.stages_array diff --git a/app/views/layouts/_flash.html.haml b/app/views/layouts/_flash.html.haml index ab4b3cf6afd..5a558d42802 100644 --- a/app/views/layouts/_flash.html.haml +++ b/app/views/layouts/_flash.html.haml @@ -1,8 +1,10 @@ --# We currently only support `alert`, `notice`, `success`, 'toast', and 'raw' -- icons = {'alert' => 'error', 'notice' => 'information-o', 'success' => 'check-circle'} -- type_to_variant = {'alert' => 'danger', 'notice' => 'info', 'success' => 'success'} +- flash_container_no_margin = local_assigns.fetch(:flash_container_no_margin, false) +- flash_container_class = ('flash-container-no-margin' if flash_container_no_margin) + +-# We currently only support `alert`, `notice`, `success`, `warning`, 'toast', and 'raw' +- type_to_variant = {'alert' => 'danger', 'notice' => 'info', 'success' => 'success', 'warning' => 'warning'} - closable = %w[alert notice success] -.flash-container.flash-container-page.sticky{ data: { qa_selector: 'flash_container' } } +.flash-container.flash-container-page.sticky{ data: { qa_selector: 'flash_container' }, class: flash_container_class } - flash.each do |key, value| - if key == 'toast' && value .js-toast-message{ data: { message: value } } @@ -11,9 +13,5 @@ - elsif value == I18n.t('devise.failure.unconfirmed') = render 'shared/confirm_your_email_alert' - elsif value - %div{ class: "flash-#{key} mb-2", data: { testid: "alert-#{type_to_variant[key]}" } } - = sprite_icon(icons[key], css_class: 'align-middle mr-1') unless icons[key].nil? - %span= value - - if closable.include?(key) - %div{ class: "close-icon-wrapper js-close-icon" } - = sprite_icon('close', css_class: 'close-icon gl-vertical-align-baseline!') + = render Pajamas::AlertComponent.new(variant: type_to_variant[key], dismissible: closable.include?(key), alert_options: {class: "flash-#{key}", data: { testid: "alert-#{type_to_variant[key]}" }}) do |c| + = c.with_body { value } diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml index 84eb2706929..2ac926a7fc3 100644 --- a/app/views/layouts/_head.html.haml +++ b/app/views/layouts/_head.html.haml @@ -1,5 +1,5 @@ - page_description brand_title unless page_description -- site_name = "GitLab" +- site_name = _('GitLab') %head{ prefix: "og: http://ogp.me/ns#" } %meta{ charset: "utf-8" } diff --git a/app/views/layouts/fullscreen.html.haml b/app/views/layouts/fullscreen.html.haml index 61a57240ed5..f4f9f39c20e 100644 --- a/app/views/layouts/fullscreen.html.haml +++ b/app/views/layouts/fullscreen.html.haml @@ -1,11 +1,13 @@ +- minimal = local_assigns.fetch(:minimal, false) !!! 5 %html{ lang: I18n.locale, class: page_class } = render "layouts/head" %body{ class: "#{user_application_theme} #{user_tab_width} #{@body_class} fullscreen-layout", data: { page: body_data_page } } = render 'peek/bar' = header_message - = render partial: "layouts/header/default", locals: { project: @project, group: @group } - .mobile-overlay + - unless minimal + = render partial: "layouts/header/default", locals: { project: @project, group: @group } + .mobile-overlay .hide-when-top-nav-responsive-open.gl--flex-full.gl-h-full{ class: nav ? ["layout-page", page_with_sidebar_class, "gl-mt-0!"]: '' } - if defined?(nav) && nav = render "layouts/nav/sidebar/#{nav}" @@ -14,8 +16,9 @@ = render 'shared/outdated_browser' = render "layouts/broadcast" = yield :flash_message - = render "layouts/flash" + = render "layouts/flash", flash_container_no_margin: true .content-wrapper{ id: "content-body", class: "d-flex flex-column align-items-stretch" } = yield - = render "layouts/nav/top_nav_responsive", class: "gl-flex-grow-1 gl-overflow-y-auto" + - unless minimal + = render "layouts/nav/top_nav_responsive", class: "gl-flex-grow-1 gl-overflow-y-auto" = footer_message diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml index a00c5c186cc..b74dfd4d3a1 100644 --- a/app/views/layouts/header/_default.html.haml +++ b/app/views/layouts/header/_default.html.haml @@ -132,7 +132,7 @@ - if header_link?(:user_dropdown) %li.nav-item.header-user.js-nav-user-dropdown.dropdown{ data: { track_label: "profile_dropdown", track_action: "click_dropdown", track_value: "", qa_selector: 'user_menu', testid: 'user-menu' }, class: ('mr-0' if has_impersonation_link) } = link_to current_user, class: user_dropdown_class, data: { toggle: "dropdown" } do - = image_tag avatar_icon_for_user(current_user, 23), width: 23, height: 23, class: "header-user-avatar qa-user-avatar", alt: current_user.name + = render Pajamas::AvatarComponent.new(current_user, size: 24, class: 'header-user-avatar', avatar_options: { data: { qa_selector: 'user_avatar_content' } }) = render_if_exists 'layouts/header/user_notification_dot', project: project, namespace: group = sprite_icon('chevron-down', css_class: 'caret-down') .dropdown-menu.dropdown-menu-right diff --git a/app/views/layouts/header/_gitlab_version.html.haml b/app/views/layouts/header/_gitlab_version.html.haml index 125fbaa084c..fae6926a687 100644 --- a/app/views/layouts/header/_gitlab_version.html.haml +++ b/app/views/layouts/header/_gitlab_version.html.haml @@ -1,6 +1,6 @@ - return unless show_version_check? -.gl-display-flex.gl-flex-direction-column.gl-px-4.gl-py-3 +%a{ class: 'gl-display-flex! gl-flex-direction-column gl-px-4! gl-py-3! gl-line-height-24!', href: help_page_path('update/index'), 'data-testid': 'gitlab-version-container' } %span = s_("VersionCheck|Your GitLab Version") = emoji_icon('rocket') diff --git a/app/views/layouts/header/_help_dropdown.html.haml b/app/views/layouts/header/_help_dropdown.html.haml index 3a8f9c1ae8d..bdd1ae291fd 100644 --- a/app/views/layouts/header/_help_dropdown.html.haml +++ b/app/views/layouts/header/_help_dropdown.html.haml @@ -1,6 +1,7 @@ %ul - if current_user_menu?(:help) - = render 'layouts/header/gitlab_version' + %li + = render 'layouts/header/gitlab_version' = render_if_exists 'layouts/header/help_dropdown/cross_stage_fdm' = render 'layouts/header/whats_new_dropdown_item' %li diff --git a/app/views/layouts/header/_new_dropdown.html.haml b/app/views/layouts/header/_new_dropdown.html.haml index e5b03acbe3b..9801b0cc055 100644 --- a/app/views/layouts/header/_new_dropdown.html.haml +++ b/app/views/layouts/header/_new_dropdown.html.haml @@ -24,4 +24,4 @@ = menu_item.fetch(:title) - if menu_item.fetch(:emoji) -# We need to insert a space between the title and emoji - = " #{emoji_icon(menu_item.fetch(:emoji), 'aria-hidden': true, class: "gl-font-base gl-vertical-align-baseline")}".html_safe + = " #{emoji_icon(menu_item.fetch(:emoji), 'aria-hidden': true, class: 'gl-font-base gl-vertical-align-baseline')}".html_safe diff --git a/app/views/layouts/nav/sidebar/_admin.html.haml b/app/views/layouts/nav/sidebar/_admin.html.haml index 56f333664df..8815dec5a6b 100644 --- a/app/views/layouts/nav/sidebar/_admin.html.haml +++ b/app/views/layouts/nav/sidebar/_admin.html.haml @@ -1,4 +1,4 @@ -%aside.nav-sidebar.qa-admin-sidebar{ class: ("sidebar-collapsed-desktop" if collapsed_sidebar?), 'aria-label': _('Admin navigation') } +%aside.nav-sidebar{ class: ("sidebar-collapsed-desktop" if collapsed_sidebar?), 'aria-label': _('Admin navigation'), data: { qa_selector: 'admin_sidebar_content' } } .nav-sidebar-inner-scroll .context-header = link_to admin_root_path, title: _('Admin Overview'), class: 'has-tooltip', data: { container: 'body', placement: 'right' } do @@ -6,7 +6,7 @@ = sprite_icon('admin', size: 18) %span.sidebar-context-title = _('Admin Area') - %ul.sidebar-top-level-items{ data: { qa_selector: 'admin_sidebar_overview_submenu_content' } } + %ul.sidebar-top-level-items{ data: { qa_selector: 'admin_overview_submenu_content' } } = nav_link(controller: %w[dashboard admin admin/projects users groups admin/topics jobs runners gitaly_servers cohorts], html_options: {class: 'home'}) do = link_to admin_root_path, class: 'has-sub-items' do .nav-icon-container @@ -28,15 +28,15 @@ %span = _('Projects') = nav_link(controller: %w[users cohorts]) do - = link_to admin_users_path, title: _('Users'), data: { qa_selector: 'users_overview_link' } do + = link_to admin_users_path, title: _('Users'), data: { qa_selector: 'admin_overview_users_link' } do %span = _('Users') = nav_link(controller: :groups) do - = link_to admin_groups_path, title: _('Groups'), data: { qa_selector: 'groups_overview_link' } do + = link_to admin_groups_path, title: _('Groups'), data: { qa_selector: 'admin_overview_groups_link' } do %span = _('Groups') = nav_link(controller: [:admin, 'admin/topics']) do - = link_to admin_topics_path, title: _('Topics'), data: { qa_selector: 'topics_overview_link' } do + = link_to admin_topics_path, title: _('Topics') do %span = _('Topics') = nav_link path: 'jobs#index' do @@ -75,13 +75,13 @@ = _('Usage Trends') = nav_link(controller: admin_monitoring_nav_links) do - = link_to admin_system_info_path, data: { qa_selector: 'admin_monitoring_link' }, class: 'has-sub-items' do + = link_to admin_system_info_path, data: { qa_selector: 'admin_monitoring_menu_link' }, class: 'has-sub-items' do .nav-icon-container = sprite_icon('monitor') %span.nav-item-name = _('Monitoring') - %ul.sidebar-sub-level-items{ data: { qa_selector: 'admin_sidebar_monitoring_submenu_content' } } + %ul.sidebar-sub-level-items{ data: { qa_selector: 'admin_monitoring_submenu_content' } } = nav_link(controller: admin_monitoring_nav_links, html_options: { class: "fly-out-top-item" } ) do = link_to admin_system_info_path do %strong.fly-out-top-item-name @@ -222,10 +222,10 @@ = link_to general_admin_application_settings_path, class: 'has-sub-items' do .nav-icon-container = sprite_icon('settings') - %span.nav-item-name.qa-admin-settings-item + %span.nav-item-name{ data: { qa_selector: 'admin_settings_menu_link' } } = _('Settings') - %ul.sidebar-sub-level-items{ data: { qa_selector: 'admin_sidebar_settings_submenu_content' } } + %ul.sidebar-sub-level-items{ data: { qa_selector: 'admin_settings_submenu_content' } } -# This active_nav_link check is also used in `app/views/layouts/admin.html.haml` = nav_link(controller: [:application_settings, :integrations, :appearances], html_options: { class: "fly-out-top-item" } ) do = link_to general_admin_application_settings_path do @@ -233,24 +233,24 @@ = _('Settings') %li.divider.fly-out-top-item = nav_link(path: 'application_settings#general') do - = link_to general_admin_application_settings_path, title: _('General'), class: 'qa-admin-settings-general-item' do + = link_to general_admin_application_settings_path, title: _('General'), data: { qa_selector: 'admin_settings_general_link' } do %span = _('General') - = render_if_exists 'layouts/nav/sidebar/advanced_search', class: 'qa-admin-settings-advanced-search' + = render_if_exists 'layouts/nav/sidebar/advanced_search', data: { qa_selector: 'admin_settings_advanced_search_link' } - if instance_level_integrations? = nav_link(path: ['application_settings#integrations', 'integrations#edit']) do - = link_to integrations_admin_application_settings_path, title: _('Integrations'), data: { qa_selector: 'integration_settings_link' } do + = link_to integrations_admin_application_settings_path, title: _('Integrations'), data: { qa_selector: 'admin_settings_integrations_link' } do %span = _('Integrations') = nav_link(path: 'application_settings#repository') do - = link_to repository_admin_application_settings_path, title: _('Repository'), class: 'qa-admin-settings-repository-item' do + = link_to repository_admin_application_settings_path, title: _('Repository'), data: { qa_selector: 'admin_settings_repository_link' } do %span = _('Repository') - if Gitlab.ee? && License.feature_available?(:custom_file_templates) = nav_link(path: 'application_settings#templates') do - = link_to templates_admin_application_settings_path, title: _('Templates'), class: 'qa-admin-settings-template-item' do + = link_to templates_admin_application_settings_path, title: _('Templates'), data: { qa_selector: 'admin_settings_templates_link' } do %span = _('Templates') = nav_link(path: 'application_settings#ci_cd') do @@ -262,7 +262,7 @@ %span = _('Reporting') = nav_link(path: 'application_settings#metrics_and_profiling') do - = link_to metrics_and_profiling_admin_application_settings_path, title: _('Metrics and profiling'), class: 'qa-admin-settings-metrics-and-profiling-item' do + = link_to metrics_and_profiling_admin_application_settings_path, title: _('Metrics and profiling'), data: { qa_selector: 'admin_settings_metrics_and_profiling_link' } do %span = _('Metrics and profiling') = nav_link(path: ['application_settings#service_usage_data']) do @@ -270,7 +270,7 @@ %span = _('Service usage data') = nav_link(path: 'application_settings#network') do - = link_to network_admin_application_settings_path, title: _('Network'), data: { qa_selector: 'admin_settings_network_item' } do + = link_to network_admin_application_settings_path, title: _('Network'), data: { qa_selector: 'admin_settings_network_link' } do %span = _('Network') = nav_link(controller: :appearances ) do diff --git a/app/views/layouts/nav/sidebar/_profile.html.haml b/app/views/layouts/nav/sidebar/_profile.html.haml index cf1f84790a2..0e3327935ca 100644 --- a/app/views/layouts/nav/sidebar/_profile.html.haml +++ b/app/views/layouts/nav/sidebar/_profile.html.haml @@ -2,8 +2,7 @@ .nav-sidebar-inner-scroll .context-header = link_to profile_path, title: _('Profile Settings'), class: 'has-tooltip', data: { container: 'body', placement: 'right' } do - %span{ class: ['avatar-container', 'settings-avatar', 's32'] } - = image_tag avatar_icon_for_user(current_user, 32), class: ['avatar', 'avatar-tile', 'js-sidebar-user-avatar', 's32', 'gl-rounded-full!'], alt: current_user.name, data: { testid: 'sidebar-user-avatar' } + = render Pajamas::AvatarComponent.new(current_user, size: 32, alt: current_user.name, class: 'gl-mr-3 js-sidebar-user-avatar', avatar_options: { data: { testid: 'sidebar-user-avatar' } }) %span.sidebar-context-title= _('User Settings') %ul.sidebar-top-level-items = nav_link(path: 'profiles#show', html_options: {class: 'home'}) do @@ -52,17 +51,18 @@ = link_to profile_chat_names_path do %strong.fly-out-top-item-name = _('Chat') - = nav_link(controller: :personal_access_tokens) do - = link_to profile_personal_access_tokens_path do - .nav-icon-container - = sprite_icon('token') - %span.nav-item-name - = _('Access Tokens') - %ul.sidebar-sub-level-items.is-fly-out-only - = nav_link(controller: :personal_access_tokens, html_options: { class: "fly-out-top-item" } ) do - = link_to profile_personal_access_tokens_path do - %strong.fly-out-top-item-name - = _('Access Tokens') + - unless Gitlab::CurrentSettings.personal_access_tokens_disabled? + = nav_link(controller: :personal_access_tokens) do + = link_to profile_personal_access_tokens_path do + .nav-icon-container + = sprite_icon('token') + %span.nav-item-name + = _('Access Tokens') + %ul.sidebar-sub-level-items.is-fly-out-only + = nav_link(controller: :personal_access_tokens, html_options: { class: "fly-out-top-item" } ) do + = link_to profile_personal_access_tokens_path do + %strong.fly-out-top-item-name + = _('Access Tokens') = nav_link(controller: :emails) do = link_to profile_emails_path, data: { qa_selector: 'profile_emails_link' } do .nav-icon-container diff --git a/app/views/layouts/notify.html.haml b/app/views/layouts/notify.html.haml index d05b6951fbf..c557dc36534 100644 --- a/app/views/layouts/notify.html.haml +++ b/app/views/layouts/notify.html.haml @@ -24,7 +24,7 @@ - if @reply_by_email = _('Reply to this email directly or %{view_it_on_gitlab}.').html_safe % { view_it_on_gitlab: link_to(_("view it on GitLab"), @target_url) } - else - #{link_to _("View it on GitLab"), @target_url}. + #{link_to _('View it on GitLab'), @target_url}. %br = notification_reason_text(reason: @reason, show_manage_notifications_link: !@labels_url, show_help_link: true, manage_label_subscriptions_url: @labels_url, unsubscribe_url: @unsubscribe_url, format: :html) diff --git a/app/views/layouts/terms.html.haml b/app/views/layouts/terms.html.haml index c9baf0cd2b8..032be73f70c 100644 --- a/app/views/layouts/terms.html.haml +++ b/app/views/layouts/terms.html.haml @@ -25,7 +25,7 @@ %ul.nav.navbar-nav %li.header-user.dropdown = link_to current_user, class: user_dropdown_class, data: { toggle: "dropdown" } do - = image_tag avatar_icon_for_user(current_user, 23), width: 23, height: 23, class: "header-user-avatar", data: { qa_selector: 'user_avatar' } + = render Pajamas::AvatarComponent.new(current_user, size: 24, class: 'gl-mr-3', avatar_options: { data: { qa_selector: 'user_avatar_content' } }) = sprite_icon('chevron-down') .dropdown-menu.dropdown-menu-right = render 'layouts/header/current_user_dropdown' diff --git a/app/views/notify/access_token_revoked_email.html.haml b/app/views/notify/access_token_revoked_email.html.haml new file mode 100644 index 00000000000..4d9b9e14d14 --- /dev/null +++ b/app/views/notify/access_token_revoked_email.html.haml @@ -0,0 +1,7 @@ +%p + = _('Hi %{username}!') % { username: sanitize_name(@user.name) } +%p + = html_escape(_('A personal access token, named %{code_start}%{token_name}%{code_end}, has been revoked.')) % { code_start: '<code>'.html_safe, token_name: @token_name, code_end: '</code>'.html_safe } +%p + - pat_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: @target_url } + = html_escape(_('You can check your tokens or create a new one in your %{pat_link_start}personal access tokens settings%{pat_link_end}.')) % { pat_link_start: pat_link_start, pat_link_end: '</a>'.html_safe } diff --git a/app/views/notify/access_token_revoked_email.text.erb b/app/views/notify/access_token_revoked_email.text.erb new file mode 100644 index 00000000000..17dd628d76c --- /dev/null +++ b/app/views/notify/access_token_revoked_email.text.erb @@ -0,0 +1,5 @@ +<%= _('Hi %{username}!') % { username: sanitize_name(@user.name) } %> + +<%= _('A personal access token, named %{token_name}, has been revoked.') % { token_name: @token_name } %> + +<%= _('You can check your tokens or create a new one in your personal access tokens settings %{pat_link}.') % { pat_link: @target_url } %> diff --git a/app/views/notify/project_was_exported_email.html.haml b/app/views/notify/project_was_exported_email.html.haml index 71c62f6be4e..11d761414ff 100644 --- a/app/views/notify/project_was_exported_email.html.haml +++ b/app/views/notify/project_was_exported_email.html.haml @@ -1,8 +1,8 @@ %p - Project #{@project.name} was exported successfully. + = s_('Notify|Project %{project_name} was exported successfully.') % {project_name: @project.name} %p - The project export can be downloaded from: - = link_to download_export_project_url(@project), rel: 'nofollow', download: '' do - = @project.full_name + " export" + - project_link_url = download_export_project_url(@project) + - project_link_start = '<a href="%{url}" target="_blank" rel="nofollow" download="">'.html_safe % { url: project_link_url } + = html_escape(s_('Notify|%{project_link_start}Download%{project_link_end} the project export.')) % {project_link_start: project_link_start, project_link_end: '</a>'.html_safe} %p - The download link will expire in 24 hours. + = s_('Notify|The download link will expire in 24 hours.') diff --git a/app/views/notify/project_was_moved_email.html.haml b/app/views/notify/project_was_moved_email.html.haml index 1b6b1a81665..45bec221e08 100644 --- a/app/views/notify/project_was_moved_email.html.haml +++ b/app/views/notify/project_was_moved_email.html.haml @@ -1,15 +1,9 @@ +- repo_url_styles = "background: #f5f5f5; padding:10px; border:1px solid #ddd" +- ssh_url_to_repo = content_tag(:p, "git remote set-url origin #{strip_tags(@project.ssh_url_to_repo)}", style: repo_url_styles) +- http_url_to_repo = content_tag(:p, "git remote set-url origin #{strip_tags(@project.http_url_to_repo)}", style: repo_url_styles) %p - Project #{@old_path_with_namespace} was moved to another location + = s_('Notify|Project %{old_path_with_namespace} was moved to another location.') % { old_path_with_namespace: @old_path_with_namespace } %p - The project is now located under - = link_to project_url(@project) do - = @project.full_name -%p - To update the remote url in your local repository run (for ssh): -%p{ style: "background: #f5f5f5; padding:10px; border:1px solid #ddd" } - git remote set-url origin #{@project.ssh_url_to_repo} -%p - or for http(s): -%p{ style: "background: #f5f5f5; padding:10px; border:1px solid #ddd" } - git remote set-url origin #{@project.http_url_to_repo} -%br + - project_full_name_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: project_url(@project) } + = html_escape(s_('Notify|The project is now located under %{project_full_name_link_start}%{project_full_name}%{link_end}.')) % { project_full_name_link_start: project_full_name_link_start, link_end: '</a>'.html_safe, project_full_name: @project.full_name } += html_escape(s_('Notify|%{p_start}To update the remote url in your local repository run (for ssh):%{p_end} %{ssh_url_to_repo} %{p_start}or for http(s):%{p_end} %{http_url_to_repo}')) % { p_start: '<p>'.html_safe, p_end: '</p>'.html_safe, ssh_url_to_repo: ssh_url_to_repo, http_url_to_repo: http_url_to_repo } diff --git a/app/views/notify/project_was_not_exported_email.html.haml b/app/views/notify/project_was_not_exported_email.html.haml index c888da29c17..dcd212099b5 100644 --- a/app/views/notify/project_was_not_exported_email.html.haml +++ b/app/views/notify/project_was_not_exported_email.html.haml @@ -1,7 +1,7 @@ %p - Project #{@project.name} couldn't be exported. + = s_("Notify|Project %{project_name} couldn't be exported.") % {project_name: @project.name} %p - The errors we encountered were: + = s_('Notify|The errors we encountered were:') %ul - @errors.each do |error| diff --git a/app/views/notify/repository_push_email.text.haml b/app/views/notify/repository_push_email.text.haml index 895d8807e47..2ba0a2cf4ab 100644 --- a/app/views/notify/repository_push_email.text.haml +++ b/app/views/notify/repository_push_email.text.haml @@ -13,7 +13,7 @@ \- - - - - \ \ - #{pluralize @message.diffs_count, "changed file"}: + #{pluralize @message.diffs_count, 'changed file'}: \ - @message.diffs.each do |diff_file| - if diff_file.deleted_file? diff --git a/app/views/notify/request_review_merge_request_email.html.haml b/app/views/notify/request_review_merge_request_email.html.haml index d1f72f6529a..a8c7df79ff3 100644 --- a/app/views/notify/request_review_merge_request_email.html.haml +++ b/app/views/notify/request_review_merge_request_email.html.haml @@ -1,2 +1,2 @@ %p - #{sanitize_name(@updated_by.name)} requested a new review on #{merge_request_reference_link(@merge_request)}. + = html_escape(s_('Notify|%{name} requested a new review on %{mr_link}.')) % {name: sanitize_name(@updated_by.name), mr_link: merge_request_reference_link(@merge_request).html_safe} diff --git a/app/views/notify/send_unsubscribed_notification.html.haml b/app/views/notify/send_unsubscribed_notification.html.haml index 9f68feeaa31..ef1577dde97 100644 --- a/app/views/notify/send_unsubscribed_notification.html.haml +++ b/app/views/notify/send_unsubscribed_notification.html.haml @@ -1,2 +1,2 @@ %p - You have been unsubscribed from receiving GitLab administrator notifications. + = s_('Notify|You have been unsubscribed from receiving GitLab administrator notifications.') diff --git a/app/views/notify/two_factor_otp_attempt_failed_email.html.haml b/app/views/notify/two_factor_otp_attempt_failed_email.html.haml new file mode 100644 index 00000000000..fec7083e524 --- /dev/null +++ b/app/views/notify/two_factor_otp_attempt_failed_email.html.haml @@ -0,0 +1,51 @@ +- default_font = "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;" +- default_style = "#{default_font}font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;" +- spacer_style = "#{default_font};height:18px;font-size:18px;line-height:18px;" + +%tr.alert + %td{ style: "#{default_font}padding:10px;border-radius:3px;font-size:14px;line-height:1.3;text-align:center;overflow:hidden;color:#ffffff;background-color:#FC6D26;" } + %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;margin:0 auto;" } + %tbody + %tr + %td{ style: "#{default_font}vertical-align:middle;color:#ffffff;text-align:center;" } + %span + = _("We detected an attempt to sign in to your %{host} account using a wrong two-factor authentication code") % { host: Gitlab.config.gitlab.host } +%tr.spacer + %td{ style: spacer_style } + +%tr.section + %td{ style: "#{default_font};padding:0 15px;border:1px solid #ededed;border-radius:3px;overflow:hidden;" } + %table.info{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:100%;" } + %tbody + %tr + %td{ style: default_style } + = _('Hostname') + %td{ style: "#{default_style}color:#333333;font-weight:400;width:75%;padding-left:5px;" } + = Gitlab.config.gitlab.host + %tr + %td{ style: "#{default_style}border-top:1px solid #ededed;" } + = _('IP Address') + %td{ style: "#{default_style}color:#333333;font-weight:400;width:75%;padding-left:5px;border-top:1px solid #ededed;" } + %span.muted{ style: "color:#333333;text-decoration:none;" } + = @ip + %tr + %td{ style: "#{default_style}border-top:1px solid #ededed;" } + = _('Time') + %td{ style: "#{default_style}color:#333333;font-weight:400;width:75%;padding-left:5px;border-top:1px solid #ededed;" } + = @time.strftime('%Y-%m-%d %H:%M:%S %Z') +%tr.spacer + %td{ style: spacer_style } + +%tr.section + %td{ style: "#{default_font};line-height:1.4;text-align:center;padding:0 15px;overflow:hidden;" } + %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;width:100%;" } + %tbody + %tr{ style: 'width:100%;' } + %td{ style: "#{default_style}text-align:center;" } + - password_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: 'https://docs.gitlab.com/ee/user/profile/user_passwords.html#change-your-password' } + = _('If you recently tried to sign in, but mistakenly entered a wrong two-factor authentication code, you may ignore this email.') + + - if password_authentication_enabled_for_web? + %p + = _('If you did not recently try to 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 } + = _('Make sure you choose a strong, unique password.') diff --git a/app/views/notify/two_factor_otp_attempt_failed_email.text.haml b/app/views/notify/two_factor_otp_attempt_failed_email.text.haml new file mode 100644 index 00000000000..8f839cd83ee --- /dev/null +++ b/app/views/notify/two_factor_otp_attempt_failed_email.text.haml @@ -0,0 +1,7 @@ += _('Hi %{username}!') % { username: sanitize_name(@user.name) } + += _('We detected an attempt to sign in to your %{host} account using a wrong two-factor authentication code, from the following IP address: %{ip}, at %{time}') % { host: Gitlab.config.gitlab.host, ip: @ip, time: @time } + += _('If you recently tried to sign in, but mistakenly entered a wrong two-factor authentication code, you may ignore this email.') += _('If you did not recently try to sign in, you should immediately change your password: %{password_link}.') % { password_link: 'https://docs.gitlab.com/ee/user/profile/user_passwords.html#change-your-password' } += _('Make sure you choose a strong, unique password.') diff --git a/app/views/notify/unknown_sign_in_email.html.haml b/app/views/notify/unknown_sign_in_email.html.haml index 47c5656db27..b1c79274e26 100644 --- a/app/views/notify/unknown_sign_in_email.html.haml +++ b/app/views/notify/unknown_sign_in_email.html.haml @@ -42,7 +42,7 @@ %tbody %tr{ style: 'width:100%;' } %td{ style: "#{default_style}text-align:center;" } - - password_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: 'https://docs.gitlab.com/ee/user/profile/#changing-your-password' } + - password_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: 'https://docs.gitlab.com/ee/user/profile/user_passwords.html#change-your-password' } = _('If you recently signed in and recognize the IP address, you may disregard this email.') - if password_authentication_enabled_for_web? diff --git a/app/views/notify/unknown_sign_in_email.text.haml b/app/views/notify/unknown_sign_in_email.text.haml index f3efc4c4fcd..54c7a245ab9 100644 --- a/app/views/notify/unknown_sign_in_email.text.haml +++ b/app/views/notify/unknown_sign_in_email.text.haml @@ -3,7 +3,7 @@ = _('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' } += _('If you did not recently sign in, you should immediately change your password: %{password_link}.') % { password_link: 'https://docs.gitlab.com/ee/user/profile/user_passwords.html#change-your-password' } = _('Passwords should be unique and not used for any other sites or services.') - unless @user.two_factor_enabled? diff --git a/app/views/profiles/active_sessions/index.html.haml b/app/views/profiles/active_sessions/index.html.haml index be835233528..e9e6ca3ecce 100644 --- a/app/views/profiles/active_sessions/index.html.haml +++ b/app/views/profiles/active_sessions/index.html.haml @@ -1,7 +1,7 @@ - page_title _('Active Sessions') - @content_class = "limit-container-width" unless fluid_layout -.row.gl-mt-3 +.row.gl-mt-3.js-search-settings-section .col-lg-4.profile-settings-sidebar %h4.gl-mt-0 = page_title diff --git a/app/views/profiles/audit_log.html.haml b/app/views/profiles/audit_log.html.haml index 4bbb4a21b39..9997c8c4b4c 100644 --- a/app/views/profiles/audit_log.html.haml +++ b/app/views/profiles/audit_log.html.haml @@ -1,7 +1,7 @@ - page_title _('Authentication log') - @content_class = "limit-container-width" unless fluid_layout -.row.gl-mt-3 +.row.gl-mt-3.js-search-settings-section .col-lg-4.profile-settings-sidebar %h4.gl-mt-0 = page_title diff --git a/app/views/profiles/chat_names/index.html.haml b/app/views/profiles/chat_names/index.html.haml index 54c34228800..41bd81d0250 100644 --- a/app/views/profiles/chat_names/index.html.haml +++ b/app/views/profiles/chat_names/index.html.haml @@ -1,7 +1,7 @@ - page_title _('Chat') - @content_class = "limit-container-width" unless fluid_layout -.row.gl-mt-3 +.row.gl-mt-3.js-search-settings-section .col-lg-4.profile-settings-sidebar %h4.gl-mt-0 = page_title diff --git a/app/views/profiles/emails/index.html.haml b/app/views/profiles/emails/index.html.haml index 1b8f0328a04..f4513d15a30 100644 --- a/app/views/profiles/emails/index.html.haml +++ b/app/views/profiles/emails/index.html.haml @@ -1,7 +1,7 @@ - page_title _('Emails') - @content_class = "limit-container-width" unless fluid_layout -.row.gl-mt-3 +.row.gl-mt-3.js-search-settings-section .col-lg-4.profile-settings-sidebar %h4.gl-mt-0 = page_title @@ -10,12 +10,12 @@ .col-lg-8 %h4.gl-mt-0 = _('Add email address') - = form_for 'email', url: profile_emails_path do |f| + = gitlab_ui_form_for 'email', url: profile_emails_path do |f| .form-group = f.label :email, _('Email'), class: 'label-bold' = f.text_field :email, class: 'form-control gl-form-input', data: { qa_selector: 'email_address_field' } .gl-mt-3 - = f.submit _('Add email address'), class: 'gl-button btn btn-confirm', data: { qa_selector: 'add_email_address_button' } + = f.submit _('Add email address'), data: { qa_selector: 'add_email_address_button' }, pajamas_button: true %hr %h4.gl-mt-0 = _('Linked emails (%{email_count})') % { email_count: @emails.load.size } diff --git a/app/views/profiles/gpg_keys/_form.html.haml b/app/views/profiles/gpg_keys/_form.html.haml index 9804a3b7735..ffd8bc3de27 100644 --- a/app/views/profiles/gpg_keys/_form.html.haml +++ b/app/views/profiles/gpg_keys/_form.html.haml @@ -1,5 +1,5 @@ %div - = form_for [:profile, @gpg_key], html: { class: 'js-requires-input' } do |f| + = gitlab_ui_form_for [:profile, @gpg_key], html: { class: 'js-requires-input' } do |f| = form_errors(@gpg_key) .form-group @@ -7,4 +7,4 @@ = f.text_area :key, class: "form-control gl-form-input", rows: 8, required: true, placeholder: _("Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'.") .gl-mt-3 - = f.submit s_('Profiles|Add key'), class: "gl-button btn btn-confirm" + = f.submit s_('Profiles|Add key'), pajamas_button: true diff --git a/app/views/profiles/gpg_keys/index.html.haml b/app/views/profiles/gpg_keys/index.html.haml index 91af6953ee1..539a0cd1f0e 100644 --- a/app/views/profiles/gpg_keys/index.html.haml +++ b/app/views/profiles/gpg_keys/index.html.haml @@ -1,7 +1,8 @@ - page_title _('GPG Keys') +- add_page_specific_style 'page_bundles/profile' - @content_class = "limit-container-width" unless fluid_layout -.row.gl-mt-3 +.row.gl-mt-3.js-search-settings-section .col-lg-4.profile-settings-sidebar %h4.gl-mt-0 = page_title diff --git a/app/views/profiles/keys/_form.html.haml b/app/views/profiles/keys/_form.html.haml index 6f7eb21b7e0..b37a0d9cc1a 100644 --- a/app/views/profiles/keys/_form.html.haml +++ b/app/views/profiles/keys/_form.html.haml @@ -1,6 +1,6 @@ - max_date = ::Gitlab::CurrentSettings.max_ssh_key_lifetime_from_now.to_date if ssh_key_expiration_policy_enabled? %div - = form_for [:profile, @key], html: { class: 'js-requires-input' } do |f| + = gitlab_ui_form_for [:profile, @key], html: { class: 'js-requires-input' } do |f| = form_errors(@key) .form-group @@ -29,4 +29,4 @@ button_options: { class: 'js-add-ssh-key-validation-confirm-submit' }) do = _("Yes, add it") .gl-mt-3 - = f.submit s_('Profiles|Add key'), class: "gl-button btn btn-confirm js-add-ssh-key-validation-original-submit qa-add-key-button" + = f.submit s_('Profiles|Add key'), class: "js-add-ssh-key-validation-original-submit qa-add-key-button", pajamas_button: true diff --git a/app/views/profiles/keys/_key_details.html.haml b/app/views/profiles/keys/_key_details.html.haml index 8016d989ff1..04fa1d96204 100644 --- a/app/views/profiles/keys/_key_details.html.haml +++ b/app/views/profiles/keys/_key_details.html.haml @@ -1,39 +1,40 @@ - is_admin = defined?(admin) ? true : false .row.gl-mt-3 .col-md-4 - .card - .card-header + = render Pajamas::CardComponent.new(body_options: { class: 'gl-py-0'}) do |c| + - c.header do = _('SSH Key') - %ul.content-list - %li - %span.light= _('Title:') - %strong= @key.title - %li - %span.light= _('Created on:') - %strong= @key.created_at.to_s(:medium) - %li - %span.light= _('Expires:') - %strong= @key.expires_at.try(:to_s, :medium) || _('Never') - %li - %span.light= _('Last used on:') - %strong= @key.last_used_at.try(:to_s, :medium) || _('Never') + - c.body do + %ul.content-list + %li + %span.light= _('Title:') + %strong= @key.title + %li + %span.light= _('Created on:') + %strong= @key.created_at.to_s(:medium) + %li + %span.light= _('Expires:') + %strong= @key.expires_at.try(:to_s, :medium) || _('Never') + %li + %span.light= _('Last used on:') + %strong= @key.last_used_at.try(:to_s, :medium) || _('Never') .col-md-8 = form_errors(@key, type: 'key') unless @key.valid? %pre.well-pre = @key.key - .card - .card-header + = render Pajamas::CardComponent.new(body_options: { class: 'gl-py-0'}) do |c| + - c.header do = _('Fingerprints') - %ul.content-list - %li - %span.light= 'MD5:' - %code.key-fingerprint= @key.fingerprint - - if @key.fingerprint_sha256.present? + - c.body do + %ul.content-list %li - %span.light= 'SHA256:' - %code.key-fingerprint= @key.fingerprint_sha256 - + %span.light= 'MD5:' + %code.key-fingerprint= @key.fingerprint + - if @key.fingerprint_sha256.present? + %li + %span.light= 'SHA256:' + %code.key-fingerprint= @key.fingerprint_sha256 .col-md-12 .float-right diff --git a/app/views/profiles/keys/index.html.haml b/app/views/profiles/keys/index.html.haml index 35bf7d81502..69e92b9e508 100644 --- a/app/views/profiles/keys/index.html.haml +++ b/app/views/profiles/keys/index.html.haml @@ -1,7 +1,8 @@ - page_title _('SSH Keys') +- add_page_specific_style 'page_bundles/profile' - @content_class = "limit-container-width" unless fluid_layout -.row.gl-mt-3 +.row.gl-mt-3.js-search-settings-section .col-lg-4.profile-settings-sidebar %h4.gl-mt-0 = page_title diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml index 0f4b130a774..23a0d824bfe 100644 --- a/app/views/profiles/notifications/show.html.haml +++ b/app/views/profiles/notifications/show.html.haml @@ -10,7 +10,7 @@ %li= msg = hidden_field_tag :notification_type, 'global' - .row.gl-mt-3 + .row.gl-mt-3.js-search-settings-section .col-lg-4.profile-settings-sidebar %h4.gl-mt-0 = page_title diff --git a/app/views/profiles/passwords/edit.html.haml b/app/views/profiles/passwords/edit.html.haml index 257255eb4d7..99c89dcebb4 100644 --- a/app/views/profiles/passwords/edit.html.haml +++ b/app/views/profiles/passwords/edit.html.haml @@ -2,7 +2,7 @@ - page_title _('Password') - @content_class = "limit-container-width" unless fluid_layout -.row.gl-mt-3 +.row.gl-mt-3.js-search-settings-section .col-lg-4.profile-settings-sidebar %h4.gl-mt-0 = page_title @@ -14,7 +14,7 @@ = _('Change your password') - else = _('Change your password or recover your current one') - = form_for @user, url: profile_password_path, method: :put, html: {class: "update-password"} do |f| + = gitlab_ui_form_for @user, url: profile_password_path, method: :put, html: {class: "update-password"} do |f| = form_errors(@user) - unless @user.password_automatically_set? @@ -31,6 +31,7 @@ = f.label :password_confirmation, _('Password confirmation'), class: 'label-bold' = f.password_field :password_confirmation, required: true, autocomplete: 'new-password', class: 'form-control gl-form-input', data: { qa_selector: 'confirm_password_field' } .gl-mt-3.gl-mb-3 - = f.submit _('Save password'), class: "gl-button btn btn-confirm gl-mr-3", data: { qa_selector: 'save_password_button' } + = f.submit _('Save password'), class: "gl-mr-3", data: { qa_selector: 'save_password_button' }, pajamas_button: true - unless @user.password_automatically_set? - = link_to _('I forgot my password'), reset_profile_password_path, method: :put + = render Pajamas::ButtonComponent.new(href: reset_profile_password_path, variant: :link, method: :put) do + = _('I forgot my password') diff --git a/app/views/profiles/passwords/new.html.haml b/app/views/profiles/passwords/new.html.haml index 6f260eb4cc0..a0a9077afe4 100644 --- a/app/views/profiles/passwords/new.html.haml +++ b/app/views/profiles/passwords/new.html.haml @@ -3,7 +3,7 @@ %h1.page-title.gl-font-size-h-display= _('Set up new password') %hr -= form_for @user, url: profile_password_path, method: :post do |f| += gitlab_ui_form_for @user, url: profile_password_path, method: :post do |f| %p.slead = _('Please set a new password before proceeding.') %br @@ -29,4 +29,4 @@ .col-sm-10 = f.password_field :password_confirmation, required: true, autocomplete: 'new-password', class: 'form-control gl-form-input', data: { qa_selector: 'confirm_password_field' } .form-actions - = f.submit _('Set new password'), class: 'gl-button btn btn-confirm', data: { qa_selector: 'set_new_password_button' } + = f.submit _('Set new password'), data: { qa_selector: 'set_new_password_button' }, pajamas_button: true diff --git a/app/views/profiles/preferences/show.html.haml b/app/views/profiles/preferences/show.html.haml index e16108c5c22..a1d6ef3fec5 100644 --- a/app/views/profiles/preferences/show.html.haml +++ b/app/views/profiles/preferences/show.html.haml @@ -104,6 +104,10 @@ = f.gitlab_ui_checkbox_component :markdown_surround_selection, s_('Preferences|Surround text selection when typing quotes or brackets'), help_text: sprintf(s_( "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."), { supported_characters: supported_characters }).html_safe + .form-group + = f.gitlab_ui_checkbox_component :markdown_automatic_lists, + s_('Preferences|Automatically add new list items'), + help_text: html_escape(s_('Preferences|When you type in a description or comment box, pressing %{kbdOpen}Enter%{kbdClose} in a list adds a new item below.')) % { kbdOpen: '<kbd>'.html_safe, kbdClose: '</kbd>'.html_safe } .form-group = f.label :tab_width, s_('Preferences|Tab width'), class: 'label-bold' diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml index f38d6021b18..dfaa4c31cdf 100644 --- a/app/views/profiles/show.html.haml +++ b/app/views/profiles/show.html.haml @@ -1,5 +1,6 @@ - breadcrumb_title s_("Profiles|Edit Profile") - page_title s_("Profiles|Edit Profile") +- add_page_specific_style 'page_bundles/profile' - @content_class = "limit-container-width" unless fluid_layout - gravatar_link = link_to Gitlab.config.gravatar.host, 'https://' + Gitlab.config.gravatar.host @@ -25,15 +26,21 @@ .col-lg-8 .avatar-image = link_to avatar_icon_for_user(@user, 400), target: '_blank', rel: 'noopener noreferrer' do - = image_tag avatar_icon_for_user(@user, 96), alt: '', class: 'avatar s96' + = render Pajamas::AvatarComponent.new(@user, size: 96, alt: "", class: 'gl-float-left gl-mr-5') %h5.gl-mt-0= s_("Profiles|Upload new avatar") - .gl-my-3 - %button.gl-button.btn.btn-default.js-choose-user-avatar-button{ type: 'button' }= s_("Profiles|Choose file...") - %span.avatar-file-name.gl-ml-3.js-avatar-filename= s_("Profiles|No file chosen.") + .gl-display-flex.gl-align-items-center.gl-my-3 + = render Pajamas::ButtonComponent.new(button_options: { class: 'js-choose-user-avatar-button' }) do + = s_("Profiles|Choose file...") + %span.gl-ml-3.js-avatar-filename= s_("Profiles|No file chosen.") = f.file_field :avatar, class: 'js-user-avatar-input hidden', accept: 'image/*' .gl-text-gray-500= s_("Profiles|The maximum file size allowed is 200KB.") - if @user.avatar? - = link_to s_("Profiles|Remove avatar"), profile_avatar_path, data: { confirm: s_("Profiles|Avatar will be removed. Are you sure?") }, method: :delete, class: 'gl-button btn btn-danger-secondary btn-sm gl-mt-5' + = render Pajamas::ButtonComponent.new(variant: :danger, + category: :secondary, + href: profile_avatar_path, + button_options: { class: 'gl-mt-3', data: { confirm: s_("Profiles|Avatar will be removed. Are you sure?") } }, + method: :delete) do + = s_("Profiles|Remove avatar") .col-lg-12 %hr .row.js-search-settings-section @@ -54,9 +61,8 @@ %h4.gl-mt-0= s_("Profiles|Time settings") %p= s_("Profiles|Set your local time zone.") .col-lg-8 - %h5= _("Time zone") - = dropdown_tag(_("Select a time zone"), options: { toggle_class: 'gl-button btn js-timezone-dropdown input-lg gl-w-full!', title: _("Select a time zone"), filter: true, placeholder: s_("OfSearchInADropdown|Filter"), data: { data: timezone_data } } ) - %input.hidden{ :type => 'hidden', :id => 'user_timezone', :name => 'user[timezone]', value: @user.timezone } + = f.label :user_timezone, _("Time zone") + .js-timezone-dropdown{ data: { timezone_data: timezone_data.to_json, initial_value: @user.timezone } } .col-lg-12 %hr .row.js-search-settings-section @@ -134,9 +140,12 @@ = f.gitlab_ui_checkbox_component :include_private_contributions, s_('Profiles|Include private contributions on my profile'), help_text: s_("Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information.") - %hr - = f.submit s_("Profiles|Update profile settings"), class: 'gl-button btn btn-confirm gl-mr-3 js-password-prompt-btn' - = link_to _("Cancel"), user_path(current_user), class: 'gl-button btn btn-default btn-cancel' + .row.js-hide-when-nothing-matches-search + .col-lg-12 + %hr + = f.submit s_("Profiles|Update profile settings"), class: 'gl-mr-3 js-password-prompt-btn', pajamas_button: true + = render Pajamas::ButtonComponent.new(href: user_path(current_user)) do + = s_('TagsPage|Cancel') #password-prompt-modal @@ -146,19 +155,19 @@ .modal-header %h4.modal-title = s_("Profiles|Position and size your new avatar") - %button.close{ type: "button", "data-dismiss": "modal", "aria-label" => _("Close") } - %span{ "aria-hidden": "true" } × + = render Pajamas::ButtonComponent.new(category: :tertiary, + icon: 'close', + button_options: { class: 'close', "data-dismiss": "modal", "aria-label" => _("Close") }) .modal-body .profile-crop-image-container %img.modal-profile-crop-image{ alt: s_("Profiles|Avatar cropper") } - .crop-controls + .gl-text-center.gl-mt-4 .btn-group - %button.btn.gl-button.btn-default{ data: { method: 'zoom', option: '-0.1' } } - %span - = sprite_icon('search-minus') - %button.btn.gl-button.btn-default{ data: { method: 'zoom', option: '0.1' } } - %span - = sprite_icon('search-plus') + = render Pajamas::ButtonComponent.new(icon: 'search-minus', + button_options: {data: { method: 'zoom', option: '-0.1' }}) + = render Pajamas::ButtonComponent.new(icon: 'search-plus', + button_options: {data: { method: 'zoom', option: '0.1' }}) .modal-footer - %button.btn.gl-button.btn-confirm.js-upload-user-avatar{ type: 'button' } + = render Pajamas::ButtonComponent.new(variant: :confirm, + button_options: { class: 'js-upload-user-avatar'}) do = s_("Profiles|Set new profile picture") diff --git a/app/views/profiles/two_factor_auths/show.html.haml b/app/views/profiles/two_factor_auths/show.html.haml index 855c73fd323..4c045574834 100644 --- a/app/views/profiles/two_factor_auths/show.html.haml +++ b/app/views/profiles/two_factor_auths/show.html.haml @@ -17,6 +17,13 @@ = _("You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication.") %p = _('If you lose your recovery codes you can generate new ones, invalidating all previous codes.') + - if @error + = render Pajamas::AlertComponent.new(title: @error[:message], + variant: :danger, + alert_options: { class: 'gl-mb-3' }, + dismissible: false) do |c| + = c.body do + = link_to _('Try the troubleshooting steps here.'), help_page_path('user/profile/account/two_factor_authentication.md', anchor: 'troubleshooting'), target: '_blank', rel: 'noopener noreferrer' .js-manage-two-factor-form{ data: { webauthn_enabled: webauthn_enabled, current_password_required: current_password_required?.to_s, profile_two_factor_auth_path: profile_two_factor_auth_path, profile_two_factor_auth_method: 'delete', codes_profile_two_factor_auth_path: codes_profile_two_factor_auth_path, codes_profile_two_factor_auth_method: 'post' } } - else @@ -46,6 +53,7 @@ - if @error = render Pajamas::AlertComponent.new(title: @error[:message], variant: :danger, + alert_options: { class: 'gl-mb-3' }, dismissible: false) do |c| = c.body do = link_to _('Try the troubleshooting steps here.'), help_page_path('user/profile/account/two_factor_authentication.md', anchor: 'troubleshooting'), target: '_blank', rel: 'noopener noreferrer' diff --git a/app/views/projects/_fork_suggestion.html.haml b/app/views/projects/_fork_suggestion.html.haml index 55e609c0ffb..47d60593b4a 100644 --- a/app/views/projects/_fork_suggestion.html.haml +++ b/app/views/projects/_fork_suggestion.html.haml @@ -2,6 +2,7 @@ - message = message_base.html_safe % { edit_start: '<span class="js-file-fork-suggestion-section-action">'.html_safe, edit_end: '</span>'.html_safe } .js-file-fork-suggestion-section.file-fork-suggestion.hidden %span.file-fork-suggestion-note= message - = link_to s_('ForkSuggestion|Fork'), nil, method: :post, class: 'js-fork-suggestion-button gl-button btn btn-grouped btn-confirm-secondary' - %button.js-cancel-fork-suggestion-button.gl-button.btn.btn-grouped{ type: 'button' } + = render Pajamas::ButtonComponent.new(type: :submit, variant: :confirm, category: :secondary, button_options: { class: "js-fork-suggestion-button btn-grouped" }) do + = s_('ForkSuggestion|Fork') + = render Pajamas::ButtonComponent.new(button_options: { class: "js-cancel-fork-suggestion-button btn-grouped" }) do = s_('ForkSuggestion|Cancel') diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml index 7ff58d12b9c..a862b841008 100644 --- a/app/views/projects/_home_panel.html.haml +++ b/app/views/projects/_home_panel.html.haml @@ -24,7 +24,7 @@ %span.gl-ml-3.gl-mb-3 = render 'shared/members/access_request_links', source: @project - = cache_if(cache_enabled, [@project, :buttons, current_user, @notification_setting], expires_in: 1.day) do + = cache_if(cache_enabled, [@project, @project.star_count, @project.forks_count, :buttons, current_user, @notification_setting], expires_in: 1.day) do .project-repo-buttons.gl-display-flex.gl-justify-content-md-end.gl-align-items-start.gl-flex-wrap.gl-mt-5 - if current_user - if current_user.admin? diff --git a/app/views/projects/_new_project_fields.html.haml b/app/views/projects/_new_project_fields.html.haml index 98cd831d6f1..0699e39b420 100644 --- a/app/views/projects/_new_project_fields.html.haml +++ b/app/views/projects/_new_project_fields.html.haml @@ -92,5 +92,5 @@ -# this partial is from JiHu, see details in https://jihulab.com/gitlab-cn/gitlab/-/merge_requests/675 = render_if_exists 'shared/other_project_options', f: f, visibility_level: visibility_level, track_label: track_label -= f.submit _('Create project'), class: "btn gl-button btn-confirm js-create-project-button", data: { qa_selector: 'project_create_button', track_label: "#{track_label}", track_action: "click_button", track_property: "create_project", track_value: "" } += f.submit _('Create project'), class: "js-create-project-button", data: { qa_selector: 'project_create_button', track_label: "#{track_label}", track_action: "click_button", track_property: "create_project", track_value: "" }, pajamas_button: true = link_to _('Cancel'), dashboard_projects_path, class: 'btn gl-button btn-default btn-cancel', data: { track_label: "#{track_label}", track_action: "click_button", track_property: "cancel", track_value: "" } diff --git a/app/views/projects/_transfer.html.haml b/app/views/projects/_transfer.html.haml index 02aa1f7e93b..e3aa2d8afc9 100644 --- a/app/views/projects/_transfer.html.haml +++ b/app/views/projects/_transfer.html.haml @@ -1,7 +1,7 @@ - return unless can?(current_user, :change_namespace, @project) - form_id = "transfer-project-form" - hidden_input_id = "new_namespace_id" -- initial_data = { button_text: s_('ProjectSettings|Transfer project'), confirm_danger_message: transfer_project_message(@project), phrase: @project.name, target_form_id: form_id, target_hidden_input_id: hidden_input_id } +- initial_data = { button_text: s_('ProjectSettings|Transfer project'), confirm_danger_message: transfer_project_message(@project), phrase: @project.name, target_form_id: form_id, target_hidden_input_id: hidden_input_id, project_id: @project.id } .sub-section %h4.danger-title= _('Transfer project') diff --git a/app/views/projects/artifacts/browse.html.haml b/app/views/projects/artifacts/browse.html.haml index 3ebac785d55..c91dfe6d28e 100644 --- a/app/views/projects/artifacts/browse.html.haml +++ b/app/views/projects/artifacts/browse.html.haml @@ -1,5 +1,6 @@ - breadcrumb_title _('Artifacts') - page_title @path.presence, _('Artifacts'), "#{@build.name} (##{@build.id})", _('Jobs') +- add_page_specific_style 'page_bundles/tree' = render "projects/jobs/header" diff --git a/app/views/projects/artifacts/file.html.haml b/app/views/projects/artifacts/file.html.haml index 1ad70506be4..e16e3ef266d 100644 --- a/app/views/projects/artifacts/file.html.haml +++ b/app/views/projects/artifacts/file.html.haml @@ -1,4 +1,5 @@ - page_title @path, _('Artifacts'), "#{@build.name} (##{@build.id})", _('Jobs') +- add_page_specific_style 'page_bundles/tree' = render "projects/jobs/header" diff --git a/app/views/projects/blame/show.html.haml b/app/views/projects/blame/show.html.haml index f2c4fe017f2..dd041377b49 100644 --- a/app/views/projects/blame/show.html.haml +++ b/app/views/projects/blame/show.html.haml @@ -1,6 +1,7 @@ - page_title _("Blame"), @blob.path, @ref +- add_page_specific_style 'page_bundles/tree' -#blob-content-holder.tree-holder{ data: { testid: 'blob-content-holder' } } +#blob-content-holder.tree-holder.js-per-page{ data: { testid: 'blob-content-holder', per_page: @blame_per_page } } = render "projects/blob/breadcrumb", blob: @blob, blame: true .file-holder.gl-overflow-hidden diff --git a/app/views/projects/blob/_blob.html.haml b/app/views/projects/blob/_blob.html.haml index 4139be053f8..9fd542e0cfb 100644 --- a/app/views/projects/blob/_blob.html.haml +++ b/app/views/projects/blob/_blob.html.haml @@ -10,7 +10,7 @@ %ul.blob-commit-info = render 'projects/commits/commit', commit: @last_commit, project: @project, ref: @ref - = render_if_exists 'projects/blob/owners', blob: blob + #js-code-owners{ data: { blob_path: blob.path, project_path: @project.full_path, branch: @ref } } = render "projects/blob/auxiliary_viewer", blob: blob #blob-content-holder.blob-content-holder diff --git a/app/views/projects/blob/_editor.html.haml b/app/views/projects/blob/_editor.html.haml index 398ca3dd27c..bd08ab67cd3 100644 --- a/app/views/projects/blob/_editor.html.haml +++ b/app/views/projects/blob/_editor.html.haml @@ -28,16 +28,12 @@ .file-buttons.gl-display-flex.gl-align-items-center.gl-justify-content-end - if is_markdown - = render 'shared/blob/markdown_buttons', show_fullscreen_button: false - = button_tag class: 'soft-wrap-toggle btn gl-button btn-default', type: 'button', tabindex: '-1' do - .no-wrap - = sprite_icon('soft-unwrap', css_class: 'gl-button-icon') - %span.gl-button-text - No wrap - .soft-wrap - = sprite_icon('soft-wrap', css_class: 'gl-button-icon') - %span.gl-button-text - Soft wrap + = render 'shared/blob/markdown_buttons', show_fullscreen_button: false, supports_file_upload: false + %span.soft-wrap-toggle + = render Pajamas::ButtonComponent.new(icon: 'soft-unwrap', button_options: { class: 'no-wrap' }) do + = _("No wrap") + = render Pajamas::ButtonComponent.new(icon: 'soft-wrap', button_options: { class: 'soft-wrap' }) do + = _("Soft wrap") .file-editor.code - if Feature.enabled?(:source_editor_toolbar, current_user) diff --git a/app/views/projects/blob/_pipeline_tour_success.html.haml b/app/views/projects/blob/_pipeline_tour_success.html.haml index 8f1c2f93162..0fa4a90e28b 100644 --- a/app/views/projects/blob/_pipeline_tour_success.html.haml +++ b/app/views/projects/blob/_pipeline_tour_success.html.haml @@ -2,5 +2,5 @@ 'go-to-pipelines-path': project_pipelines_path(@project), 'project-merge-requests-path': project_merge_requests_path(@project), 'example-link': help_page_path('ci/examples/index.md', anchor: 'gitlab-cicd-examples'), - 'code-quality-link': help_page_path('user/project/merge_requests/code_quality'), + 'code-quality-link': help_page_path('ci/testing/code_quality'), 'human-access': @project.team.human_max_access(current_user&.id) } } diff --git a/app/views/projects/blob/_template_selectors.html.haml b/app/views/projects/blob/_template_selectors.html.haml index a76e61bc3dd..249c474587c 100644 --- a/app/views/projects/blob/_template_selectors.html.haml +++ b/app/views/projects/blob/_template_selectors.html.haml @@ -2,14 +2,14 @@ .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' - = dropdown_tag(_(toggle_text), options: { toggle_class: 'js-template-type-selector qa-template-type-dropdown', dropdown_class: 'dropdown-menu-selectable' }) + = dropdown_tag(_(toggle_text), options: { toggle_class: 'js-template-type-selector', dropdown_class: 'dropdown-menu-selectable', data: { qa_selector: 'template_type_dropdown' } }) .license-selector.js-license-selector-wrap.js-template-selector-wrap.hidden - = dropdown_tag(_("Apply a template"), options: { toggle_class: 'js-license-selector qa-license-dropdown', dropdown_class: 'dropdown-menu-selectable', filter: true, placeholder: "Filter", data: { data: licenses_for_select(@project), project: @project.name, fullname: @project.namespace.human_name } } ) + = dropdown_tag(_("Apply a template"), options: { toggle_class: 'js-license-selector', dropdown_class: 'dropdown-menu-selectable', filter: true, placeholder: "Filter", data: { data: licenses_for_select(@project), project: @project.name, fullname: @project.namespace.human_name, qa_selector: 'license_dropdown' } } ) .gitignore-selector.js-gitignore-selector-wrap.js-template-selector-wrap.hidden - = dropdown_tag(_("Apply a template"), options: { toggle_class: 'js-gitignore-selector qa-gitignore-dropdown', dropdown_class: 'dropdown-menu-selectable', filter: true, placeholder: "Filter", data: { data: gitignore_names(@project) } } ) + = dropdown_tag(_("Apply a template"), options: { toggle_class: 'js-gitignore-selector', dropdown_class: 'dropdown-menu-selectable', filter: true, placeholder: "Filter", data: { data: gitignore_names(@project), qa_selector: 'gitignore_dropdown' } } ) .metrics-dashboard-selector.js-metrics-dashboard-selector-wrap.js-template-selector-wrap.hidden - = dropdown_tag(_("Apply a template"), options: { toggle_class: 'js-metrics-dashboard-selector qa-metrics-dashboard-dropdown', dropdown_class: 'dropdown-menu-selectable', filter: true, placeholder: "Filter", data: { data: metrics_dashboard_ymls(@project) } } ) + = dropdown_tag(_("Apply a template"), options: { toggle_class: 'js-metrics-dashboard-selector', dropdown_class: 'dropdown-menu-selectable', filter: true, placeholder: "Filter", data: { data: metrics_dashboard_ymls(@project), qa_selector: 'metrics_dashboard_dropdown' } } ) #gitlab-ci-yml-selector.gitlab-ci-yml-selector.js-gitlab-ci-yml-selector-wrap.js-template-selector-wrap.hidden - = dropdown_tag(_("Apply a template"), options: { toggle_class: 'js-gitlab-ci-yml-selector qa-gitlab-ci-yml-dropdown', dropdown_class: 'dropdown-menu-selectable', filter: true, placeholder: "Filter", data: { data: gitlab_ci_ymls(@project), selected: params[:template] } } ) + = dropdown_tag(_("Apply a template"), options: { toggle_class: 'js-gitlab-ci-yml-selector', dropdown_class: 'dropdown-menu-selectable', filter: true, placeholder: "Filter", data: { data: gitlab_ci_ymls(@project), selected: params[:template], qa_selector: 'gitlab_ci_yml_dropdown' } } ) .dockerfile-selector.js-dockerfile-selector-wrap.js-template-selector-wrap.hidden - = dropdown_tag(_("Apply a template"), options: { toggle_class: 'js-dockerfile-selector qa-dockerfile-dropdown', dropdown_class: 'dropdown-menu-selectable', filter: true, placeholder: "Filter", data: { data: dockerfile_names(@project) } } ) + = dropdown_tag(_("Apply a template"), options: { toggle_class: 'js-dockerfile-selector', dropdown_class: 'dropdown-menu-selectable', filter: true, placeholder: "Filter", data: { data: dockerfile_names(@project), qa_selector: 'dockerfile_dropdown' } } ) diff --git a/app/views/projects/blob/preview.html.haml b/app/views/projects/blob/preview.html.haml index 41a0045be89..6f559708d40 100644 --- a/app/views/projects/blob/preview.html.haml +++ b/app/views/projects/blob/preview.html.haml @@ -1,4 +1,4 @@ -- if markup?(@blob.name) +- if Gitlab::MarkupHelper.markup?(@blob.name) .file-content.md = markup(@blob.name, @content) - else diff --git a/app/views/projects/blob/show.html.haml b/app/views/projects/blob/show.html.haml index 33b2229f5d1..c8cf12c36f9 100644 --- a/app/views/projects/blob/show.html.haml +++ b/app/views/projects/blob/show.html.haml @@ -1,5 +1,6 @@ - breadcrumb_title _('Repository') - page_title @blob.path, @ref +- add_page_specific_style 'page_bundles/tree' - signatures_path = namespace_project_signatures_path(namespace_id: @project.namespace.full_path, project_id: @project.path, id: @last_commit, limit: 1) - content_for :prefetch_asset_tags do - webpack_preload_asset_tag('monaco', prefetch: true) diff --git a/app/views/projects/boards/index.html.haml b/app/views/projects/boards/index.html.haml index bb56769bd3f..e5b5f6404bb 100644 --- a/app/views/projects/boards/index.html.haml +++ b/app/views/projects/boards/index.html.haml @@ -1 +1 @@ -= render "shared/boards/show", board: @boards.first += render "shared/boards/show", board: @board diff --git a/app/views/projects/branch_rules/_show.html.haml b/app/views/projects/branch_rules/_show.html.haml index 46665fdb450..27525b441ab 100644 --- a/app/views/projects/branch_rules/_show.html.haml +++ b/app/views/projects/branch_rules/_show.html.haml @@ -9,4 +9,4 @@ = _('Define rules for who can push, merge, and the required approvals for each branch.') .settings-content.gl-pr-0 - #js-branch-rules{ data: { project_path: @project.full_path } } + #js-branch-rules{ data: { project_path: @project.full_path, branch_rules_path: project_settings_repository_branch_rules_path(@project) } } diff --git a/app/views/projects/buttons/_clone.html.haml b/app/views/projects/buttons/_clone.html.haml index 10a6bc6b524..34aecd31c57 100644 --- a/app/views/projects/buttons/_clone.html.haml +++ b/app/views/projects/buttons/_clone.html.haml @@ -2,17 +2,17 @@ - dropdown_class = local_assigns.fetch(:dropdown_class, '') .git-clone-holder.js-git-clone-holder - %a#clone-dropdown.gl-button.btn.btn-confirm.clone-dropdown-btn.qa-clone-dropdown{ href: '#', data: { toggle: 'dropdown' } } + %a#clone-dropdown.gl-button.btn.btn-confirm.clone-dropdown-btn{ href: '#', data: { toggle: 'dropdown', qa_selector: 'clone_dropdown' } } %span.gl-mr-2.js-clone-dropdown-label = _('Clone') = sprite_icon("chevron-down", css_class: "icon") - %ul.dropdown-menu.dropdown-menu-large.dropdown-menu-selectable.clone-options-dropdown.qa-clone-options{ class: dropdown_class } + %ul.dropdown-menu.dropdown-menu-large.dropdown-menu-selectable.clone-options-dropdown{ class: dropdown_class, data: { qa_selector: 'clone_dropdown_content' } } - if ssh_enabled? %li{ class: 'gl-px-4!' } %label.label-bold = _('Clone with SSH') .input-group.btn-group - = text_field_tag :ssh_project_clone, project.ssh_url_to_repo, class: "js-select-on-focus form-control qa-ssh-clone-url", readonly: true, aria: { label: _('Repository clone URL') } + = text_field_tag :ssh_project_clone, project.ssh_url_to_repo, class: "js-select-on-focus form-control", readonly: true, aria: { label: _('Repository clone URL') }, data: { qa_selector: 'ssh_clone_url_content' } .input-group-append = clipboard_button(target: '#ssh_project_clone', title: _("Copy URL"), class: "input-group-text gl-button btn btn-icon btn-default") = render_if_exists 'projects/buttons/geo' @@ -21,7 +21,7 @@ %label.label-bold = _('Clone with %{http_label}') % { http_label: gitlab_config.protocol.upcase } .input-group.btn-group - = text_field_tag :http_project_clone, project.http_url_to_repo, class: "js-select-on-focus form-control qa-http-clone-url", readonly: true, aria: { label: _('Repository clone URL') } + = text_field_tag :http_project_clone, project.http_url_to_repo, class: "js-select-on-focus form-control", readonly: true, aria: { label: _('Repository clone URL') }, data: { qa_selector: 'http_clone_url_content' } .input-group-append = clipboard_button(target: '#http_project_clone', title: _("Copy URL"), class: "input-group-text gl-button btn btn-icon btn-default") = render_if_exists 'projects/buttons/geo' diff --git a/app/views/projects/buttons/_download_links.html.haml b/app/views/projects/buttons/_download_links.html.haml index f6084cfcde8..d36aed44e18 100644 --- a/app/views/projects/buttons/_download_links.html.haml +++ b/app/views/projects/buttons/_download_links.html.haml @@ -1,4 +1,4 @@ .btn-group.ml-0.w-100 - Gitlab::Workhorse::ARCHIVE_FORMATS.each_with_index do |fmt, index| - archive_path = project_archive_path(project, id: tree_join(ref, archive_prefix), path: path, format: fmt) - = link_to fmt, external_storage_url_or_path(archive_path), rel: 'nofollow', download: '', class: "gl-button btn btn-sm #{index == 0 ? "btn-confirm" : "btn-default"}" + = link_to fmt, external_storage_url_or_path(archive_path), rel: 'nofollow', download: '', class: "gl-button btn btn-sm #{index == 0 ? 'btn-confirm' : 'btn-default'}" diff --git a/app/views/projects/buttons/_fork.html.haml b/app/views/projects/buttons/_fork.html.haml index c57b6dbe28c..3621853430d 100644 --- a/app/views/projects/buttons/_fork.html.haml +++ b/app/views/projects/buttons/_fork.html.haml @@ -14,5 +14,5 @@ = link_to new_project_fork_path(@project), class: "gl-button btn btn-default btn-sm fork-btn #{button_class}" do = sprite_icon('fork', css_class: 'icon') %span= s_('ProjectOverview|Fork') - = link_to project_forks_path(@project), title: n_(s_('ProjectOverview|Forks'), s_('ProjectOverview|Forks'), @project.forks_count), class: "gl-button btn btn-default btn-sm count has-tooltip #{count_class}" do + = link_to project_forks_path(@project), title: n_(s_('ProjectOverview|Forks'), s_('ProjectOverview|Forks'), @project.forks_count), class: "gl-button btn btn-default btn-sm count has-tooltip fork-count #{count_class}" do = @project.forks_count diff --git a/app/views/projects/buttons/_star.html.haml b/app/views/projects/buttons/_star.html.haml index f607a21ad21..eaf906ad89f 100644 --- a/app/views/projects/buttons/_star.html.haml +++ b/app/views/projects/buttons/_star.html.haml @@ -1,15 +1,13 @@ - if current_user + - starred = current_user.starred?(@project) + - icon = starred ? 'star' : 'star-o' + - button_text = starred ? s_('ProjectOverview|Unstar') : s_('ProjectOverview|Star') + - button_text_classes = starred ? 'starred' : '' .count-badge.d-inline-flex.align-item-stretch.gl-mr-3.btn-group - %button.gl-button.btn.btn-default.btn-sm.star-btn.toggle-star{ type: "button", data: { endpoint: toggle_star_project_path(@project, :json) } } - - if current_user.starred?(@project) - = sprite_icon('star', css_class: 'icon') - %span.starred= s_('ProjectOverview|Unstar') - - else - = sprite_icon('star-o', css_class: 'icon') - %span= s_('ProjectOverview|Star') + = render Pajamas::ButtonComponent.new(size: :small, icon: icon, button_text_classes: button_text_classes, button_options: { class: 'star-btn toggle-star', data: { endpoint: toggle_star_project_path(@project, :json) } }) do + - button_text = link_to project_starrers_path(@project), title: n_(s_('ProjectOverview|Starrer'), s_('ProjectOverview|Starrers'), @project.star_count), class: 'gl-button btn btn-default btn-sm has-tooltip star-count count' do = @project.star_count - - else .count-badge.d-inline-flex.align-item-stretch.gl-mr-3.btn-group = link_to new_user_session_path, class: 'gl-button btn btn-default btn-sm has-tooltip star-btn', title: s_('ProjectOverview|You must sign in to star a project') do diff --git a/app/views/projects/cleanup/_show.html.haml b/app/views/projects/cleanup/_show.html.haml index c53205b6c58..d00d9f62999 100644 --- a/app/views/projects/cleanup/_show.html.haml +++ b/app/views/projects/cleanup/_show.html.haml @@ -16,7 +16,7 @@ .settings-content - url = cleanup_namespace_project_settings_repository_path(@project.namespace, @project) - = form_for @project, url: url, method: :post, authenticity_token: true, html: { class: 'js-requires-input' } do |f| + = gitlab_ui_form_for @project, url: url, method: :post, authenticity_token: true, html: { class: 'js-requires-input' } do |f| %fieldset.gl-mt-0.gl-mb-3 .gl-mb-3 %h5.gl-mt-0 @@ -29,4 +29,4 @@ .form-text.text-muted = _("The maximum file size is %{size}.") % { size: number_to_human_size(Gitlab::CurrentSettings.max_attachment_size.megabytes) } - = f.submit _('Start cleanup'), class: 'gl-button btn btn-confirm' + = f.submit _('Start cleanup'), pajamas_button: true diff --git a/app/views/projects/cluster_agents/show.html.haml b/app/views/projects/cluster_agents/show.html.haml index a2d3426d99c..98a2c9c3e6d 100644 --- a/app/views/projects/cluster_agents/show.html.haml +++ b/app/views/projects/cluster_agents/show.html.haml @@ -1,3 +1,4 @@ +- add_page_specific_style 'page_bundles/cluster_agents' - add_to_breadcrumbs _('Kubernetes'), project_clusters_path(@project) - page_title @agent_name diff --git a/app/views/projects/commit/_signature.html.haml b/app/views/projects/commit/_signature.html.haml index fb31ac44118..978d83bf2b4 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 x509_signature?(signature)}" + - 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 7c896cd71ef..fb30bfc2953 100644 --- a/app/views/projects/commit/_signature_badge.html.haml +++ b/app/views/projects/commit/_signature_badge.html.haml @@ -17,7 +17,7 @@ - content = capture do - if show_user .clearfix - - uri_signature_badge_user = "projects/commit/#{"x509/" if x509_signature?(signature)}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 x509_signature?(signature) diff --git a/app/views/projects/commits/_commit.html.haml b/app/views/projects/commits/_commit.html.haml index 6f44c130603..bf6b628dd36 100644 --- a/app/views/projects/commits/_commit.html.haml +++ b/app/views/projects/commits/_commit.html.haml @@ -29,7 +29,7 @@ - if view_details && merge_request = link_to commit.title, project_commit_path(project, commit.id, merge_request_iid: merge_request.iid), class: ["commit-row-message item-title js-onboarding-commit-item", ("font-italic" if commit.message.empty?)] - else - = link_to_markdown_field(commit, :title, link, class: "commit-row-message item-title js-onboarding-commit-item #{"font-italic" if commit.message.empty?}", data: link_data_attrs) + = link_to_markdown_field(commit, :title, link, class: "commit-row-message item-title js-onboarding-commit-item #{'font-italic' if commit.message.empty?}", data: link_data_attrs) %span.commit-row-message.d-inline.d-sm-none · = commit.short_id @@ -51,7 +51,7 @@ = render_if_exists 'projects/commits/project_namespace', show_project_name: show_project_name, project: project - if commit.description? - %pre{ class: ["commit-row-description gl-mb-3", (collapsible ? "js-toggle-content" : "d-block")] } + %pre{ class: ["commit-row-description gl-mb-3 gl-white-space-pre-line", (collapsible ? "js-toggle-content" : "d-block")] } = preserve(markdown_field(commit, :description)) .commit-actions.flex-row diff --git a/app/views/projects/commits/show.html.haml b/app/views/projects/commits/show.html.haml index 6b06584ea25..ae68a13929e 100644 --- a/app/views/projects/commits/show.html.haml +++ b/app/views/projects/commits/show.html.haml @@ -1,5 +1,5 @@ - breadcrumb_title _("Commits") - +- add_page_specific_style 'page_bundles/tree' - page_title _("Commits"), @ref = content_for :meta_tags do = auto_discovery_link_tag(:atom, project_commits_path(@project, @ref, rss_url_options), title: "#{@project.name}:#{@ref} commits") diff --git a/app/views/projects/compare/show.html.haml b/app/views/projects/compare/show.html.haml index 95186b85838..1bdf3d1e6e3 100644 --- a/app/views/projects/compare/show.html.haml +++ b/app/views/projects/compare/show.html.haml @@ -5,7 +5,7 @@ .js-signature-container{ data: { 'signatures-path' => signatures_namespace_project_compare_index_path } } #js-compare-selector{ data: project_compare_selector_data(@project, @merge_request, params) } -- if @commits.present? +- if @commits.present? || @diffs.present? -# Only show commit list in the first page - hide_commit_list = params[:page].present? && params[:page] != '1' = render "projects/commits/commit_list" unless hide_commit_list diff --git a/app/views/projects/default_branch/_show.html.haml b/app/views/projects/default_branch/_show.html.haml index eba0f336f80..04712cd59f7 100644 --- a/app/views/projects/default_branch/_show.html.haml +++ b/app/views/projects/default_branch/_show.html.haml @@ -17,7 +17,7 @@ - else .form-group = f.label :default_branch, _("Default branch"), class: 'label-bold' - = f.select(:default_branch, @project.repository.branch_names, {}, {class: 'select2 select-wide', data: { qa_selector: 'default_branch_dropdown' }}) + .js-select-default-branch{ data: { default_branch: @project.default_branch, project_id: @project.id } } .form-group - help_text = _("When merge requests and commits in the default branch close, any issues they reference also close.") @@ -26,4 +26,4 @@ _("Auto-close referenced issues on default branch"), help_text: (help_text + " " + help_icon).html_safe - = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' } + = f.submit _('Save changes'), data: { qa_selector: 'save_changes_button' }, pajamas_button: true diff --git a/app/views/projects/deploy_keys/edit.html.haml b/app/views/projects/deploy_keys/edit.html.haml index 04e364d6b15..91444a00334 100644 --- a/app/views/projects/deploy_keys/edit.html.haml +++ b/app/views/projects/deploy_keys/edit.html.haml @@ -6,5 +6,5 @@ = gitlab_ui_form_for [@project, @deploy_key], include_id: false, html: { class: 'js-requires-input' } do |f| = render partial: 'shared/deploy_keys/form', locals: { form: f, deploy_key: @deploy_key } .form-actions - = f.submit _('Save changes'), class: 'gl-button btn btn-confirm' + = f.submit _('Save changes'), pajamas_button: true = link_to _('Cancel'), project_settings_repository_path(@project), class: 'gl-button btn btn-default btn-cancel' diff --git a/app/views/projects/deployments/_deployment.html.haml b/app/views/projects/deployments/_deployment.html.haml index e92297a5a6a..e3688c8d323 100644 --- a/app/views/projects/deployments/_deployment.html.haml +++ b/app/views/projects/deployments/_deployment.html.haml @@ -23,7 +23,7 @@ - if deployment.deployable .table-mobile-content .flex-truncate-parent - .flex-truncate-child + .flex-truncate-child.has-tooltip.gl-white-space-normal.gl-md-white-space-nowrap{ :title => "#{deployment.deployable.name} (##{deployment.deployable.id})", data: { container: 'body' } } = link_to deployment_path(deployment), class: 'build-link' do #{deployment.deployable.name} (##{deployment.deployable.id}) - else diff --git a/app/views/projects/deployments/_rollback.haml b/app/views/projects/deployments/_rollback.haml index a7befabdc96..223f7520b47 100644 --- a/app/views/projects/deployments/_rollback.haml +++ b/app/views/projects/deployments/_rollback.haml @@ -1,7 +1,4 @@ - if deployment.deployable && can?(current_user, :create_deployment, deployment) - tooltip = deployment.last? ? s_('Environments|Re-deploy to environment') : s_('Environments|Rollback environment') - = button_tag class: 'js-confirm-rollback-modal-button gl-button btn btn-default btn-icon has-tooltip', type: 'button', data: { environment_name: @environment.name, commit_short_sha: deployment.short_sha, commit_url: project_commit_path(@project, deployment.sha), is_last_deployment: deployment.last?.to_s, retry_path: retry_project_job_path(@environment.project, deployment.deployable) }, title: tooltip do - - if deployment.last? - = sprite_icon('repeat', css_class: 'gl-icon') - - else - = sprite_icon('redo', css_class: 'gl-icon') + - icon = deployment.last? ? 'repeat' : 'redo' + = render Pajamas::ButtonComponent.new(icon: icon, button_options: { title: tooltip, class: 'js-confirm-rollback-modal-button has-tooltip', data: { environment_name: @environment.name, commit_short_sha: deployment.short_sha, commit_url: project_commit_path(@project, deployment.sha), is_last_deployment: deployment.last?.to_s, retry_path: retry_project_job_path(@environment.project, deployment.deployable) } }) diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index 70df995cdf3..f6e3c15c08b 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -28,7 +28,7 @@ %template.js-project-permissions-form-data{ type: "application/json" }= project_permissions_panel_data(@project).to_json.html_safe .js-project-permissions-form{ data: visibility_confirm_modal_data(@project, reduce_visibility_form_id) } -- if show_merge_request_settings_callout? +- if show_merge_request_settings_callout?(@project) %section.settings.expanded = render Pajamas::AlertComponent.new(variant: :info, title: _('Merge requests and approvals settings have moved.'), diff --git a/app/views/projects/environments/metrics.html.haml b/app/views/projects/environments/metrics.html.haml index cd7339edd1a..31041d124e4 100644 --- a/app/views/projects/environments/metrics.html.haml +++ b/app/views/projects/environments/metrics.html.haml @@ -1,3 +1,5 @@ +- add_page_specific_style 'page_bundles/prometheus' + - page_title _("Metrics Dashboard"), @environment.name .prometheus-container diff --git a/app/views/projects/find_file/show.html.haml b/app/views/projects/find_file/show.html.haml index 2e024b8ffc4..7cd4ab08680 100644 --- a/app/views/projects/find_file/show.html.haml +++ b/app/views/projects/find_file/show.html.haml @@ -1,4 +1,5 @@ - page_title _("Find File"), @ref +- add_page_specific_style 'page_bundles/tree' .file-finder-holder.tree-holder.clearfix.js-file-finder{ 'data-file-find-url': "#{escape_javascript(project_files_path(@project, @ref, format: :json))}", 'data-find-tree-url': escape_javascript(project_tree_path(@project, @ref)), 'data-blob-url-template': escape_javascript(project_blob_path(@project, @ref)) } .nav-block diff --git a/app/views/projects/graphs/charts.html.haml b/app/views/projects/graphs/charts.html.haml index 04d400688d4..edf8f71c673 100644 --- a/app/views/projects/graphs/charts.html.haml +++ b/app/views/projects/graphs/charts.html.haml @@ -1,4 +1,5 @@ - page_title _("Repository Analytics") +- add_page_specific_style 'page_bundles/graph_charts' .mb-3 %h3 diff --git a/app/views/projects/hooks/edit.html.haml b/app/views/projects/hooks/edit.html.haml index b350455807d..ca71990f5e3 100644 --- a/app/views/projects/hooks/edit.html.haml +++ b/app/views/projects/hooks/edit.html.haml @@ -12,7 +12,7 @@ = gitlab_ui_form_for [@project, @hook], as: :hook, url: project_hook_path(@project, @hook) do |f| = render partial: 'shared/web_hooks/form', locals: { form: f, hook: @hook } - = f.submit _('Save changes'), class: 'btn gl-button btn-confirm gl-mr-3' + = f.submit _('Save changes'), pajamas_button: true = render 'shared/web_hooks/test_button', hook: @hook = link_to _('Delete'), project_hook_path(@project, @hook), method: :delete, class: 'btn gl-button btn-danger float-right', aria: { label: s_('Webhooks|Delete webhook') }, data: { confirm: s_('Webhooks|Are you sure you want to delete this project hook?'), confirm_btn_variant: 'danger' } diff --git a/app/views/projects/hooks/index.html.haml b/app/views/projects/hooks/index.html.haml index 7d62a851aa1..0476193c2cb 100644 --- a/app/views/projects/hooks/index.html.haml +++ b/app/views/projects/hooks/index.html.haml @@ -2,13 +2,13 @@ - breadcrumb_title _('Webhook Settings') - page_title _('Webhooks') -.row.gl-mt-3 +.row.gl-mt-3.js-search-settings-section .col-lg-4 = render 'shared/web_hooks/title_and_docs', hook: @hook .col-lg-8.gl-mb-3 = gitlab_ui_form_for @hook, as: :hook, url: polymorphic_path([@project, :hooks]) do |f| = render partial: 'shared/web_hooks/form', locals: { form: f, hook: @hook } - = f.submit 'Add webhook', class: 'gl-button btn btn-confirm' + = f.submit 'Add webhook', pajamas_button: true = render 'shared/web_hooks/index', hooks: @hooks, hook_class: @hook.class diff --git a/app/views/projects/incidents/show.html.haml b/app/views/projects/incidents/show.html.haml index 5043f94bd5c..7a1e7f503f8 100644 --- a/app/views/projects/incidents/show.html.haml +++ b/app/views/projects/incidents/show.html.haml @@ -2,6 +2,7 @@ - add_to_breadcrumbs _("Incidents"), project_incidents_path(@project) - breadcrumb_title @issue.to_reference - page_title "#{@issue.title} (#{@issue.to_reference})", _("Incidents") +- add_page_specific_style 'page_bundles/incidents' - add_page_specific_style 'page_bundles/issues_show' = render 'projects/issuable/show', issuable: @issue diff --git a/app/views/projects/issues/_discussion.html.haml b/app/views/projects/issues/_discussion.html.haml index 11b652cc818..40935ab6f70 100644 --- a/app/views/projects/issues/_discussion.html.haml +++ b/app/views/projects/issues/_discussion.html.haml @@ -6,6 +6,9 @@ #js-vue-notes{ data: { notes_data: notes_data(@issue).to_json, noteable_data: serialize_issuable(@issue, with_blocking_issues: true), noteable_type: 'Issue', + notes_filters: UserPreference.notes_filters.to_json, + notes_filter_value: current_user&.notes_filter_for(@issue), target_type: 'issue', + show_timeline_view_toggle: show_timeline_view_toggle?(@issue).to_s, current_user_data: UserSerializer.new.represent(current_user, {only_path: true}, CurrentUserEntity).to_json, can_add_timeline_events: "#{can?(current_user, :admin_incident_management_timeline_event, @issue)}" } } diff --git a/app/views/projects/issues/_issue.html.haml b/app/views/projects/issues/_issue.html.haml index 4d4645c7087..1d3320e4f82 100644 --- a/app/views/projects/issues/_issue.html.haml +++ b/app/views/projects/issues/_issue.html.haml @@ -1,10 +1,5 @@ %li{ id: dom_id(issue), class: issue_css_classes(issue), url: issue_path(issue), data: { labels: issue.label_ids, id: issue.id, qa_selector: 'issue_container', qa_issue_title: issue.title } } .issuable-info-container - - if @can_bulk_update - .issue-check.hidden - - checkbox_id = dom_id(issue, "selected") - %label.gl-sr-only{ for: checkbox_id }= issue.title - = check_box_tag checkbox_id, nil, false, 'data-id' => issue.id, class: "selected-issuable" .issuable-main-info .issue-title.title %span.issue-title-text.js-onboarding-issue-item{ dir: "auto" } diff --git a/app/views/projects/issues/_work_item_links.html.haml b/app/views/projects/issues/_work_item_links.html.haml index bc2136b89fb..c0de711136a 100644 --- a/app/views/projects/issues/_work_item_links.html.haml +++ b/app/views/projects/issues/_work_item_links.html.haml @@ -1,2 +1,2 @@ - if Feature.enabled?(:work_items_hierarchy, @project) - .js-work-item-links-root{ data: { issuable_id: @issue.id, iid: @issue.iid, project_path: @project.full_path, wi: work_items_index_data(@project) } } + .js-work-item-links-root{ data: { issuable_id: @issue.id, iid: @issue.iid, project_namespace: @project.namespace.path, project_path: @project.full_path, wi: work_items_index_data(@project) } } diff --git a/app/views/projects/issues/service_desk/_service_desk_info_content.html.haml b/app/views/projects/issues/service_desk/_service_desk_info_content.html.haml index bad75ac2cd9..2ed5675c0ad 100644 --- a/app/views/projects/issues/service_desk/_service_desk_info_content.html.haml +++ b/app/views/projects/issues/service_desk/_service_desk_info_content.html.haml @@ -4,7 +4,7 @@ - can_admin_issues = can?(current_user, :admin_issue, @project) - title_text = s_("ServiceDesk|Use Service Desk to connect with your users and offer customer support through email right inside GitLab") -.non-empty-state.media +.media.gl-border-b.gl-pb-3.gl-text-left .svg-content = render partial: 'shared/empty_states/icons/service_desk_callout', formats: :svg diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index 06c422fc4d6..76b725d140c 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -2,6 +2,7 @@ - add_to_breadcrumbs _("Issues"), project_issues_path(@project) - breadcrumb_title @issue.to_reference - page_title "#{@issue.title} (#{@issue.to_reference})", _("Issues") +- add_page_specific_style 'page_bundles/incidents' - add_page_specific_style 'page_bundles/issues_show' - add_page_specific_style 'page_bundles/work_items' diff --git a/app/views/projects/jobs/_user.html.haml b/app/views/projects/jobs/_user.html.haml index 90ce581a903..03cbabb0c2a 100644 --- a/app/views/projects/jobs/_user.html.haml +++ b/app/views/projects/jobs/_user.html.haml @@ -1,7 +1,7 @@ by %a{ href: user_path(@build.user) } %span.d-none.d-sm-inline - = image_tag avatar_icon_for_user(@build.user, 24), class: "avatar s24" + = render Pajamas::AvatarComponent.new(@build.user, size: 24, alt: "") %strong{ data: { toggle: 'tooltip', placement: 'top', title: @build.user.to_reference } } = @build.user.name %strong.d-inline.d-sm-none= @build.user.to_reference diff --git a/app/views/projects/merge_requests/_awards_block.html.haml b/app/views/projects/merge_requests/_awards_block.html.haml index 64d35b4dfe6..820927fdd1a 100644 --- a/app/views/projects/merge_requests/_awards_block.html.haml +++ b/app/views/projects/merge_requests/_awards_block.html.haml @@ -1,5 +1,2 @@ .content-block.emoji-block.emoji-list-container.js-noteable-awards - = render 'award_emoji/awards_block', awardable: @merge_request, inline: true, api_awards_path: award_emoji_merge_request_api_path(@merge_request) do - .gl-my-2.gl-xs-w-full - #js-vue-sort-issue-discussions - = render "projects/merge_requests/discussion_filter" + = render 'award_emoji/awards_block', awardable: @merge_request, inline: true, api_awards_path: award_emoji_merge_request_api_path(@merge_request) diff --git a/app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml b/app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml index 22571b11639..478db70877d 100644 --- a/app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml +++ b/app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml @@ -1,8 +1,7 @@ - display_issuable_type = issuable_display_type(@merge_request) .float-left.btn-group.gl-md-ml-3.gl-display-flex.dropdown.gl-new-dropdown.gl-md-w-auto.gl-w-full - = button_tag type: 'button', class: "btn dropdown-toggle btn-default btn-md gl-button gl-dropdown-toggle btn-default-tertiary dropdown-icon-only dropdown-toggle-no-caret gl-display-none! gl-md-display-inline-flex!", data: { 'toggle' => 'dropdown' } do - %span.gl-sr-only= _('Toggle dropdown') + = button_tag type: 'button', class: "btn dropdown-toggle btn-default btn-md gl-button gl-dropdown-toggle btn-default-tertiary dropdown-icon-only dropdown-toggle-no-caret has-tooltip gl-display-none! gl-md-display-inline-flex!", data: { toggle: 'dropdown', title: _('Merge request actions'), testid: 'merge-request-actions' } do = sprite_icon "ellipsis_v", size: 16, css_class: "dropdown-icon gl-icon" = button_tag type: 'button', class: "btn dropdown-toggle btn-default btn-md btn-block gl-button gl-dropdown-toggle gl-md-display-none!", data: { 'toggle' => 'dropdown' } do %span.gl-new-dropdown-button-text= _('Merge request actions') @@ -11,7 +10,7 @@ .gl-new-dropdown-inner .gl-new-dropdown-contents %ul - - if !@merge_request.merged? && current_user && moved_mr_sidebar_enabled? + - if current_user && moved_mr_sidebar_enabled? %li.gl-new-dropdown-item.js-sidebar-subscriptions-entry-point %li.gl-new-dropdown-divider %hr.dropdown-divider diff --git a/app/views/projects/merge_requests/_discussion_filter.html.haml b/app/views/projects/merge_requests/_discussion_filter.html.haml deleted file mode 100644 index 96886661a8d..00000000000 --- a/app/views/projects/merge_requests/_discussion_filter.html.haml +++ /dev/null @@ -1,2 +0,0 @@ -#js-vue-discussion-filter{ data: { default_filter: current_user&.notes_filter_for(@merge_request), - notes_filters: UserPreference.notes_filters.to_json } } diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml index 98d2928fc97..71f8e4c32f5 100644 --- a/app/views/projects/merge_requests/_merge_request.html.haml +++ b/app/views/projects/merge_requests/_merge_request.html.haml @@ -1,9 +1,12 @@ %li{ id: dom_id(merge_request), class: mr_css_classes(merge_request), data: { labels: merge_request.label_ids, id: merge_request.id } } - if @can_bulk_update - .issue-check.hidden - - checkbox_id = dom_id(merge_request, "selected") - %label.gl-sr-only{ for: checkbox_id }= merge_request.title - = check_box_tag checkbox_id, nil, false, 'data-id' => merge_request.id, class: "selected-issuable" + .issue-check.gl-mr-3.hidden + = render Pajamas::CheckboxTagComponent.new(name: dom_id(merge_request, "selected"), + value: nil, + checkbox_options: { 'data-id' => merge_request.id }) do |c| + = c.label do + %span.gl-sr-only + = merge_request.title .issuable-info-container .issuable-main-info diff --git a/app/views/projects/merge_requests/_nav_btns.html.haml b/app/views/projects/merge_requests/_nav_btns.html.haml index 00d12423eb9..1efea6a1d37 100644 --- a/app/views/projects/merge_requests/_nav_btns.html.haml +++ b/app/views/projects/merge_requests/_nav_btns.html.haml @@ -5,7 +5,8 @@ .js-csv-import-export-buttons{ data: { show_export_button: "true", issuable_type: issuable_type, issuable_count: issuables_count_for_state(issuable_type.to_sym, params[:state]), email: notification_email, export_csv_path: export_csv_project_merge_requests_path(@project, request.query_parameters), container_class: 'gl-mr-3' } } - if @can_bulk_update - = button_tag _("Edit merge requests"), class: "gl-button btn btn-default gl-mr-3 js-bulk-update-toggle" + = render Pajamas::ButtonComponent.new(type: :submit, button_options: { class: 'gl-mr-3 js-bulk-update-toggle' }) do + = _("Edit merge requests") - if merge_project - = link_to new_merge_request_path, class: "gl-button btn btn-confirm", title: _("New merge request") do - = _('New merge request') + = render Pajamas::ButtonComponent.new(href: new_merge_request_path, variant: :confirm) do + = _("New merge request") diff --git a/app/views/projects/merge_requests/_widget.html.haml b/app/views/projects/merge_requests/_widget.html.haml index 783e3ac97c1..4f6983c6fe3 100644 --- a/app/views/projects/merge_requests/_widget.html.haml +++ b/app/views/projects/merge_requests/_widget.html.haml @@ -12,6 +12,7 @@ window.gl.mrWidgetData.mr_troubleshooting_docs_path = '#{help_page_path('user/project/merge_requests/reviews/index.md', anchor: 'troubleshooting')}'; window.gl.mrWidgetData.pipeline_must_succeed_docs_path = '#{help_page_path('user/project/merge_requests/merge_when_pipeline_succeeds.md', anchor: 'require-a-successful-pipeline-for-merge')}'; window.gl.mrWidgetData.security_approvals_help_page_path = '#{help_page_path('user/application_security/index.md', anchor: 'security-approvals-in-merge-requests')}'; + window.gl.mrWidgetData.security_configuration_path = '#{project_security_configuration_path(@project)}'; window.gl.mrWidgetData.license_compliance_docs_path = '#{help_page_path('user/compliance/license_compliance/index.md', anchor: 'policies')}'; window.gl.mrWidgetData.eligible_approvers_docs_path = '#{help_page_path('user/project/merge_requests/approvals/rules.md', anchor: 'eligible-approvers')}'; window.gl.mrWidgetData.approvals_help_path = '#{help_page_path("user/project/merge_requests/approvals/index.md")}'; diff --git a/app/views/projects/merge_requests/show.html.haml b/app/views/projects/merge_requests/show.html.haml index d34848c801d..d77d5231a7d 100644 --- a/app/views/projects/merge_requests/show.html.haml +++ b/app/views/projects/merge_requests/show.html.haml @@ -60,10 +60,10 @@ %section .issuable-discussion.js-vue-notes-event - if @merge_request.description.present? - .detail-page-description + .detail-page-description.gl-pb-0 = render "projects/merge_requests/description" - = render "projects/merge_requests/widget" = render "projects/merge_requests/awards_block" + = render "projects/merge_requests/widget" - if mr_action === "show" - add_page_startup_api_call Feature.enabled?(:paginated_mr_discussions, @project) ? discussions_path(@merge_request, per_page: 20) : discussions_path(@merge_request) - add_page_startup_api_call widget_project_json_merge_request_path(@project, @merge_request, format: :json) @@ -72,6 +72,8 @@ endpoint_metadata: @endpoint_metadata_url, noteable_data: serialize_issuable(@merge_request, serializer: 'noteable'), noteable_type: 'MergeRequest', + notes_filters: UserPreference.notes_filters.to_json, + notes_filter_value: current_user&.notes_filter_for(@merge_request), target_type: 'merge_request', help_page_path: suggest_changes_help_path, current_user_data: @current_user_data, diff --git a/app/views/projects/milestones/_form.html.haml b/app/views/projects/milestones/_form.html.haml index c11d5e7c9b6..fb7c1130f5c 100644 --- a/app/views/projects/milestones/_form.html.haml +++ b/app/views/projects/milestones/_form.html.haml @@ -1,6 +1,8 @@ = gitlab_ui_form_for [@project, @milestone], html: { class: 'milestone-form common-note-form js-quick-submit js-requires-input' } do |f| = form_errors(@milestone) + - if @redirect_path.present? + = f.hidden_field(:redirect_path, name: :redirect_path, id: :redirect_path, value: @redirect_path) .form-group.row .col-form-label.col-sm-2 = f.label :title, _('Title') diff --git a/app/views/projects/mirrors/_authentication_method.html.haml b/app/views/projects/mirrors/_authentication_method.html.haml index 28b433b2514..4b549aaf1cd 100644 --- a/app/views/projects/mirrors/_authentication_method.html.haml +++ b/app/views/projects/mirrors/_authentication_method.html.haml @@ -3,12 +3,10 @@ .form-group = f.label :auth_method, _('Authentication method'), class: 'label-bold' - .select-wrapper - = f.select :auth_method, - options_for_select(auth_options, mirror.auth_method), - {}, { class: "form-control gl-form-select select-control js-mirror-auth-type qa-authentication-method" } - = sprite_icon('chevron-down', css_class: "gl-icon gl-absolute gl-top-3 gl-right-3 gl-text-gray-200") - = f.hidden_field :auth_method, value: "password", class: "js-hidden-mirror-auth-type" + = f.select :auth_method, + options_for_select(auth_options, mirror.auth_method), + {}, { class: "custom-select gl-form-select js-mirror-auth-type qa-authentication-method" } + = f.hidden_field :auth_method, value: "password", class: "js-hidden-mirror-auth-type" .form-group .well-password-auth.collapse.js-well-password-auth diff --git a/app/views/projects/mirrors/_mirror_repos.html.haml b/app/views/projects/mirrors/_mirror_repos.html.haml index 2ae7d300979..c98f88fa31e 100644 --- a/app/views/projects/mirrors/_mirror_repos.html.haml +++ b/app/views/projects/mirrors/_mirror_repos.html.haml @@ -35,7 +35,7 @@ = link_to _('Learn more.'), help_page_path('user/project/repository/mirror/index.md', anchor: 'mirror-only-protected-branches'), target: '_blank', rel: 'noopener noreferrer' .panel-footer - = f.submit _('Mirror repository'), class: 'gl-button btn btn-confirm js-mirror-submit qa-mirror-repository-button', name: :update_remote_mirror + = f.submit _('Mirror repository'), class: 'js-mirror-submit qa-mirror-repository-button', name: :update_remote_mirror, pajamas_button: true - else = render Pajamas::AlertComponent.new(dismissible: false) do |c| = c.body do diff --git a/app/views/projects/network/_head.html.haml b/app/views/projects/network/_head.html.haml index 701cb37a1c8..e430dc2f372 100644 --- a/app/views/projects/network/_head.html.haml +++ b/app/views/projects/network/_head.html.haml @@ -1,4 +1,4 @@ -.row-content-block.second-block.content-component-block +.row-content-block.second-block.content-component-block.gl-px-0.gl-py-3 .tree-ref-holder = render partial: 'shared/ref_switcher', locals: {destination: 'graph'} diff --git a/app/views/projects/pages/_destroy.haml b/app/views/projects/pages/_destroy.haml index 993026d2884..ff30c9ce1ea 100644 --- a/app/views/projects/pages/_destroy.haml +++ b/app/views/projects/pages/_destroy.haml @@ -1,14 +1,16 @@ - if @project.pages_deployed? - if can?(current_user, :remove_pages, @project) - .card.border-danger - .card-header.bg-danger.text-white + = render Pajamas::CardComponent.new(card_options: { class: 'border-danger' }, header_options: {class: 'bg-danger text-white'}) do |c| + - c.with_header do = s_('GitLabPages|Remove pages') - .errors-holder - .card-body - %p.gl-mb-0 - = s_('GitLabPages|Removing pages will prevent them from being exposed to the outside world.') - .card-footer - = link_to s_('GitLabPages|Remove pages'), project_pages_path(@project), data: { confirm: s_('GitLabPages|Are you sure?'), 'confirm-btn-variant': 'danger'}, method: :delete, class: "btn gl-button btn-danger", "aria-label": s_('GitLabPages|Remove pages') + - c.with_body do + = s_('GitLabPages|Removing pages will prevent them from being exposed to the outside world.') + - c.with_footer do + = render Pajamas::ButtonComponent.new(href: project_pages_path(@project), + variant: :danger, + method: :delete, + button_options: {data: { confirm: s_('GitLabPages|Are you sure?'), 'confirm-btn-variant': 'danger'}, "aria-label": s_('GitLabPages|Remove pages')}) do + = s_('GitLabPages|Remove pages') - else .nothing-here-block = s_('GitLabPages|Only project maintainers can remove pages') diff --git a/app/views/projects/pages/new.html.haml b/app/views/projects/pages/new.html.haml index 5dea6b02e36..f1f3510d0f8 100644 --- a/app/views/projects/pages/new.html.haml +++ b/app/views/projects/pages/new.html.haml @@ -1,7 +1,8 @@ -- if Feature.enabled?(:use_pipeline_wizard_for_pages, @project.group) - #js-pages{ data: @pipeline_wizard_data } +%section.js-search-settings-section + - if Feature.enabled?(:use_pipeline_wizard_for_pages, @project.group) + #js-pages{ data: @pipeline_wizard_data } -- else - = render 'header' + - else + = render 'header' - = render 'use' + = render 'use' diff --git a/app/views/projects/pipeline_schedules/_form.html.haml b/app/views/projects/pipeline_schedules/_form.html.haml index 5d5ca2aaaf3..ab692d1830a 100644 --- a/app/views/projects/pipeline_schedules/_form.html.haml +++ b/app/views/projects/pipeline_schedules/_form.html.haml @@ -39,5 +39,5 @@ %div = f.gitlab_ui_checkbox_component :active, _('Active'), checkbox_options: { value: @schedule.active, required: false } .footer-block - = f.submit _('Save pipeline schedule'), class: 'btn gl-button btn-confirm' + = f.submit _('Save pipeline schedule'), pajamas_button: true = link_to _('Cancel'), pipeline_schedules_path(@project), class: 'btn gl-button btn-default btn-cancel' diff --git a/app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml b/app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml index 10dc74647b2..7b16564dfa2 100644 --- a/app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml +++ b/app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml @@ -4,9 +4,9 @@ = pipeline_schedule.description %td.branch-name-cell.gl-text-truncate - if pipeline_schedule.for_tag? - = sprite_icon('tag', size: 12) + = sprite_icon('tag', size: 12, css_class: 'gl-vertical-align-middle!' ) - else - = sprite_icon('fork', size: 12) + = sprite_icon('fork', size: 12, css_class: 'gl-vertical-align-middle!') - if pipeline_schedule.ref.present? = link_to pipeline_schedule.ref_for_display, project_ref_path(@project, pipeline_schedule.ref_for_display), class: "ref-name" %td @@ -24,7 +24,7 @@ = s_("PipelineSchedules|Inactive") %td - if pipeline_schedule.owner - = image_tag avatar_icon_for_user(pipeline_schedule.owner, 20), class: "avatar s20" + = render Pajamas::AvatarComponent.new(pipeline_schedule.owner, size: 24, class: "gl-mr-2") = link_to user_path(pipeline_schedule.owner) do = pipeline_schedule.owner&.name %td diff --git a/app/views/projects/pipeline_schedules/edit.html.haml b/app/views/projects/pipeline_schedules/edit.html.haml index 642b458eea6..3f843ce6aec 100644 --- a/app/views/projects/pipeline_schedules/edit.html.haml +++ b/app/views/projects/pipeline_schedules/edit.html.haml @@ -7,4 +7,7 @@ = _("Edit Pipeline Schedule") %hr -= render "form" +- if Feature.enabled?(:pipeline_schedules_vue, @project) + #pipeline-schedules-form-edit{ data: { full_path: @project.full_path } } +- else + = render "form" diff --git a/app/views/projects/pipeline_schedules/index.html.haml b/app/views/projects/pipeline_schedules/index.html.haml index 661cf465081..47ad8cc826d 100644 --- a/app/views/projects/pipeline_schedules/index.html.haml +++ b/app/views/projects/pipeline_schedules/index.html.haml @@ -1,22 +1,28 @@ - breadcrumb_title _("Schedules") - page_title _("Pipeline Schedules") - add_page_specific_style 'page_bundles/pipeline_schedules' +- add_page_specific_style 'page_bundles/ci_status' #pipeline-schedules-callout{ data: { docs_url: help_page_path('ci/pipelines/schedules'), illustration_url: image_path('illustrations/pipeline_schedule_callout.svg') } } -.top-area - - schedule_path_proc = ->(scope) { pipeline_schedules_path(@project, scope: scope) } - = render "tabs", schedule_path_proc: schedule_path_proc, all_schedules: @all_schedules, scope: @scope - - if can?(current_user, :create_pipeline_schedule, @project) - .nav-controls - = link_to new_project_pipeline_schedule_path(@project), class: 'btn gl-button btn-confirm' do - %span= _('New schedule') - -- if @schedules.present? - %ul.content-list - = render partial: "table" +- if Feature.enabled?(:pipeline_schedules_vue, @project) + #pipeline-schedules-app{ data: { full_path: @project.full_path } } - else - .card.bg-light.gl-mt-3 - .nothing-here-block= _("No schedules") + .top-area + - schedule_path_proc = ->(scope) { pipeline_schedules_path(@project, scope: scope) } + = render "tabs", schedule_path_proc: schedule_path_proc, all_schedules: @all_schedules, scope: @scope + + - if can?(current_user, :create_pipeline_schedule, @project) + .nav-controls + = link_to new_project_pipeline_schedule_path(@project), class: 'btn gl-button btn-confirm' do + %span= _('New schedule') + + - if @schedules.present? + %ul.content-list + = render partial: "table" + - else + = render Pajamas::CardComponent.new(card_options: { class: 'bg-light gl-mt-3 gl-text-center' }) do |c| + - c.body do + = _("No schedules") -#pipeline-take-ownership-modal + #pipeline-take-ownership-modal diff --git a/app/views/projects/pipeline_schedules/new.html.haml b/app/views/projects/pipeline_schedules/new.html.haml index 3b4acf5b8c5..d3757d0e339 100644 --- a/app/views/projects/pipeline_schedules/new.html.haml +++ b/app/views/projects/pipeline_schedules/new.html.haml @@ -8,4 +8,7 @@ %h1.page-title.gl-font-size-h-display = _("Schedule a new pipeline") -= render "form" +- if Feature.enabled?(:pipeline_schedules_vue, @project) + #pipeline-schedules-form-new{ data: { full_path: @project.full_path } } +- else + = render "form" diff --git a/app/views/projects/pipelines/_info.html.haml b/app/views/projects/pipelines/_info.html.haml index 07e299d71ea..2e403358e2e 100644 --- a/app/views/projects/pipelines/_info.html.haml +++ b/app/views/projects/pipelines/_info.html.haml @@ -9,18 +9,21 @@ .well-segment.pipeline-info{ class: "gl-align-items-baseline!" } .icon-container = sprite_icon('clock', css_class: 'gl-top-0!') - = pluralize @pipeline.total_size, "job" - = @pipeline.ref_text + - jobs = n_('%d job', '%d jobs', @pipeline.total_size) % @pipeline.total_size - if @pipeline.duration - in - = time_interval_in_words(@pipeline.duration) + = s_('Pipelines|%{jobs} %{ref_text} in %{duration}').html_safe % { jobs: jobs, ref_text: @pipeline.ref_text, duration: time_interval_in_words(@pipeline.duration) } + - else + = jobs + = @pipeline.ref_text - if @pipeline.queued_duration - = "(queued for #{time_interval_in_words(@pipeline.queued_duration)})" + = s_("Pipelines|(queued for %{queued_duration})") % { queued_duration: time_interval_in_words(@pipeline.queued_duration)} - if has_pipeline_badges?(@pipeline) .well-segment.qa-pipeline-badges .icon-container = sprite_icon('flag', css_class: 'gl-top-0!') + - if @pipeline.schedule? + = gl_badge_tag _('Scheduled'), { variant: :info, size: :sm }, { class: 'js-pipeline-url-scheduled', title: _('This pipeline was triggered by a schedule.') } - if @pipeline.child? - text = sprintf(s_('Pipelines|Child pipeline (%{link_start}parent%{link_end})'), { link_start: "<a href='#{pipeline_path(@pipeline.triggered_by_pipeline)}' class='text-underline'>", link_end: "</a>"}).html_safe = gl_badge_tag text, { variant: :info, size: :sm }, { class: 'js-pipeline-child has-tooltip', title: s_("Pipelines|This is a child pipeline within the parent pipeline") } diff --git a/app/views/projects/pipelines/new.html.haml b/app/views/projects/pipelines/new.html.haml index a4144f8ab0d..d2b2a58fcf8 100644 --- a/app/views/projects/pipelines/new.html.haml +++ b/app/views/projects/pipelines/new.html.haml @@ -12,6 +12,7 @@ ref_param: params[:ref] || @project.default_branch, var_param: params[:var].to_json, file_param: params[:file_var].to_json, + project_path: @project.full_path, project_refs_endpoint: refs_project_path(@project, sort: 'updated_desc'), settings_link: project_settings_ci_cd_path(@project), max_warnings: ::Gitlab::Ci::Warnings::MAX_LIMIT } } diff --git a/app/views/projects/project_templates/_project_fields_form.html.haml b/app/views/projects/project_templates/_project_fields_form.html.haml index 7908550ca88..c3528b421b9 100644 --- a/app/views/projects/project_templates/_project_fields_form.html.haml +++ b/app/views/projects/project_templates/_project_fields_form.html.haml @@ -8,5 +8,5 @@ .selected-icon.gl-mr-3 .selected-template .input-group-append - %button.btn.gl-button.btn-default.change-template{ type: "button" } + = render Pajamas::ButtonComponent.new(button_options: { class: 'change-template' }) do = _('Change template') diff --git a/app/views/projects/protected_branches/_create_protected_branch.html.haml b/app/views/projects/protected_branches/_create_protected_branch.html.haml index 34fe9a29068..76aadc3be28 100644 --- a/app/views/projects/protected_branches/_create_protected_branch.html.haml +++ b/app/views/projects/protected_branches/_create_protected_branch.html.haml @@ -1,12 +1,12 @@ - content_for :merge_access_levels do .merge_access_levels-container - = dropdown_tag('Select', + = dropdown_tag(_('Select'), options: { toggle_class: 'js-allowed-to-merge wide', dropdown_class: 'dropdown-menu-selectable capitalize-header', dropdown_qa_selector: 'allowed_to_merge_dropdown_content', dropdown_testid: 'allowed-to-merge-dropdown', data: { field_name: 'protected_branch[merge_access_levels_attributes][0][access_level]', input_id: 'merge_access_levels_attributes', qa_selector: 'allowed_to_merge_dropdown' }}) - content_for :push_access_levels do .push_access_levels-container - = dropdown_tag('Select', + = dropdown_tag(_('Select'), options: { toggle_class: "js-allowed-to-push js-multiselect wide", dropdown_class: 'dropdown-menu-selectable capitalize-header', dropdown_qa_selector: 'allowed_to_push_dropdown_content' , dropdown_testid: 'allowed-to-push-dropdown', data: { field_name: 'protected_branch[push_access_levels_attributes][0][access_level]', input_id: 'push_access_levels_attributes', qa_selector: 'allowed_to_push_dropdown' }}) diff --git a/app/views/projects/protected_branches/shared/_create_protected_branch.html.haml b/app/views/projects/protected_branches/shared/_create_protected_branch.html.haml index 277cbf00034..770d79943b3 100644 --- a/app/views/projects/protected_branches/shared/_create_protected_branch.html.haml +++ b/app/views/projects/protected_branches/shared/_create_protected_branch.html.haml @@ -1,4 +1,4 @@ -= form_for [@project, @protected_branch], html: { class: 'new-protected-branch js-new-protected-branch' } do |f| += gitlab_ui_form_for [@project, @protected_branch], html: { class: 'new-protected-branch js-new-protected-branch' } do |f| %input{ type: 'hidden', name: 'update_section', value: 'js-protected-branches-settings' } = render Pajamas::CardComponent.new(card_options: { class: "gl-mb-5" }) do |c| - c.header do @@ -32,4 +32,4 @@ = (s_("ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}.") % { tag_start: force_push_link_start, tag_end: '</a>' }).html_safe = render_if_exists 'projects/protected_branches/ee/code_owner_approval_form', f: f - c.footer do - = f.submit s_('ProtectedBranch|Protect'), class: 'gl-button btn btn-confirm', disabled: true, data: { qa_selector: 'protect_button' } + = f.submit s_('ProtectedBranch|Protect'), disabled: true, data: { qa_selector: 'protect_button' }, pajamas_button: true diff --git a/app/views/projects/protected_branches/shared/_dropdown.html.haml b/app/views/projects/protected_branches/shared/_dropdown.html.haml index 4b09d36e7c3..d5111bd8be5 100644 --- a/app/views/projects/protected_branches/shared/_dropdown.html.haml +++ b/app/views/projects/protected_branches/shared/_dropdown.html.haml @@ -2,11 +2,11 @@ = f.hidden_field(:name) -= dropdown_tag('Select branch or create wildcard', += dropdown_tag(_('Select branch or create wildcard'), options: { toggle_class: "js-protected-branch-select js-filter-submit wide monospace qa-protected-branch-select #{toggle_classes}", filter: true, dropdown_class: "dropdown-menu-selectable git-revision-dropdown qa-protected-branch-dropdown", - placeholder: "Search protected branches", + placeholder: _("Search protected branches"), footer_content: true, data: { show_no: true, show_any: true, show_upcoming: true, selected: params[:protected_branch_name], @@ -14,6 +14,6 @@ %ul.dropdown-footer-list %li - %button{ class: "dropdown-create-new-item-button js-dropdown-create-new-item", title: "New Protected Branch" } - Create wildcard + %button{ class: "dropdown-create-new-item-button js-dropdown-create-new-item", title: _("New Protected Branch") } + = _('Create wildcard') %code diff --git a/app/views/projects/protected_tags/shared/_create_protected_tag.html.haml b/app/views/projects/protected_tags/shared/_create_protected_tag.html.haml index ba0935fff7d..9ea7f397c0a 100644 --- a/app/views/projects/protected_tags/shared/_create_protected_tag.html.haml +++ b/app/views/projects/protected_tags/shared/_create_protected_tag.html.haml @@ -1,9 +1,9 @@ = form_for [@project, @protected_tag], html: { class: 'new-protected-tag js-new-protected-tag' } do |f| %input{ type: 'hidden', name: 'update_section', value: 'js-protected-tags-settings' } - .card - .card-header + = render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-5' }) do |c| + - c.header do = _('Protect a tag') - .card-body + - c.body do = form_errors(@protected_tag) .form-group.row = f.label :name, _('Tag:'), class: 'col-md-2 text-left text-md-right' @@ -19,5 +19,5 @@ .create_access_levels-container = yield :create_access_levels - .card-footer + - c.footer do = f.submit _('Protect'), class: 'gl-button btn btn-confirm', disabled: true, data: { qa_selector: 'protect_tag_button' } diff --git a/app/views/projects/releases/index.html.haml b/app/views/projects/releases/index.html.haml index 9ddf2201fad..975abaefc6c 100644 --- a/app/views/projects/releases/index.html.haml +++ b/app/views/projects/releases/index.html.haml @@ -1,4 +1,5 @@ - page_title _('Releases') +- add_page_specific_style 'page_bundles/releases' - if use_startup_query_for_index_page? - add_page_startup_graphql_call('releases/all_releases', index_page_startup_query_variables) diff --git a/app/views/projects/releases/show.html.haml b/app/views/projects/releases/show.html.haml index 91ee9ad70a3..66b187c8c72 100644 --- a/app/views/projects/releases/show.html.haml +++ b/app/views/projects/releases/show.html.haml @@ -1,5 +1,6 @@ - add_to_breadcrumbs _("Releases"), project_releases_path(@project) - page_title @release.name - page_description @release.description_html +- add_page_specific_style 'page_bundles/releases' #js-show-release-page{ data: data_for_show_page } diff --git a/app/views/projects/repositories/_feed.html.haml b/app/views/projects/repositories/_feed.html.haml deleted file mode 100644 index ae0d9ab9908..00000000000 --- a/app/views/projects/repositories/_feed.html.haml +++ /dev/null @@ -1,18 +0,0 @@ -- commit = update -%tr - %td - = link_to project_commits_path(@project, commit.head.name) do - %strong - = commit.head.name - - if @project.root_ref?(commit.head.name) - %span.label default - - %td - %div - = link_to project_commits_path(@project, commit.id) do - %code= commit.short_id - = image_tag avatar_icon_for_email(commit.author_email), class: "", width: 16, alt: '' - = markdown(truncate(commit.title, length: 40), pipeline: :single_line, author: commit.author) - %td - %span.float-right.cgray - = time_ago_with_tooltip(commit.committed_date) diff --git a/app/views/projects/runners/_shared_runners.html.haml b/app/views/projects/runners/_shared_runners.html.haml index 3df4f3a0bd0..4689e70d907 100644 --- a/app/views/projects/runners/_shared_runners.html.haml +++ b/app/views/projects/runners/_shared_runners.html.haml @@ -5,6 +5,6 @@ - if @shared_runners_count == 0 = _('This GitLab instance does not provide any shared runners yet. Instance administrators can register shared runners in the admin area.') - else - %h4.underlined-title #{_('Available shared runners:')} #{@shared_runners_count} + %h5.gl-mt-6.gl-mb-0 #{_('Available shared runners:')} #{@shared_runners_count} %ul.bordered-list.available-shared-runners = render partial: 'projects/runners/runner', collection: @shared_runners, as: :runner diff --git a/app/views/projects/settings/access_tokens/index.html.haml b/app/views/projects/settings/access_tokens/index.html.haml index 7ecc8004334..9f598ffb2d1 100644 --- a/app/views/projects/settings/access_tokens/index.html.haml +++ b/app/views/projects/settings/access_tokens/index.html.haml @@ -4,7 +4,7 @@ - type_plural = _('project access tokens') - @content_class = 'limit-container-width' unless fluid_layout -.row.gl-mt-3 +.row.gl-mt-3.js-search-settings-section .col-lg-4 %h4.gl-mt-0 = page_title @@ -24,13 +24,11 @@ = _('You can enable project access token creation in %{link_start}group settings%{link_end}.').html_safe % { link_start: link_start, link_end: '</a>'.html_safe } .col-lg-8 - - if @new_resource_access_token - = render 'shared/access_tokens/created_container', - type: type, - new_token_value: @new_resource_access_token + #js-new-access-token-app{ data: { access_token_type: type } } - if current_user.can?(:create_resource_access_tokens, @project) = render 'shared/access_tokens/form', + ajax: true, type: type, path: project_settings_access_tokens_path(@project), resource: @project, @@ -39,12 +37,8 @@ access_levels: ProjectMember.permissible_access_level_roles(current_user, @project), default_access_level: Gitlab::Access::GUEST, prefix: :resource_access_token, + description_prefix: :project_access_token, help_path: help_page_path('user/project/settings/project_access_tokens', anchor: 'scopes-for-a-project-access-token') - = render 'shared/access_tokens/table', - active_tokens: @active_resource_access_tokens, - resource: @project, - 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.') + #js-access-token-table-app{ data: { access_token_type: type, access_token_type_plural: type_plural, initial_active_access_tokens: @active_resource_access_tokens.to_json, no_active_tokens_message: _('This project has no active access tokens.'), show_role: true + } } diff --git a/app/views/projects/settings/branch_rules/index.html.haml b/app/views/projects/settings/branch_rules/index.html.haml index 384d504e51f..a7e80101a88 100644 --- a/app/views/projects/settings/branch_rules/index.html.haml +++ b/app/views/projects/settings/branch_rules/index.html.haml @@ -1,6 +1,6 @@ - add_to_breadcrumbs _('Repository Settings'), project_settings_repository_path(@project) -- page_title _('Branch rules') +- page_title s_('BranchRules|Branch rules details') -%h3= _('Branch rules') +%h3.gl-mb-5= s_('BranchRules|Branch rules details') -#js-branch-rules{ data: { project_path: @project.full_path } } +#js-branch-rules{ data: { project_path: @project.full_path, protected_branches_path: project_settings_repository_path(@project, anchor: 'js-protected-branches-settings'), approval_rules_path: project_settings_merge_requests_path(@project, anchor: 'js-merge-request-approval-settings') } } 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 81526685bfc..5748b4b0330 100644 --- a/app/views/projects/settings/ci_cd/_autodevops_form.html.haml +++ b/app/views/projects/settings/ci_cd/_autodevops_form.html.haml @@ -41,4 +41,4 @@ = form.gitlab_ui_radio_component :deploy_strategy, 'timed_incremental', (s_('CICD|Continuous deployment to production using timed incremental rollout') + ' ' + help_link_timed).html_safe = form.gitlab_ui_radio_component :deploy_strategy, 'manual', (s_('CICD|Automatic deployment to staging, manual deployment to production') + ' ' + help_link_incremental).html_safe - = f.submit _('Save changes'), class: "btn gl-button btn-confirm gl-mt-5", data: { qa_selector: 'save_changes_button' } + = f.submit _('Save changes'), class: "gl-mt-5", data: { qa_selector: 'save_changes_button' }, pajamas_button: true diff --git a/app/views/projects/settings/ci_cd/_badge.html.haml b/app/views/projects/settings/ci_cd/_badge.html.haml index 38d8c8d26e1..99eef38827b 100644 --- a/app/views/projects/settings/ci_cd/_badge.html.haml +++ b/app/views/projects/settings/ci_cd/_badge.html.haml @@ -2,15 +2,15 @@ .col-lg-12 %h4 = badge.title.capitalize - .card - .card-header - %b - = badge.title.capitalize - · - = badge.to_html - .float-right - = render 'shared/ref_switcher', destination: 'badges', align_right: true - .card-body + = render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-5' }, header_options: { class: 'gl-display-flex gl-align-items-center' }) do |c| + - c.header do + .gl-flex-grow-1 + %b + = badge.title.capitalize + · + = badge.to_html + = render 'shared/ref_switcher', destination: 'badges', align_right: true + - c.body do .row .col-md-2.gl-text-center Markdown diff --git a/app/views/projects/settings/ci_cd/_form.html.haml b/app/views/projects/settings/ci_cd/_form.html.haml index 9419dacc16f..51d28411b30 100644 --- a/app/views/projects/settings/ci_cd/_form.html.haml +++ b/app/views/projects/settings/ci_cd/_form.html.haml @@ -77,7 +77,7 @@ = _("The maximum file size in megabytes for individual job artifacts.") = link_to sprite_icon('question-o'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'maximum-artifacts-size'), target: '_blank', rel: 'noopener noreferrer' - = f.submit _('Save changes'), class: "btn gl-button btn-confirm" + = f.submit _('Save changes'), pajamas_button: true %hr diff --git a/app/views/projects/settings/ci_cd/show.html.haml b/app/views/projects/settings/ci_cd/show.html.haml index c1df7b88352..c4f589f3f91 100644 --- a/app/views/projects/settings/ci_cd/show.html.haml +++ b/app/views/projects/settings/ci_cd/show.html.haml @@ -24,7 +24,7 @@ = expanded ? _('Collapse') : _('Expand') %p - auto_devops_url = help_page_path('topics/autodevops/index') - - quickstart_url = help_page_path('topics/autodevops/quick_start_guide') + - quickstart_url = help_page_path('topics/autodevops/cloud_deployments/auto_devops_with_gke') - auto_devops_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: auto_devops_url } - quickstart_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: quickstart_url } = s_('AutoDevOps|%{auto_devops_start}Automate building, testing, and deploying%{auto_devops_end} your applications based on your continuous integration and delivery configuration. %{quickstart_start}How do I get started?%{quickstart_end}').html_safe % { auto_devops_start: auto_devops_start, auto_devops_end: '</a>'.html_safe, quickstart_start: quickstart_start, quickstart_end: '</a>'.html_safe } @@ -119,4 +119,3 @@ = link_to _('Learn more'), help_page_path('ci/secure_files/index'), target: '_blank', rel: 'noopener noreferrer' .settings-content #js-ci-secure-files{ data: { project_id: @project.id, admin: can?(current_user, :admin_secure_files, @project).to_s, file_size_limit: Ci::SecureFile::FILE_SIZE_LIMIT.to_mb } } - diff --git a/app/views/projects/settings/integrations/index.html.haml b/app/views/projects/settings/integrations/index.html.haml index 84635941436..2077d244b24 100644 --- a/app/views/projects/settings/integrations/index.html.haml +++ b/app/views/projects/settings/integrations/index.html.haml @@ -2,8 +2,9 @@ - breadcrumb_title _('Integration Settings') - page_title _('Integrations') -%h3= _('Integrations') -- integrations_link_start = '<a href="%{url}">'.html_safe % { url: help_page_url('user/project/integrations/overview') } -- webhooks_link_start = '<a href="%{url}">'.html_safe % { url: project_hooks_path(@project) } -%p= _("%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}.").html_safe % { integrations_link_start: integrations_link_start, webhooks_link_start: webhooks_link_start, link_end: '</a>'.html_safe } -= render 'shared/integrations/index', integrations: @integrations +%section.js-search-settings-section + %h3= _('Integrations') + - integrations_link_start = '<a href="%{url}">'.html_safe % { url: help_page_url('user/project/integrations/index') } + - webhooks_link_start = '<a href="%{url}">'.html_safe % { url: project_hooks_path(@project) } + %p= _("%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}.").html_safe % { integrations_link_start: integrations_link_start, webhooks_link_start: webhooks_link_start, link_end: '</a>'.html_safe } + = render 'shared/integrations/index', integrations: @integrations diff --git a/app/views/projects/settings/merge_requests/show.html.haml b/app/views/projects/settings/merge_requests/show.html.haml index 886e276dea5..7dfd304e07b 100644 --- a/app/views/projects/settings/merge_requests/show.html.haml +++ b/app/views/projects/settings/merge_requests/show.html.haml @@ -4,7 +4,7 @@ %section.rspec-merge-request-settings.settings.merge-requests-feature.no-animate#js-merge-request-settings.expanded{ class: [('hidden' if @project.project_feature.send(:merge_requests_access_level) == 0)], data: { qa_selector: 'merge_request_settings_content' } } .settings-header - %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Merge requests') + %h4= _('Merge requests') = render_if_exists 'projects/merge_request_settings_description_text' .settings-content @@ -13,6 +13,7 @@ = gitlab_ui_form_for @project, url: project_settings_merge_requests_path(@project), html: { multipart: true, class: "merge-request-settings-form js-mr-settings-form" }, authenticity_token: true do |f| %input{ name: 'update_section', type: 'hidden', value: 'js-merge-request-settings' } = render 'projects/merge_request_settings', form: f - = f.submit _('Save changes'), class: "btn gl-button btn-confirm rspec-save-merge-request-changes", data: { qa_selector: 'save_merge_request_changes_button' } + = f.submit _('Save changes'), class: "rspec-save-merge-request-changes", data: { qa_selector: 'save_merge_request_changes_button' }, pajamas_button: true = render_if_exists 'projects/settings/merge_requests/merge_request_approvals_settings', expanded: true += render_if_exists 'projects/settings/merge_requests/suggested_reviewers_settings', expanded: true diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index e9d1661a4f1..c7ac28fa194 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -2,6 +2,7 @@ - @content_class = "limit-container-width" unless fluid_layout - @skip_current_level_breadcrumb = true - add_page_specific_style 'page_bundles/project' +- add_page_specific_style 'page_bundles/tree' = content_for :meta_tags do = auto_discovery_link_tag(:atom, project_path(@project, rss_url_options), title: "#{@project.name} activity") diff --git a/app/views/projects/snippets/show.html.haml b/app/views/projects/snippets/show.html.haml index 3e6acdb130a..ddebc19be15 100644 --- a/app/views/projects/snippets/show.html.haml +++ b/app/views/projects/snippets/show.html.haml @@ -5,7 +5,7 @@ #js-snippet-view{ data: {'qa-selector': 'snippet_view', 'snippet-gid': @snippet.to_global_id, 'report-abuse-path': snippet_report_abuse_path(@snippet), 'can-report-spam': @snippet.submittable_as_spam_by?(current_user).to_s } } -.row-content-block.top-block.content-component-block +.row-content-block.top-block.content-component-block.gl-px-0.gl-py-2 = render 'award_emoji/awards_block', awardable: @snippet, inline: true, api_awards_path: project_snippets_award_api_path(@snippet) #notes.limited-width-notes= render "shared/notes/notes_with_form", :autocomplete => true diff --git a/app/views/projects/starrers/_starrer.html.haml b/app/views/projects/starrers/_starrer.html.haml index e24276fcaea..c1cd2488142 100644 --- a/app/views/projects/starrers/_starrer.html.haml +++ b/app/views/projects/starrers/_starrer.html.haml @@ -2,8 +2,8 @@ .col-lg-3.col-md-4.col-sm-12 .card - .card-body - = image_tag avatar_icon_for_user(starrer.user, 40), class: "avatar s40", alt: '' + .card-body.gl-display-flex + = render Pajamas::AvatarComponent.new(starrer.user, size: 48, alt: "", class: 'gl-mr-3') .user-info .block-truncated diff --git a/app/views/projects/tags/new.html.haml b/app/views/projects/tags/new.html.haml index 79fc1a64790..ed06c90efa8 100644 --- a/app/views/projects/tags/new.html.haml +++ b/app/views/projects/tags/new.html.haml @@ -9,6 +9,11 @@ %h1.page-title.gl-font-size-h-display = s_('TagsPage|New Tag') +%p.gl-text-secondary + - link_start = '<a href="%{url}">'.html_safe % { url: new_namespace_project_release_path } + - link_end = '</a>'.html_safe + = s_('TagsPage|Do you want to create a release with the new tag? You can do that in the %{link_start}New release page%{link_end}.').html_safe % { link_start: link_start, link_end: link_end } + = form_tag namespace_project_tags_path, method: :post, id: "new-tag-form", class: "common-note-form tag-form js-quick-submit js-requires-input" do .form-group.row .col-sm-12 @@ -31,22 +36,7 @@ = text_area_tag :message, @message, required: false, class: 'form-control', rows: 5, data: { qa_selector: "tag_message_field" } .form-text.text-muted = tag_description_help_text - .form-group.row - .col-sm-12 - = label_tag :release_description, s_('TagsPage|Release notes'), class: 'gl-mb-0' - .form-text.mb-3 - - link_start = '<a href="%{url}" rel="noopener noreferrer" target="_blank">'.html_safe - - releases_page_path = project_releases_path(@project) - - releases_page_link_start = link_start % { url: releases_page_path } - - docs_url = help_page_path('user/project/releases/index.md', anchor: 'create-a-release') - - docs_link_start = link_start % { url: docs_url } - - link_end = '</a>'.html_safe - - replacements = { releases_page_link_start: releases_page_link_start, docs_link_start: docs_link_start, link_end: link_end } - = s_('TagsPage|Optionally, create a public Release of your project, based on this tag. Release notes are displayed on the %{releases_page_link_start}Releases%{link_end} page. %{docs_link_start}More information%{link_end}').html_safe % replacements - = render layout: 'shared/md_preview', locals: { url: preview_markdown_path(@project), referenced_users: true } do - = render 'shared/zen', attr: :release_description, classes: 'note-textarea', placeholder: s_('TagsPage|Write your release notes or drag files here…'), current_text: @release_description, qa_selector: 'release_notes_field' - = render 'shared/notes/hints' .gl-display-flex = render Pajamas::ButtonComponent.new(variant: :confirm, button_options: { class: 'gl-mr-3', data: { qa_selector: "create_tag_button" }, type: 'submit' }) do = s_('TagsPage|Create tag') diff --git a/app/views/projects/tree/show.html.haml b/app/views/projects/tree/show.html.haml index 1553eda1cfb..6d1ab80bdc5 100644 --- a/app/views/projects/tree/show.html.haml +++ b/app/views/projects/tree/show.html.haml @@ -1,3 +1,4 @@ +- add_page_specific_style 'page_bundles/tree' - current_route_path = request.fullpath.match(%r{-/tree/[^/]+/(.+$)}).to_a[1] - add_page_startup_graphql_call('repository/path_last_commit', { projectPath: @project.full_path, ref: current_ref, path: current_route_path || "" }) - add_page_startup_graphql_call('repository/permissions', { projectPath: @project.full_path }) diff --git a/app/views/projects/triggers/_index.html.haml b/app/views/projects/triggers/_index.html.haml index 0c53ed48210..a7f29b5cbf9 100644 --- a/app/views/projects/triggers/_index.html.haml +++ b/app/views/projects/triggers/_index.html.haml @@ -1,11 +1,11 @@ .row.gl-mt-3.gl-mb-3 .col-lg-12 - .card - .card-header + = render Pajamas::CardComponent.new do |c| + - c.header do = _("Manage your project's triggers") - .card-body + - c.body do = render 'projects/triggers/form', btn_text: _('Add trigger') - %hr + .gl-mb-5 - if Feature.enabled?(:ci_pipeline_triggers_settings_vue_ui, @project) #js-ci-pipeline-triggers-list.triggers-list{ data: { triggers: @triggers_json } } - else @@ -28,11 +28,11 @@ %th = render partial: 'projects/triggers/trigger', collection: @triggers, as: :trigger - else - %p.settings-message.text-center.gl-mb-3{ data: { testid: 'no_triggers_content' } } - = _('No triggers exist yet. Use the form above to create one.') - - .card-footer - + = render Pajamas::AlertComponent.new(variant: :warning, show_icon: false, dismissible: false, + alert_options: { data: { testid: 'no_triggers_content' }}) do |c| + = c.body do + = _('No triggers exist yet. Use the form above to create one.') + - c.footer do %p = _("These examples show how to trigger this project's pipeline for a branch or tag.") diff --git a/app/views/projects/work_items/index.html.haml b/app/views/projects/work_items/index.html.haml index 8575fd10ad3..69597aab7ef 100644 --- a/app/views/projects/work_items/index.html.haml +++ b/app/views/projects/work_items/index.html.haml @@ -1,5 +1,7 @@ - page_title s_('WorkItem|Work Items') - add_page_specific_style 'page_bundles/work_items' +- @gfm_form = true +- @noteable_type = 'WorkItem' #js-work-items{ data: work_items_index_data(@project) } = render 'projects/invite_members_modal', project: @project diff --git a/app/views/registrations/welcome/show.html.haml b/app/views/registrations/welcome/show.html.haml index 911ba5e8042..fe455f4a0bc 100644 --- a/app/views/registrations/welcome/show.html.haml +++ b/app/views/registrations/welcome/show.html.haml @@ -17,7 +17,11 @@ %p.gl-text-center= html_escape(_('%{gitlab_experience_text}. We won\'t share this information with anyone.')) % { gitlab_experience_text: gitlab_experience_text } - else %p.gl-text-center= html_escape(_('%{gitlab_experience_text}. Don\'t worry, this information isn\'t shared outside of your self-managed GitLab instance.')) % { gitlab_experience_text: gitlab_experience_text } - = gitlab_ui_form_for(current_user, url: users_sign_up_welcome_path, html: { class: 'card gl-w-full! gl-p-5 js-users-signup-welcome', 'aria-live' => 'assertive' }) do |f| + = gitlab_ui_form_for(current_user, + url: users_sign_up_welcome_path(glm_tracking_params), + html: { class: 'card gl-w-full! gl-p-5 js-users-signup-welcome', + 'aria-live' => 'assertive', + data: { testid: 'welcome-form' } }) do |f| .devise-errors = render 'devise/shared/error_messages', resource: current_user .row diff --git a/app/views/search/_results.html.haml b/app/views/search/_results.html.haml index 168f4ca10bc..8262c3c90e1 100644 --- a/app/views/search/_results.html.haml +++ b/app/views/search/_results.html.haml @@ -1,26 +1,19 @@ - search_bar_classes = 'search-sidebar gl-display-flex gl-flex-direction-column gl-mr-4' + = render_if_exists 'shared/promotions/promote_advanced_search' -= render partial: 'search/results_status', locals: { search_service: @search_service } unless @search_objects.to_a.empty? +- if Feature.enabled?(:search_page_vertical_nav, current_user) && %w[issues merge_requests].include?(@scope) + .results.gl-md-display-flex.gl-mt-0 + #js-search-sidebar{ class: search_bar_classes, data: { navigation: search_navigation_json } } + .gl-w-full.gl-flex-grow-1.gl-overflow-x-hidden + = render partial: 'search/results_status', locals: { search_service: @search_service } unless @search_objects.to_a.empty? + = render partial: 'search/results_list' + +- else + = render partial: 'search/results_status', locals: { search_service: @search_service } unless @search_objects.to_a.empty? -.results.gl-md-display-flex.gl-mt-3 - - if %w[issues merge_requests].include?(@scope) - #js-search-sidebar{ class: search_bar_classes } - .gl-w-full.gl-flex-grow-1.gl-overflow-x-hidden - - if @timeout - = render partial: "search/results/timeout" - - elsif @search_objects.to_a.empty? - = render partial: "search/results/empty" - - else - - if @scope == 'commits' - %ul.content-list.commit-list - = render partial: "search/results/commit", collection: @search_objects - - else - .search-results - - if @scope == 'projects' - .term - = render 'shared/projects/list', projects: @search_objects, pipeline_status: false - - else - = render_if_exists partial: "search/results/#{@scope.singularize}", collection: @search_objects + .results.gl-md-display-flex.gl-mt-3 + - if %w[issues merge_requests].include?(@scope) + #js-search-sidebar{ class: search_bar_classes, data: { navigation: search_navigation_json } } - - if @scope != 'projects' - = paginate_collection(@search_objects) + .gl-w-full.gl-flex-grow-1.gl-overflow-x-hidden + = render partial: 'search/results_list' diff --git a/app/views/search/_results_list.html.haml b/app/views/search/_results_list.html.haml new file mode 100644 index 00000000000..cf910402ad4 --- /dev/null +++ b/app/views/search/_results_list.html.haml @@ -0,0 +1,18 @@ +- if @timeout + = render partial: "search/results/timeout" +- elsif @search_objects.to_a.empty? + = render partial: "search/results/empty" +- else + - if @scope == 'commits' + %ul.content-list.commit-list + = render partial: "search/results/commit", collection: @search_objects + - else + .search-results + - if @scope == 'projects' + .term + = render 'shared/projects/list', projects: @search_objects, pipeline_status: false + - else + = render_if_exists partial: "search/results/#{@scope.singularize}", collection: @search_objects + + - if @scope != 'projects' + = paginate_collection(@search_objects) diff --git a/app/views/search/_results_status.html.haml b/app/views/search/_results_status.html.haml index ef5e3e83103..e6bb0c18b90 100644 --- a/app/views/search/_results_status.html.haml +++ b/app/views/search/_results_status.html.haml @@ -2,24 +2,8 @@ - return unless search_service.show_results_status? -.search-results-status - .row-content-block.gl-display-flex - .gl-md-display-flex.gl-text-left.gl-align-items-center.gl-flex-grow-1 - - unless search_service.without_count? - = search_entries_info(search_service.search_objects, search_service.scope, params[:search]) - - unless search_service.show_snippets? - - if search_service.project - - link_to_project = link_to(search_service.project.full_name, search_service.project, class: 'ml-md-1') - - if search_service.scope == 'blobs' - = _("in") - .mx-md-1 - #js-blob-ref-switcher{ data: { "project-id" => search_service.project.id, "ref" => repository_ref(search_service.project), "field-name": "repository_ref" } } - = s_('SearchCodeResults|of %{link_to_project}').html_safe % { link_to_project: link_to_project } - - else - = _("in project %{link_to_project}").html_safe % { link_to_project: link_to_project } - - elsif search_service.group - - link_to_group = link_to(search_service.group.name, search_service.group, class: 'ml-md-1') - = _("in group %{link_to_group}").html_safe % { link_to_group: link_to_group } - - if search_service.show_sort_dropdown? - .gl-md-display-flex.gl-flex-direction-column - #js-search-sort{ data: { "search-sort-options" => search_sort_options.to_json } } +- if Feature.enabled?(:search_page_vertical_nav, current_user) + = render partial: 'search/results_status_vert_nav', locals: { search_service: @search_service } + +- else + = render partial: 'search/results_status_horiz_nav', locals: { search_service: @search_service } diff --git a/app/views/search/_results_status_horiz_nav.html.haml b/app/views/search/_results_status_horiz_nav.html.haml new file mode 100644 index 00000000000..fe6ee0f12ec --- /dev/null +++ b/app/views/search/_results_status_horiz_nav.html.haml @@ -0,0 +1,22 @@ +.search-results-status + .row-content-block.gl-display-flex + .gl-md-display-flex.gl-text-left.gl-align-items-center.gl-flex-grow-1 + - unless search_service.without_count? + = search_entries_info(search_service.search_objects, search_service.scope, params[:search]) + - unless search_service.show_snippets? + - if search_service.project + - link_to_project = link_to(search_service.project.full_name, search_service.project, class: 'ml-md-1') + - if search_service.scope == 'blobs' + = _("in") + .mx-md-1 + #js-blob-ref-switcher{ data: { "project-id" => search_service.project.id, "ref" => repository_ref(search_service.project), "field-name": "repository_ref" } } + = s_('SearchCodeResults|of %{link_to_project}').html_safe % { link_to_project: link_to_project } + - else + = _("in project %{link_to_project}").html_safe % { link_to_project: link_to_project } + - elsif search_service.group + - link_to_group = link_to(search_service.group.name, search_service.group, class: 'ml-md-1') + = _("in group %{link_to_group}").html_safe % { link_to_group: link_to_group } + - if search_service.show_sort_dropdown? + .gl-md-display-flex.gl-flex-direction-column + #js-search-sort{ data: { "search-sort-options" => search_sort_options.to_json } } + diff --git a/app/views/search/_results_status_vert_nav.html.haml b/app/views/search/_results_status_vert_nav.html.haml new file mode 100644 index 00000000000..03916911f43 --- /dev/null +++ b/app/views/search/_results_status_vert_nav.html.haml @@ -0,0 +1,23 @@ +.search-results-status + .gl-display-flex.gl-flex-direction-column + .gl-p-5.gl-display-flex + .gl-md-display-flex.gl-text-left.gl-align-items-center.gl-flex-grow-1 + - unless search_service.without_count? + = search_entries_info(search_service.search_objects, search_service.scope, params[:search]) + - unless search_service.show_snippets? + - if search_service.project + - link_to_project = link_to(search_service.project.full_name, search_service.project, class: 'ml-md-1') + - if search_service.scope == 'blobs' + = _("in") + .mx-md-1 + #js-blob-ref-switcher{ data: { "project-id" => search_service.project.id, "ref" => repository_ref(search_service.project), "field-name": "repository_ref" } } + = s_('SearchCodeResults|of %{link_to_project}').html_safe % { link_to_project: link_to_project } + - else + = _("in project %{link_to_project}").html_safe % { link_to_project: link_to_project } + - elsif search_service.group + - link_to_group = link_to(search_service.group.name, search_service.group, class: 'ml-md-1') + = _("in group %{link_to_group}").html_safe % { link_to_group: link_to_group } + - if search_service.show_sort_dropdown? + .gl-md-display-flex.gl-flex-direction-column + #js-search-sort{ data: { "search-sort-options" => search_sort_options.to_json } } + %hr.gl-mb-5.gl-mt-0.gl-border-gray-100.gl-w-full diff --git a/app/views/search/results/_snippet_title.html.haml b/app/views/search/results/_snippet_title.html.haml index a28d9effbdd..a811dabf399 100644 --- a/app/views/search/results/_snippet_title.html.haml +++ b/app/views/search/results/_snippet_title.html.haml @@ -15,6 +15,6 @@ %span by = link_to user_snippets_path(snippet_title.author) do - = image_tag avatar_icon_for_user(snippet_title.author), class: "avatar avatar-inline s16", alt: '' + = render Pajamas::AvatarComponent.new(snippet_title.author, size: 16, class: 'gl-mt-n1') = snippet_title.author_name %span.light= time_ago_with_tooltip(snippet_title.created_at) diff --git a/app/views/search/results/_wiki_blob.html.haml b/app/views/search/results/_wiki_blob.html.haml index b59275c35df..d6900c397a0 100644 --- a/app/views/search/results/_wiki_blob.html.haml +++ b/app/views/search/results/_wiki_blob.html.haml @@ -4,6 +4,6 @@ %div{ class: 'search-result-row gl-pb-3! gl-mt-5 gl-mb-0!' } %span.gl-display-flex.gl-align-items-center = link_to wiki_blob_link, data: { track_action: 'click_text', track_label: "wiki_title", track_property: 'search_result' }, class: 'gl-w-full' do - %span.term.str-truncated.gl-font-weight-bold= ::Gitlab::Git::Wiki::GollumSlug.canonicalize_filename(wiki_blob.path) + %span.term.str-truncated.gl-font-weight-bold= ::Wiki.canonicalize_filename(wiki_blob.path) .description.term.col-sm-10.gl-px-0 = simple_search_highlight_and_truncate(wiki_blob.data, @search_term) diff --git a/app/views/search/show.html.haml b/app/views/search/show.html.haml index 5a45e512579..9d812e77ad4 100644 --- a/app/views/search/show.html.haml +++ b/app/views/search/show.html.haml @@ -22,5 +22,6 @@ .gl-mt-3 #js-search-topbar{ data: { "group-initial-data": group_attributes.to_json, "project-initial-data": project_attributes.to_json } } - if @search_term - = render 'search/category' + - if Feature.disabled?(:search_page_vertical_nav, current_user) + = render 'search/category' = render 'search/results' diff --git a/app/views/shared/_clone_panel.html.haml b/app/views/shared/_clone_panel.html.haml index 6b502ee928e..48ae1f7eb1d 100644 --- a/app/views/shared/_clone_panel.html.haml +++ b/app/views/shared/_clone_panel.html.haml @@ -9,14 +9,14 @@ %span.js-clone-dropdown-label = default_clone_protocol.upcase = sprite_icon('chevron-down', css_class: 'gl-icon') - %ul.dropdown-menu.dropdown-menu-selectable.clone-options-dropdown + %ul.dropdown-menu.dropdown-menu-selectable.clone-options-dropdown{ data: { qa_selector: 'clone_dropdown_content' } } %li = ssh_clone_button(container) %li = http_clone_button(container) = render_if_exists 'shared/kerberos_clone_button', container: container - = text_field_tag :clone_url, default_url_to_repo(container), class: "js-select-on-focus btn gl-button", readonly: true, aria: { label: _('Repository clone URL') } + = text_field_tag :clone_url, default_url_to_repo(container), class: "js-select-on-focus btn gl-button", readonly: true, aria: { label: _('Repository clone URL') }, data: { qa_selector: 'clone_url_content' } .input-group-append = clipboard_button(target: '#clone_url', title: _("Copy URL"), class: "input-group-text gl-button btn-default btn-clipboard") diff --git a/app/views/shared/_commit_well.html.haml b/app/views/shared/_commit_well.html.haml deleted file mode 100644 index 48fe258d01f..00000000000 --- a/app/views/shared/_commit_well.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -.info-well.d-none.d-sm-block.project-last-commit.gl-mb-3 - .well-segment - %ul.blob-commit-info - = render 'projects/commits/commit', commit: commit, ref: ref, project: project diff --git a/app/views/shared/_custom_attributes.html.haml b/app/views/shared/_custom_attributes.html.haml index 966ab8e3cb1..6e5f1cb063c 100644 --- a/app/views/shared/_custom_attributes.html.haml +++ b/app/views/shared/_custom_attributes.html.haml @@ -1,12 +1,13 @@ - return unless custom_attributes.present? -.card - .card-header += render Pajamas::CardComponent.new(body_options: { class: 'gl-py-0' }) do |c| + - c.header do = link_to(_('Custom Attributes'), help_page_path('api/custom_attributes.md')) - %ul.content-list - - custom_attributes.each do |custom_attribute| - %li - %span.light - = custom_attribute.key - %strong - = custom_attribute.value + - c.body do + %ul.content-list + - custom_attributes.each do |custom_attribute| + %li + %span.light + = custom_attribute.key + %strong + = custom_attribute.value diff --git a/app/views/shared/_file_highlight.html.haml b/app/views/shared/_file_highlight.html.haml index 89be816fc76..73ace033dc6 100644 --- a/app/views/shared/_file_highlight.html.haml +++ b/app/views/shared/_file_highlight.html.haml @@ -4,11 +4,10 @@ - blame_path = project_blame_path(@project, tree_join(@ref, blob.path)) .line-numbers{ class: "gl-px-0!", data: { blame_path: blame_path } } - if blob.data.present? - - link = blob_link if defined?(blob_link) - blob.data.each_line.each_with_index do |_, index| - i = index + offset -# We're not using `link_to` because it is too slow once we get to thousands of lines. - %a.file-line-num.diff-line-num{ class: ("js-line-links" if Feature.enabled?(:file_line_blame)), href: "#{link}#L#{i}", id: "L#{i}", 'data-line-number' => i } + %a.file-line-num.diff-line-num{ class: ("js-line-links" if Feature.enabled?(:file_line_blame)), href: "#L#{i}", id: "L#{i}", 'data-line-number' => i } = i - highlight = defined?(highlight_line) && highlight_line ? highlight_line - offset : nil .blob-content{ data: { blob_id: blob.id, path: blob.path, highlight_line: highlight, qa_selector: 'file_content' } } diff --git a/app/views/shared/access_tokens/_form.html.haml b/app/views/shared/access_tokens/_form.html.haml index 0c88ac66b8b..eada58091b7 100644 --- a/app/views/shared/access_tokens/_form.html.haml +++ b/app/views/shared/access_tokens/_form.html.haml @@ -1,6 +1,7 @@ - ajax = local_assigns.fetch(:ajax, false) - title = local_assigns.fetch(:title, _('Add a %{type}') % { type: type }) - prefix = local_assigns.fetch(:prefix, :personal_access_token) +- description_prefix = local_assigns.fetch(:description_prefix, prefix) - help_path = local_assigns.fetch(:help_path) - resource = local_assigns.fetch(:resource, false) - access_levels = local_assigns.fetch(:access_levels, false) @@ -43,7 +44,7 @@ %p.text-secondary#select_scope_help_text = s_('Tokens|Scopes set the permission levels granted to the token.') = link_to _("Learn more."), help_path, target: '_blank', rel: 'noopener noreferrer' - = render 'shared/tokens/scopes_form', prefix: prefix, token: token, scopes: scopes, f: f + = render 'shared/tokens/scopes_form', prefix: prefix, description_prefix: description_prefix, token: token, scopes: scopes, f: f .gl-mt-3 - = f.submit _('Create %{type}') % { type: type }, class: 'gl-button btn btn-confirm', data: { qa_selector: 'create_token_button' } + = f.submit _('Create %{type}') % { type: type }, data: { qa_selector: 'create_token_button' }, pajamas_button: true diff --git a/app/views/shared/blob/_markdown_buttons.html.haml b/app/views/shared/blob/_markdown_buttons.html.haml index 4db1d20e81b..db53d78dadb 100644 --- a/app/views/shared/blob/_markdown_buttons.html.haml +++ b/app/views/shared/blob/_markdown_buttons.html.haml @@ -1,4 +1,5 @@ - modifier_key = client_js_flags[:isMac] ? '⌘' : s_('KeyboardKey|Ctrl+') +- supports_file_upload = local_assigns.fetch(:supports_file_upload, true) .md-header-toolbar.active = markdown_toolbar_button({ icon: "bold", @@ -23,14 +24,19 @@ = markdown_toolbar_button({ icon: "list-bulleted", data: { "md-tag" => "- ", "md-prepend" => true }, title: _("Add a bullet list") }) = markdown_toolbar_button({ icon: "list-numbered", data: { "md-tag" => "1. ", "md-prepend" => true }, title: _("Add a numbered list") }) = markdown_toolbar_button({ icon: "list-task", data: { "md-tag" => "- [ ] ", "md-prepend" => true }, title: _("Add a checklist") }) + = markdown_toolbar_button({ icon: "list-indent", + data: { "md-command" => 'indentLines', "md-shortcuts": '["mod+]"]' }, + css_class: 'gl-display-none', + title: sprintf(s_("MarkdownEditor|Indent line (%{modifier_key}])") % { modifier_key: modifier_key }) }) + = markdown_toolbar_button({ icon: "list-outdent", + data: { "md-command" => 'outdentLines', "md-shortcuts": '["mod+["]' }, + css_class: 'gl-display-none', + title: sprintf(s_("MarkdownEditor|Outdent line (%{modifier_key}[)") % { modifier_key: modifier_key }) }) = markdown_toolbar_button({ icon: "details-block", data: { "md-tag" => "<details><summary>Click to expand</summary>\n{text}\n</details>", "md-prepend" => true, "md-select" => "Click to expand" }, title: _("Add a collapsible section") }) - = markdown_toolbar_button({ icon: "table", data: { "md-tag" => "| header | header |\n| ------ | ------ |\n| cell | cell |\n| cell | cell |", "md-prepend" => true }, title: _("Add a table") }) - = markdown_toolbar_button({ icon: "paperclip", - data: { "testid" => "button-attach-file" }, - css_class: 'js-attach-file-button markdown-selector', - title: _("Attach a file or image") }) + = markdown_toolbar_button({ icon: "table", data: { "md-tag" => "| header | header |\n| ------ | ------ |\n| | |\n| | |", "md-prepend" => true }, title: _("Add a table") }) + - if supports_file_upload + = render Pajamas::ButtonComponent.new(icon: 'paperclip', category: :tertiary, button_options: { 'aria-label': _("Attach a file or image"), class: 'has-tooltip js-attach-file-button', data: { testid: 'button-attach-file', container: 'body' } }) - if show_fullscreen_button - %button.gl-button.btn.btn-default-tertiary.btn-icon.js-zen-enter.has-tooltip{ type: "button", tabindex: -1, "aria-label": "Go full screen", title: _("Go full screen"), data: { container: "body" } } - = sprite_icon("maximize") + = render Pajamas::ButtonComponent.new(icon: 'maximize', category: :tertiary, button_options: { 'tabindex': -1, 'aria-label': _("Go full screen"), class: 'has-tooltip js-zen-enter', data: { container: 'body' } }) diff --git a/app/views/shared/deploy_keys/_project_group_form.html.haml b/app/views/shared/deploy_keys/_project_group_form.html.haml index d76ef8feb62..11fa44fe282 100644 --- a/app/views/shared/deploy_keys/_project_group_form.html.haml +++ b/app/views/shared/deploy_keys/_project_group_form.html.haml @@ -17,4 +17,4 @@ help_text: _('Allow this key to push to this repository') .form-group.row - = f.submit _("Add key"), class: "btn gl-button btn-confirm", data: { qa_selector: "add_deploy_key_button"} + = f.submit _("Add key"), data: { qa_selector: "add_deploy_key_button"}, pajamas_button: true diff --git a/app/views/shared/deploy_tokens/_form.html.haml b/app/views/shared/deploy_tokens/_form.html.haml index eade973d72a..1b48843eb10 100644 --- a/app/views/shared/deploy_tokens/_form.html.haml +++ b/app/views/shared/deploy_tokens/_form.html.haml @@ -34,4 +34,4 @@ = f.gitlab_ui_checkbox_component :write_package_registry, 'write_package_registry', help_text: s_('DeployTokens|Allows read and write access to the package registry.'), checkbox_options: { data: { qa_selector: 'deploy_token_write_package_registry_checkbox' } } .gl-mt-3 - = f.submit s_('DeployTokens|Create deploy token'), class: 'btn gl-button btn-confirm', data: { qa_selector: 'create_deploy_token_button' } + = f.submit s_('DeployTokens|Create deploy token'), data: { qa_selector: 'create_deploy_token_button' }, pajamas_button: true diff --git a/app/views/shared/deploy_tokens/_index.html.haml b/app/views/shared/deploy_tokens/_index.html.haml index 79bf35e2726..faec379e42b 100644 --- a/app/views/shared/deploy_tokens/_index.html.haml +++ b/app/views/shared/deploy_tokens/_index.html.haml @@ -8,10 +8,20 @@ %p = description .settings-content - - if @created_deploy_token - = render 'shared/deploy_tokens/new_deploy_token', deploy_token: @created_deploy_token - %h5.gl-mt-0 - = s_('DeployTokens|New deploy token') - = render 'shared/deploy_tokens/form', group_or_project: group_or_project, token: @new_deploy_token, presenter: @deploy_tokens + - if Feature.enabled?(:ajax_new_deploy_token, group_or_project) + #js-new-deploy-token{ data: { + container_registry_enabled: container_registry_enabled?(group_or_project), + packages_registry_enabled: packages_registry_enabled?(group_or_project), + create_new_token_path: create_deploy_token_path(group_or_project), + token_type: group_or_project.is_a?(Group) ? 'group' : 'project', + deploy_tokens_help_url: help_page_path('user/project/deploy_tokens/index.md') + } + } + - else + - if @created_deploy_token + = render 'shared/deploy_tokens/new_deploy_token', deploy_token: @created_deploy_token + %h5.gl-mt-0 + = s_('DeployTokens|New deploy token') + = render 'shared/deploy_tokens/form', group_or_project: group_or_project, token: @new_deploy_token, presenter: @deploy_tokens %hr = render 'shared/deploy_tokens/table', group_or_project: group_or_project, active_tokens: @deploy_tokens diff --git a/app/views/shared/doorkeeper/applications/_index.html.haml b/app/views/shared/doorkeeper/applications/_index.html.haml index b14ff9b2508..6a770a4fcb2 100644 --- a/app/views/shared/doorkeeper/applications/_index.html.haml +++ b/app/views/shared/doorkeeper/applications/_index.html.haml @@ -1,6 +1,6 @@ - @content_class = "limit-container-width" unless fluid_layout -.row.gl-mt-3 +.row.gl-mt-3.js-search-settings-section .col-lg-4.profile-settings-sidebar %h4.gl-mt-0 = page_title diff --git a/app/views/shared/issuable/_bulk_update_sidebar.html.haml b/app/views/shared/issuable/_bulk_update_sidebar.html.haml index 0bec94f70ea..e6bdefc64d2 100644 --- a/app/views/shared/issuable/_bulk_update_sidebar.html.haml +++ b/app/views/shared/issuable/_bulk_update_sidebar.html.haml @@ -14,7 +14,7 @@ .block .title = _('Status') - .js-issue-status + .js-status-dropdown .block .title = _('Assignee') @@ -41,15 +41,7 @@ .block .title = _('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 - %ul - %li - %a{ href: "#", data: { id: "subscribe" } } - = _('Subscribe') - %li - %a{ href: "#", data: { id: "unsubscribe" } } - = _('Unsubscribe') + .js-subscriptions-dropdown = hidden_field_tag "update[issuable_ids]", [] = hidden_field_tag :state_event, params[:state_event] diff --git a/app/views/shared/issuable/_feed_buttons.html.haml b/app/views/shared/issuable/_feed_buttons.html.haml index 69ff477d415..94b7fe14721 100644 --- a/app/views/shared/issuable/_feed_buttons.html.haml +++ b/app/views/shared/issuable/_feed_buttons.html.haml @@ -1,8 +1,8 @@ - show_calendar_button = local_assigns.fetch(:show_calendar_button, true) -= link_to safe_params.merge(rss_url_options), class: 'btn gl-button btn-default btn-icon has-tooltip', data: { container: 'body', testid: 'rss-feed-link' }, title: _('Subscribe to RSS feed') , 'aria-label': _('Subscribe to RSS feed') do - = sprite_icon('rss') += render Pajamas::ButtonComponent.new(href: safe_params.merge(rss_url_options), icon: 'rss', button_options: { class: 'has-tooltip', 'aria-label': _('Subscribe to RSS feed'), data: { container: 'body', testid: 'rss-feed-link' } }) do + = _('Subscribe to RSS feed') - if show_calendar_button - = link_to safe_params.merge(calendar_url_options), class: 'btn gl-button btn-default btn-icon has-tooltip', data: { container: 'body' }, title: _('Subscribe to calendar'), 'aria-label': _('Subscribe to calendar') do - = sprite_icon('calendar') + = render Pajamas::ButtonComponent.new(href: safe_params.merge(calendar_url_options), icon: 'calendar', button_options: { class: 'has-tooltip', 'aria-label': _('Subscribe to calendar'), data: { container: 'body' } }) do + = _('Subscribe to calendar') diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml index 53eb6f4c63b..5b7f9c4226c 100644 --- a/app/views/shared/issuable/_form.html.haml +++ b/app/views/shared/issuable/_form.html.haml @@ -62,9 +62,9 @@ = sanitize(html_escape(_('Please review the %{linkStart}contribution guidelines%{linkEnd} for this project.')) % { linkStart: contribution_guidelines_start, linkEnd: contribution_guidelines_end }) - if issuable.new_record? - = form.submit "#{_('Create')} #{issuable.class.model_name.human.downcase}", class: 'gl-button btn btn-confirm gl-mr-2', data: { qa_selector: 'issuable_create_button', track_experiment: 'promote_mr_approvals_in_free', track_action: 'click_button', track_label: 'submit_mr', track_value: 0 } + = form.submit "#{_('Create')} #{issuable.class.model_name.human.downcase}", class: 'gl-button btn btn-confirm gl-mr-2', data: { qa_selector: 'issuable_create_button', track_action: 'click_button', track_label: 'submit_mr', track_value: 0 } - else - = form.submit _('Save changes'), class: 'gl-button btn btn-confirm gl-mr-2', data: { track_experiment: 'promote_mr_approvals_in_free', track_action: 'click_button', track_label: 'submit_mr', track_value: 0 } + = form.submit _('Save changes'), class: 'gl-button btn btn-confirm gl-mr-2', data: { track_action: 'click_button', track_label: 'submit_mr', track_value: 0 } - if issuable.new_record? = link_to _('Cancel'), polymorphic_path([@project, issuable.class]), class: 'btn gl-button btn-default js-reset-autosave' diff --git a/app/views/shared/issuable/_label_page_create.html.haml b/app/views/shared/issuable/_label_page_create.html.haml index ec78b3f7ce3..eb3acd8e055 100644 --- a/app/views/shared/issuable/_label_page_create.html.haml +++ b/app/views/shared/issuable/_label_page_create.html.haml @@ -19,7 +19,7 @@ %input.js-add-list{ type: "checkbox", name: "add_list", checked: add_list } %span= _('Add list') .clearfix - %button.gl-button.btn.btn-confirm.float-left.js-new-label-btn{ type: "button" } + = render Pajamas::ButtonComponent.new(variant: :confirm, button_options: { class: 'float-left js-new-label-btn' }) do = _('Create') - %button.gl-button.btn.btn-default.float-right.js-cancel-label-btn{ type: "button" } + = render Pajamas::ButtonComponent.new(button_options: { class: 'float-right js-cancel-label-btn' }) do = _('Cancel') diff --git a/app/views/shared/issuable/_milestone_dropdown.html.haml b/app/views/shared/issuable/_milestone_dropdown.html.haml index ef539029272..58108ceeb76 100644 --- a/app/views/shared/issuable/_milestone_dropdown.html.haml +++ b/app/views/shared/issuable/_milestone_dropdown.html.haml @@ -11,10 +11,6 @@ placeholder: _('Search milestones'), footer_content: project.present?, data: { show_no: true, show_menu_above: show_menu_above, show_any: show_any, show_upcoming: show_upcoming, show_started: show_started, field_name: name, selected: selected_text, project_id: project.try(:id), default_label: _('Milestone'), qa_selector: "issuable_milestone_dropdown", testid: "issuable-milestone-dropdown" } }) do - if project %ul.dropdown-footer-list - - if can? current_user, :admin_milestone, project - %li - = link_to new_project_milestone_path(project), title: _('New Milestone') do - = _('Create new') %li = link_to project_milestones_path(project) do - if can? current_user, :admin_milestone, project diff --git a/app/views/shared/issuable/_search_bar.html.haml b/app/views/shared/issuable/_search_bar.html.haml index 21716710015..72940b64801 100644 --- a/app/views/shared/issuable/_search_bar.html.haml +++ b/app/views/shared/issuable/_search_bar.html.haml @@ -11,10 +11,11 @@ - if params[:search].present? = hidden_field_tag :search, params[:search] - if @can_bulk_update - .check-all-holder.gl-display-none.gl-sm-display-block.hidden.gl-float-left.gl-mr-5.gl-line-height-36 - - checkbox_id = 'check-all-issues' - %label.gl-sr-only{ for: checkbox_id }= _('Select all') - = check_box_tag checkbox_id, nil, false, class: "check-all-issues left" + .check-all-holder.gl-display-none.gl-sm-display-block.hidden.gl-float-left.gl-mr-3.gl-line-height-36 + = render Pajamas::CheckboxTagComponent.new(name: 'check-all-issues', value: nil) do |c| + = c.label do + %span.gl-sr-only + = _('Select all') .issues-other-filters.filtered-search-wrapper.d-flex.flex-column.flex-md-row .filtered-search-box - if type != :boards diff --git a/app/views/shared/issuable/_sidebar.html.haml b/app/views/shared/issuable/_sidebar.html.haml index f2ce0676a9a..4199b7e870b 100644 --- a/app/views/shared/issuable/_sidebar.html.haml +++ b/app/views/shared/issuable/_sidebar.html.haml @@ -27,7 +27,7 @@ #js-severity - if reviewers - .block.reviewer + .block.reviewer{ data: { qa_selector: 'reviewers_block_container' } } = render "shared/issuable/sidebar_reviewers", issuable_sidebar: issuable_sidebar, reviewers: reviewers, signed_in: signed_in - if issuable_sidebar[:supports_escalation] @@ -65,7 +65,7 @@ = gl_loading_icon(inline: true) - if issuable_sidebar.dig(:features_available, :health_status) - .js-sidebar-status-entry-point{ data: sidebar_status_data(issuable_sidebar, @project) } + .js-sidebar-health-status-entry-point{ data: sidebar_status_data(issuable_sidebar, @project) } - if issuable_sidebar.has_key?(:confidential) -# haml-lint:disable InlineJavaScript diff --git a/app/views/shared/issuable/_sidebar_assignees.html.haml b/app/views/shared/issuable/_sidebar_assignees.html.haml index e9b04579808..62221fb8218 100644 --- a/app/views/shared/issuable/_sidebar_assignees.html.haml +++ b/app/views/shared/issuable/_sidebar_assignees.html.haml @@ -39,7 +39,7 @@ - data[:multi_select] = true - data['dropdown-title'] = title - data['dropdown-header'] = dropdown_options[:data][:'dropdown-header'] - - data['max-select'] = dropdown_options[:data][:'max-select'] if dropdown_options[:data][:'max-select'] + - data['max-select'] = dropdown_max_select(dropdown_options[:data], :limit_assignees_per_issuable) - options[:data].merge!(data) = render 'shared/issuable/sidebar_user_dropdown', diff --git a/app/views/shared/issuable/_sidebar_reviewers.html.haml b/app/views/shared/issuable/_sidebar_reviewers.html.haml index 3f78f29ea24..771db8af6a8 100644 --- a/app/views/shared/issuable/_sidebar_reviewers.html.haml +++ b/app/views/shared/issuable/_sidebar_reviewers.html.haml @@ -36,7 +36,10 @@ - data[:multi_select] = true - data['dropdown-title'] = title - data['dropdown-header'] = dropdown_options[:data][:'dropdown-header'] - - data['max-select'] = dropdown_max_select(dropdown_options[:data]) + - data[:suggested_reviewers_header] = dropdown_options[:data][:suggested_reviewers_header] + - data[:all_members_header] = dropdown_options[:data][:all_members_header] + - data[:show_suggested] = dropdown_options[:data][:show_suggested] + - data['max-select'] = dropdown_max_select(dropdown_options[:data], :limit_reviewer_and_assignee_size) - options[:data].merge!(data) = render 'shared/issuable/sidebar_user_dropdown', diff --git a/app/views/shared/issuable/_sort_dropdown.html.haml b/app/views/shared/issuable/_sort_dropdown.html.haml index e36c4cd6be0..ccc1a9fda6e 100644 --- a/app/views/shared/issuable/_sort_dropdown.html.haml +++ b/app/views/shared/issuable/_sort_dropdown.html.haml @@ -1,5 +1,5 @@ - viewing_issues = controller.controller_name == 'issues' || controller.action_name == 'issues' -- viewing_merge_requests = controller.controller_name == 'merge_requests' +- viewing_merge_requests = controller.controller_name == 'merge_requests' || controller.action_name == 'merge_requests' - items = issuable_sort_options(viewing_issues, viewing_merge_requests) - selected = issuable_sort_option_overrides[@sort] || @sort diff --git a/app/views/shared/issue_type/_details_content.html.haml b/app/views/shared/issue_type/_details_content.html.haml index 369aa53586f..8a9b71fd91e 100644 --- a/app/views/shared/issue_type/_details_content.html.haml +++ b/app/views/shared/issue_type/_details_content.html.haml @@ -2,7 +2,7 @@ - api_awards_path = local_assigns.fetch(:api_awards_path, nil) .issue-details.issuable-details.js-issue-details - .detail-page-description.content-block.js-detail-page-description + .detail-page-description.content-block.js-detail-page-description.gl-pb-0.gl-border-none #js-issuable-app{ data: { initial: issuable_initial_data(issuable).to_json, issuable_id: issuable.id, full_path: @project.full_path } } .title-container %h1.title.page-title.gl-font-size-h-display= markdown_field(issuable, :title) @@ -12,6 +12,9 @@ = edited_time_ago_with_tooltip(issuable, placement: 'bottom', html_class: 'issue-edited-ago js-issue-edited-ago') + .js-issue-widgets + = render 'shared/issue_type/emoji_block', issuable: issuable, api_awards_path: api_awards_path + .js-issue-widgets = render 'shared/issue_type/sentry_stack_trace', issuable: issuable @@ -32,7 +35,6 @@ -# This element is filled in using JavaScript. .js-issue-widgets - = render 'shared/issue_type/emoji_block', issuable: issuable, api_awards_path: api_awards_path = render 'projects/issues/discussion' diff --git a/app/views/shared/issue_type/_details_header.html.haml b/app/views/shared/issue_type/_details_header.html.haml index 08fba712d5e..ccb501dae11 100644 --- a/app/views/shared/issue_type/_details_header.html.haml +++ b/app/views/shared/issue_type/_details_header.html.haml @@ -2,7 +2,7 @@ - badge_classes = 'issuable-status-badge gl-mr-3' .detail-page-header - .detail-page-header-body + .detail-page-header-body.gl-flex-wrap-wrap = gl_badge_tag({ variant: :info, icon: 'issue-closed', icon_classes: 'gl-mr-0!' }, { class: "#{issue_status_visibility(issuable, status_box: :closed)} #{badge_classes} issuable-status-badge-closed" }) do .gl-display-none.gl-sm-display-block.gl-ml-2 = issue_closed_text(issuable, current_user) @@ -13,9 +13,8 @@ %span.gl-display-none.gl-sm-display-block.gl-ml-2 = _('Open') - .issuable-meta - #js-issuable-header-warnings{ data: { hidden: issue_hidden?(issuable).to_s } } - = issuable_meta(issuable, @project) + #js-issuable-header-warnings{ data: { hidden: issue_hidden?(issuable).to_s } } + = issuable_meta(issuable, @project) %a.btn.gl-button.btn-default.btn-icon.float-right.gl-display-block.d-sm-none.gutter-toggle.issuable-gutter-toggle.js-sidebar-toggle{ href: "#" } = sprite_icon('chevron-double-lg-left') diff --git a/app/views/shared/issue_type/_emoji_block.html.haml b/app/views/shared/issue_type/_emoji_block.html.haml index 61e28f18d3b..a5c71fb1d24 100644 --- a/app/views/shared/issue_type/_emoji_block.html.haml +++ b/app/views/shared/issue_type/_emoji_block.html.haml @@ -4,7 +4,5 @@ .row.gl-m-0.gl-justify-content-space-between .js-noteable-awards = render 'award_emoji/awards_block', awardable: issuable, inline: true, api_awards_path: api_awards_path - .new-branch-col.gl-display-flex.gl-my-2.gl-font-size-0.gl-gap-3 - = render_if_exists "projects/issues/timeline_toggle", issuable: issuable - #js-vue-discussion-filter{ data: { default_filter: current_user&.notes_filter_for(issuable), notes_filters: UserPreference.notes_filters.to_json } } + .new-branch-col.gl-font-size-0 = render 'new_branch' if show_new_branch_button? diff --git a/app/views/shared/labels/_form.html.haml b/app/views/shared/labels/_form.html.haml index e6d6d0998dc..c6932d49d33 100644 --- a/app/views/shared/labels/_form.html.haml +++ b/app/views/shared/labels/_form.html.haml @@ -1,4 +1,4 @@ -= form_for @label, as: :label, url: url, html: { class: 'label-form js-quick-submit js-requires-input' } do |f| += gitlab_ui_form_for @label, as: :label, url: url, html: { class: 'label-form js-quick-submit js-requires-input' } do |f| = form_errors(@label) .form-group.row @@ -26,9 +26,9 @@ .gl-display-flex.gl-justify-content-space-between %div - if @label.persisted? - = f.submit _('Save changes'), class: 'btn gl-button btn-confirm js-save-button gl-mr-2' + = f.submit _('Save changes'), class: 'js-save-button gl-mr-2', pajamas_button: true - else - = f.submit _('Create label'), class: 'btn gl-button btn-confirm js-save-button gl-mr-2', data: { qa_selector: 'label_create_button' } + = f.submit _('Create label'), class: 'js-save-button gl-mr-2', data: { qa_selector: 'label_create_button' }, pajamas_button: true = link_to _('Cancel'), back_path, class: 'btn gl-button btn-default btn-cancel gl-mr-2' - if @label.persisted? - presented_label = @label.present diff --git a/app/views/shared/members/_member.html.haml b/app/views/shared/members/_member.html.haml index 23f78f4be45..376e51a6b15 100644 --- a/app/views/shared/members/_member.html.haml +++ b/app/views/shared/members/_member.html.haml @@ -12,7 +12,7 @@ %li.member.js-member.py-2.px-3.d-flex.flex-column{ class: [dom_class(member), ("flex-md-row" unless force_mobile_view)], id: dom_id(member), data: { qa_selector: 'member_row' } } %span.list-item-name.mb-2.m-md-0 - if user - = image_tag avatar_icon_for_user(user, 40), class: "avatar s40 flex-shrink-0 flex-grow-0", alt: '' + = render Pajamas::AvatarComponent.new(user, size: 32, class: 'gl-mr-3 flex-shrink-0 flex-grow-0') .user-info %span.mr-1 = link_to user.name, user_path(user), class: 'member js-user-link', data: { user_id: user.id } diff --git a/app/views/shared/members/_requests.html.haml b/app/views/shared/members/_requests.html.haml index 98e2c6c43b1..31625c22a94 100644 --- a/app/views/shared/members/_requests.html.haml +++ b/app/views/shared/members/_requests.html.haml @@ -5,7 +5,7 @@ - return if requesters.empty? -= render Pajamas::CardComponent.new(card_options: { class: 'gl-mt-3 gl-mb-5', data: { testid: 'access-requests' } }, body_options: { class: 'gl-p-0' }) do |c| += render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-5', data: { testid: 'access-requests' } }, body_options: { class: 'gl-p-0' }) do |c| - c.header do = _('Users requesting access to') %strong= membership_source.name diff --git a/app/views/shared/milestones/_issuables.html.haml b/app/views/shared/milestones/_issuables.html.haml index 460ddd0897c..2502f7fca62 100644 --- a/app/views/shared/milestones/_issuables.html.haml +++ b/app/views/shared/milestones/_issuables.html.haml @@ -1,22 +1,20 @@ - show_counter = local_assigns.fetch(:show_counter, false) - primary = local_assigns.fetch(:primary, false) -- panel_class = primary ? 'bg-primary text-white' : '' -.card - .card-header{ class: panel_class } - .header.gl-mb-2 - .title - = title - .issuable-count-weight.gl-ml-3 += render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-5' }, body_options: { class: 'gl-py-0' }, header_options: { class: milestone_header_class(primary, issuables) }) do |c| + - c.header do + .gl-flex-grow-2 + = title + .gl-ml-3.gl-flex-shrink-0.gl-font-weight-bold.gl-white-space-nowrap{ class: milestone_counter_class(primary) } - if show_counter - %span.counter + %span = sprite_icon('issues', css_class: 'gl-vertical-align-text-bottom') = number_with_delimiter(issuables.length) = render_if_exists "shared/milestones/issuables_weight", issuables: issuables - - - class_prefix = dom_class(issuables).pluralize - %ul{ class: "content-list milestone-#{class_prefix}-list", id: "#{class_prefix}-list-#{id}" } - = render partial: 'shared/milestones/issuable', - collection: issuables, - as: :issuable, - locals: { show_project_name: show_project_name } + = c.body do + - class_prefix = dom_class(issuables).pluralize + %ul{ class: "content-list milestone-#{class_prefix}-list", id: "#{class_prefix}-list-#{id}" } + = render partial: 'shared/milestones/issuable', + collection: issuables, + as: :issuable, + locals: { show_project_name: show_project_name } diff --git a/app/views/shared/milestones/_participants_tab.html.haml b/app/views/shared/milestones/_participants_tab.html.haml index fe83040c168..f90967c3b15 100644 --- a/app/views/shared/milestones/_participants_tab.html.haml +++ b/app/views/shared/milestones/_participants_tab.html.haml @@ -1,8 +1,8 @@ %ul.bordered-list - users.each do |user| %li - = link_to user, title: user.name, class: "darken" do - = image_tag avatar_icon_for_user(user, 32), class: "avatar s32" - %strong= truncate(user.name, length: 40) - %div + = link_to user, title: user.name, class: "gl-display-flex" do + = render Pajamas::AvatarComponent.new(user, size: 32, class: "gl-mr-3") + .gl-display-flex.gl-flex-direction-column + %strong= truncate(user.name, length: 40) %small.cgray= user.username diff --git a/app/views/shared/notes/_note.html.haml b/app/views/shared/notes/_note.html.haml index 3ab8514aebf..c552e94ac57 100644 --- a/app/views/shared/notes/_note.html.haml +++ b/app/views/shared/notes/_note.html.haml @@ -6,17 +6,18 @@ - note_counter = local_assigns.fetch(:note_counter, 0) %li.timeline-entry.note-wrapper{ id: dom_id(note), - class: ["note", "note-row-#{note.id}", ('system-note' if note.system)], + class: ["note", "note-comment", "note-row-#{note.id}", ('system-note' if note.system)], data: { author_id: note.author.id, editable: note_editable, note_id: note.id } } .timeline-entry-inner - .timeline-icon - - if note.system + - if note.system + .timeline-icon = icon_for_system_note(note) - - else + - else + .timeline-avatar.gl-float-left %a.image-diff-avatar-link{ href: user_path(note.author) } - = image_tag avatar_icon_for_user(note.author), alt: '', class: 'avatar s40' + = render Pajamas::AvatarComponent.new(note.author, size: 32, alt: '') - if note.is_a?(DiffNote) && note.on_image? - if show_image_comment_badge && note_counter == 0 -# Only show this for the first comment in the discussion @@ -34,9 +35,9 @@ %span.note-header-author-name.bold = note.author.name = user_status(note.author) - %span.note-headline-light{ data: { qa_selector: 'note_author_content' } } + %spannote-headline-light{ data: { qa_selector: 'note_author_content' } } = note.author.to_reference - %span.note-headline-light.note-headline-meta + %span.note-headline-ligh.note-headline-meta - if note.system %span.system-note-message = markdown_field(note, :note) diff --git a/app/views/shared/projects/_project.html.haml b/app/views/shared/projects/_project.html.haml index ae264f2188f..81e2e066bd3 100644 --- a/app/views/shared/projects/_project.html.haml +++ b/app/views/shared/projects/_project.html.haml @@ -9,7 +9,7 @@ - compact_mode = false unless local_assigns[:compact_mode] == true - show_last_commit_as_description = false unless local_assigns[:show_last_commit_as_description] == true && can_show_last_commit_in_list?(project) - css_class = '' unless local_assigns[:css_class] -- css_class += " no-description" if project.description.blank? && !show_last_commit_as_description +- css_class += " gl-display-flex!" - cache_key = project_list_cache_key(project, pipeline_status: pipeline_status) - updated_tooltip = time_ago_with_tooltip(project.last_activity_date) - show_pipeline_status_icon = pipeline_status && can?(current_user, :read_cross_project) && project.pipeline_status.has_status? && can?(current_user, :read_build, project) @@ -18,15 +18,15 @@ - css_controls_class << "with-pipeline-status" if show_pipeline_status_icon && last_pipeline.present? - avatar_container_class = project.creator && use_creator_avatar ? '' : 'rect-avatar' -%li.project-row.d-flex{ class: css_class } +%li.project-row.gl-align-items-center{ class: css_class } = cache(cache_key) do - if avatar - .avatar-container.s48.flex-grow-0.flex-shrink-0{ class: avatar_container_class } + .flex-grow-0.flex-shrink-0{ class: avatar_container_class } = link_to project_path(project), class: dom_class(project) do - if project.creator && use_creator_avatar - = image_tag avatar_icon_for_user(project.creator, 48), class: "avatar s48", alt: '' + = render Pajamas::AvatarComponent.new(project.creator, size: 48, alt: '', class: 'gl-mr-5') - else - = project_icon(project, alt: '', class: 'avatar project-avatar s48', width: 48, height: 48) + = render Pajamas::AvatarComponent.new(project, size: 48, alt: '', class: 'gl-mr-5') .project-details.d-sm-flex.flex-sm-fill.align-items-center{ data: { qa_selector: 'project_content', qa_project_name: project.name } } .flex-wrapper .d-flex.align-items-center.flex-wrap.project-title @@ -52,7 +52,7 @@ -# haml-lint:disable UnnecessaryStringOutput = ' ' # prevent haml from eating the space between elements .metadata-info.gl-mt-3 - %span.user-access-role.d-block{ data: { qa_selector: 'user_role_content' } }= Gitlab::Access.human_access(access) + %span.user-access-role.gl-display-block{ data: { qa_selector: 'user_role_content' } }= localized_project_human_access(access) - if !explore_projects_tab? .metadata-info.gl-mt-3 diff --git a/app/views/shared/projects/_search_form.html.haml b/app/views/shared/projects/_search_form.html.haml index a5170b199e8..e598343d698 100644 --- a/app/views/shared/projects/_search_form.html.haml +++ b/app/views/shared/projects/_search_form.html.haml @@ -1,4 +1,4 @@ -- form_field_classes = local_assigns[:admin_view] || !Feature.enabled?(:project_list_filter_bar) ? 'input-short js-projects-list-filter' : '' +- form_field_classes = local_assigns[:admin_view] || !Feature.enabled?(:project_list_filter_bar) ? 'input-short js-projects-list-filter' : 'gl-w-full! gl-pl-7 ' - placeholder = local_assigns[:search_form_placeholder] ? search_form_placeholder : _('Filter by name') = form_tag filter_projects_path, method: :get, class: 'project-filter-form', data: { qa_selector: 'project_filter_form_container' }, id: 'project-filter-form' do |f| diff --git a/app/views/shared/runners/_runner_description.html.haml b/app/views/shared/runners/_runner_description.html.haml index 436dbfd2b49..dc689303f77 100644 --- a/app/views/shared/runners/_runner_description.html.haml +++ b/app/views/shared/runners/_runner_description.html.haml @@ -1,6 +1,12 @@ .light.gl-mt-3 %p - = _("Register as many runners as you want. You can register runners as separate users, on separate servers, and on your local machine. Runners are either:") + = s_("Runners|Register as many runners as you want. You can register runners as separate users, on separate servers, and on your local machine.") + + %h5 + = s_("Runners|How do runners pick up jobs?") + + %p + = s_("Runners|Runners are either:") %div %ul @@ -10,3 +16,7 @@ %li = gl_badge_tag s_("Runners|paused"), variant: :danger, size: :sm = _('- Not available to run jobs.') + + %p + = s_("Runners|Tags control which type of jobs a runner can handle. By tagging a runner, you make sure shared runners only handle the jobs they are equipped to run.") + = link_to _("Learn more."), help_page_path("ci/runners/configure_runners", anchor: "use-tags-to-control-which-jobs-a-runner-can-run"), target: '_blank' diff --git a/app/views/shared/runners/_shared_runners_description.html.haml b/app/views/shared/runners/_shared_runners_description.html.haml index 2779901ca0c..c8ddb5d5176 100644 --- a/app/views/shared/runners/_shared_runners_description.html.haml +++ b/app/views/shared/runners/_shared_runners_description.html.haml @@ -1,12 +1,9 @@ --# "MaxBuilds" is a runner configuration keyword so it must not be translated. -- link = link_to 'MaxBuilds', 'https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runnersmachine-section', target: '_blank', rel: 'noopener noreferrer' +- shared_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('ci/runners/runners_scope.md', anchor: 'shared-runners') } %h4 = _('Shared runners') .bs-callout{ data: { testid: 'shared-runners-description' } } - %p= _('These runners are shared across this GitLab instance.') + %p= s_('Runners|%{link_start}These runners%{link_end} are available to all groups and projects.').html_safe % { link_start: shared_link_start, link_end: '</a>'.html_safe } - if Gitlab::CurrentSettings.shared_runners_text.present? = markdown(Gitlab::CurrentSettings.current_application_settings.shared_runners_text) - - else - %p= _('The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com).').html_safe % { link: link } diff --git a/app/views/shared/snippets/_snippet.html.haml b/app/views/shared/snippets/_snippet.html.haml index 3cd70dab4d5..6caadeb0ba4 100644 --- a/app/views/shared/snippets/_snippet.html.haml +++ b/app/views/shared/snippets/_snippet.html.haml @@ -2,7 +2,7 @@ - notes_count = @noteable_meta_data[snippet.id].user_notes_count %li.snippet-row.py-3{ data: { qa_selector: 'snippet_link', qa_snippet_title: snippet.title } } - = image_tag avatar_icon_for_user(snippet.author), class: "avatar s40 d-none d-sm-block", alt: '' + = render Pajamas::AvatarComponent.new(snippet.author, size: 48, alt: "", class: 'gl-display-none gl-sm-display-block gl-float-left gl-mr-3') = link_to gitlab_snippet_path(snippet), class: "title" do = snippet.title @@ -20,16 +20,15 @@ = visibility_level_icon(snippet.visibility_level) .snippet-info - #{snippet.to_reference} · - authored #{time_ago_with_tooltip(snippet.created_at, placement: 'bottom', html_class: 'snippet-created-ago')} - by - = link_to user_snippets_path(snippet.author), class: "js-user-link", data: { user_id: snippet.author.id } do - = snippet.author_name - - if link_project && snippet.project_id? - %span.d-none.d-sm-inline-block - in - = link_to project_path(snippet.project) do - = snippet.project.full_name + .gl-display-inline{ data: { testid: 'snippet-created-at'} } + - created_at = time_ago_with_tooltip(snippet.created_at, placement: 'bottom') + - author = link_to(snippet.author_name, user_snippets_path(snippet.author), data: { user_id: snippet.author.id }) + #{snippet.to_reference} · + - if link_project && snippet.project_id? + - project_link = link_to(snippet.project.full_name, project_path(snippet.project)) + = _('created %{timeAgo} by %{author} in %{project_link}').html_safe % { timeAgo: created_at, author: author, project_link: project_link } + - else + = _('created %{timeAgo} by %{author}').html_safe % { timeAgo: created_at, author: author } - .float-right.snippet-updated-at - %span updated #{time_ago_with_tooltip(snippet.updated_at, placement: 'bottom')} + .float-right + = _('updated %{timeAgo}').html_safe % { timeAgo: time_ago_with_tooltip(snippet.updated_at, placement: 'bottom') } diff --git a/app/views/shared/tokens/_scopes_form.html.haml b/app/views/shared/tokens/_scopes_form.html.haml index 010376464f1..1c63ce490ed 100644 --- a/app/views/shared/tokens/_scopes_form.html.haml +++ b/app/views/shared/tokens/_scopes_form.html.haml @@ -1,11 +1,12 @@ - scopes = local_assigns.fetch(:scopes) - prefix = local_assigns.fetch(:prefix) +- description_prefix = local_assigns.fetch(:description_prefix, prefix) - token = local_assigns.fetch(:token) - f = local_assigns.fetch(:f) %fieldset - scopes.each do |scope| - - help_text = t scope, scope: scope_description(prefix) + - help_text = t scope, scope: scope_description(description_prefix) = f.gitlab_ui_checkbox_component :scopes, scope, help_text: help_text, checkbox_options: { checked: token.scopes.include?(scope), id: "#{prefix}_scopes_#{scope}", multiple: true, data: { qa_selector: "#{scope}_checkbox" } }, diff --git a/app/views/shared/users/_user.html.haml b/app/views/shared/users/_user.html.haml index 93b3ce5f319..51eb24f6d4a 100644 --- a/app/views/shared/users/_user.html.haml +++ b/app/views/shared/users/_user.html.haml @@ -3,7 +3,7 @@ .col-lg-3.col-md-4.col-sm-12 = render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-5' }) do |c| = c.body do - = image_tag avatar_icon_for_user(user, 40), class: "avatar s40", alt: '' + = render Pajamas::AvatarComponent.new(user, size: 48, alt: "", class: 'gl-float-left gl-mr-3') .user-info .block-truncated diff --git a/app/views/shared/web_hooks/_form.html.haml b/app/views/shared/web_hooks/_form.html.haml index afe72767b9a..c95e63bdc83 100644 --- a/app/views/shared/web_hooks/_form.html.haml +++ b/app/views/shared/web_hooks/_form.html.haml @@ -1,10 +1,13 @@ = form_errors(hook) -.form-group - = form.label :url, s_('Webhooks|URL'), class: 'label-bold' - = form.text_field :url, class: 'form-control gl-form-input', placeholder: 'http://example.com/trigger-ci.json' - %p.form-text.text-muted - = s_('Webhooks|URL must be percent-encoded if it contains one or more special characters.') +- if Feature.enabled?(:webhook_form_mask_url) + .js-vue-webhook-form{ data: webhook_form_data(hook) } +- else + .form-group + = form.label :url, s_('Webhooks|URL'), class: 'label-bold' + = form.text_field :url, class: 'form-control gl-form-input', placeholder: 'http://example.com/trigger-ci.json' + %p.form-text.text-muted + = s_('Webhooks|URL must be percent-encoded if it contains one or more special characters.') .form-group = form.label :token, s_('Webhooks|Secret token'), class: 'label-bold' = form.text_field :token, class: 'form-control gl-form-input', placeholder: '' diff --git a/app/views/shared/web_hooks/_hook_errors.html.haml b/app/views/shared/web_hooks/_hook_errors.html.haml index d95efe83e15..098cc19c435 100644 --- a/app/views/shared/web_hooks/_hook_errors.html.haml +++ b/app/views/shared/web_hooks/_hook_errors.html.haml @@ -4,16 +4,12 @@ - link_end = '</a>'.html_safe - if hook.rate_limited? - - support_path = 'https://support.gitlab.com/hc/en-us/requests/new' - - placeholders = { strong_start: strong_start, - strong_end: strong_end, - limit: hook.rate_limit, - support_link_start: link_start % { url: support_path }, - support_link_end: link_end } - = render Pajamas::AlertComponent.new(title: s_('Webhooks|Webhook was automatically disabled'), + - placeholders = { limit: number_with_delimiter(hook.rate_limit), + root_namespace: hook.parent.root_namespace.path } + = render Pajamas::AlertComponent.new(title: s_('Webhooks|Webhook rate limit has been reached'), variant: :danger) do |c| = c.body do - = s_('Webhooks|The webhook was triggered more than %{limit} times per minute and is now disabled. To re-enable this webhook, fix the problems shown in %{strong_start}Recent events%{strong_end}, then re-test your settings. %{support_link_start}Contact Support%{support_link_end} if you need help re-enabling your webhook.').html_safe % placeholders + = s_("Webhooks|Webhooks for %{root_namespace} are now disabled because they've been triggered more than %{limit} times per minute. They'll be automatically re-enabled in the next minute.").html_safe % placeholders - elsif hook.permanently_disabled? = render Pajamas::AlertComponent.new(title: s_('Webhooks|Webhook failed to connect'), variant: :danger) do |c| diff --git a/app/views/shared/web_hooks/_index.html.haml b/app/views/shared/web_hooks/_index.html.haml index 5ec82ad6702..868633143cd 100644 --- a/app/views/shared/web_hooks/_index.html.haml +++ b/app/views/shared/web_hooks/_index.html.haml @@ -1,14 +1,13 @@ %hr -.card#webhooks-index - .card-header - %h5 - = hook_class.underscore.humanize.titleize.pluralize - (#{hooks.size}) - - - if hooks.any? - %ul.content-list - - hooks.each do |hook| - = render 'shared/web_hooks/hook', hook: hook - - else - %p.text-center.gl-mt-3.gl-mb-3 - = _('No webhooks enabled. Select trigger events above.') += render Pajamas::CardComponent.new(card_options: { id: 'webhooks-index' }, body_options: { class: 'gl-py-0'}) do |c| + - c.header do + = hook_class.underscore.humanize.titleize.pluralize + (#{hooks.size}) + - c.body do + - if hooks.any? + %ul.content-list + - hooks.each do |hook| + = render 'shared/web_hooks/hook', hook: hook + - else + %p.text-center.gl-mt-3.gl-mb-3 + = _('No webhooks enabled. Select trigger events above.') diff --git a/app/views/shared/wikis/pages.html.haml b/app/views/shared/wikis/pages.html.haml index 21d63a6db3d..e1252e91c10 100644 --- a/app/views/shared/wikis/pages.html.haml +++ b/app/views/shared/wikis/pages.html.haml @@ -2,7 +2,6 @@ - breadcrumb_title s_("Wiki|Pages") - page_title s_("Wiki|Pages"), _("Wiki") - add_page_specific_style 'page_bundles/wiki' -- wiki_sort_options = [{ text: s_("Wiki|Title"), value: 'title', href: wiki_path(@wiki, action: :pages, sort: Wiki::TITLE_ORDER)}, { text: s_("Wiki|Created date"), value: 'created_at', href: wiki_path(@wiki, action: :pages, sort: Wiki::CREATED_AT_ORDER) }] .wiki-page-header.top-area.flex-column.flex-lg-row %h1.page-title.gl-font-size-h-display.gl-flex-grow-1 @@ -15,8 +14,7 @@ .dropdown.inline.wiki-sort-dropdown .btn-group{ role: 'group' } - = gl_redirect_listbox_tag wiki_sort_options, params[:sort], data: { right: true } - = wiki_sort_controls(@wiki, params[:sort], params[:direction]) + = wiki_sort_controls(@wiki, params[:direction]) %ul.wiki-pages-list.content-list = render @wiki_entries, context: 'pages' diff --git a/app/views/snippets/show.html.haml b/app/views/snippets/show.html.haml index f1093a3b730..47ccc449e1b 100644 --- a/app/views/snippets/show.html.haml +++ b/app/views/snippets/show.html.haml @@ -14,7 +14,7 @@ #js-snippet-view{ data: {'qa-selector': 'snippet_view', 'snippet-gid': @snippet.to_global_id, 'report-abuse-path': snippet_report_abuse_path(@snippet), 'can-report-spam': @snippet.submittable_as_spam_by?(current_user).to_s } } -.row-content-block.top-block.content-component-block +.row-content-block.top-block.content-component-block.gl-px-0.gl-py-2 = render 'award_emoji/awards_block', awardable: @snippet, inline: true #notes.limited-width-notes= render "shared/notes/notes_with_form", :autocomplete => false |