diff options
Diffstat (limited to 'app/views/admin')
21 files changed, 163 insertions, 113 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 e46a88b2217..189986b3dec 100644 --- a/app/views/admin/application_settings/_account_and_limit.html.haml +++ b/app/views/admin/application_settings/_account_and_limit.html.haml @@ -15,6 +15,7 @@ = f.label :max_attachment_size, _('Maximum attachment size (MB)'), class: 'label-bold' = f.number_field :max_attachment_size, class: 'form-control gl-form-input', title: _('Maximum size of individual attachments in comments.'), data: { toggle: 'tooltip', container: 'body' } + = render 'admin/application_settings/repository_size_limit_setting_registration_features_cta', form: f = render_if_exists 'admin/application_settings/repository_size_limit_setting', form: f .form-group diff --git a/app/views/admin/application_settings/_note_limits.html.haml b/app/views/admin/application_settings/_note_limits.html.haml index eb6122f244a..38a5d6a1010 100644 --- a/app/views/admin/application_settings/_note_limits.html.haml +++ b/app/views/admin/application_settings/_note_limits.html.haml @@ -9,7 +9,7 @@ = f.label :notes_create_limit_allowlist, _('Users to exclude from the rate limit'), class: 'label-bold' = f.text_area :notes_create_limit_allowlist_raw, placeholder: 'username1, username2', class: 'form-control gl-form-input', rows: 5 .form-text.text-muted - = _('Comma-separated list of users allowed to exceed the rate limit.') + = _('List of users allowed to exceed the rate limit.') = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' } diff --git a/app/views/admin/application_settings/_repository_check.html.haml b/app/views/admin/application_settings/_repository_check.html.haml index 6df1be9f6cb..ce81f81c125 100644 --- a/app/views/admin/application_settings/_repository_check.html.haml +++ b/app/views/admin/application_settings/_repository_check.html.haml @@ -16,7 +16,7 @@ = _("If you get a lot of false alarms from repository checks, you can clear all repository check information from the database.") - clear_repository_checks_link = _('Clear all repository checks') - clear_repository_checks_message = _('This clears repository check states for all projects in the database and cannot be undone. Are you sure?') - = link_to clear_repository_checks_link, clear_repository_check_states_admin_application_settings_path, data: { confirm: clear_repository_checks_message }, method: :put, class: "gl-button btn btn-sm btn-danger gl-mt-3" + = link_to clear_repository_checks_link, clear_repository_check_states_admin_application_settings_path, data: { confirm: clear_repository_checks_message, confirm_btn_variant: 'danger' }, aria: { label: _('Clear repository checks') }, method: :put, class: "gl-button btn btn-sm btn-danger gl-mt-3" .sub-section %h4= _("Housekeeping") diff --git a/app/views/admin/application_settings/_repository_size_limit_setting_registration_features_cta.html.haml b/app/views/admin/application_settings/_repository_size_limit_setting_registration_features_cta.html.haml new file mode 100644 index 00000000000..8daa5aa8c73 --- /dev/null +++ b/app/views/admin/application_settings/_repository_size_limit_setting_registration_features_cta.html.haml @@ -0,0 +1,8 @@ +- return unless registration_features_can_be_prompted? + +.form-group + = form.label :disabled_repository_size_limit, class: 'label-bold' do + = _('Size limit per repository (MB)') + = form.number_field :disabled_repository_size_limit, value: '', class: 'form-control gl-form-input', disabled: true + %span.form-text.text-muted + = render 'shared/registration_features_discovery_message' diff --git a/app/views/admin/application_settings/_usage.html.haml b/app/views/admin/application_settings/_usage.html.haml index 4fba1aee12d..326aae26d5e 100644 --- a/app/views/admin/application_settings/_usage.html.haml +++ b/app/views/admin/application_settings/_usage.html.haml @@ -28,8 +28,8 @@ %button.gl-button.btn.btn-default.js-payload-preview-trigger{ type: 'button', data: { payload_selector: ".#{payload_class}" } } .gl-spinner.js-spinner.gl-display-none.gl-mr-2 - .js-text.d-inline= _('Preview payload') - %pre.service-data-payload-container.js-syntax-highlight.code.highlight.mt-2.d-none{ class: payload_class, data: { endpoint: usage_data_admin_application_settings_path(format: :html) } } + .js-text.gl-display-inline= _('Preview payload') + %pre.service-data-payload-container.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 = _('Service ping is disabled in your configuration file, and cannot be enabled through this form.') - deactivating_service_ping_path = help_page_path('development/service_ping/index.md', anchor: 'disable-service-ping-using-the-configuration-file') diff --git a/app/views/admin/application_settings/_users_api_limits.html.haml b/app/views/admin/application_settings/_users_api_limits.html.haml new file mode 100644 index 00000000000..e9b657f8942 --- /dev/null +++ b/app/views/admin/application_settings/_users_api_limits.html.haml @@ -0,0 +1,14 @@ += 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 + .form-group + = f.label :users_get_by_id_limit, _('Maximum requests per 10 minutes per user'), class: 'label-bold' + = f.number_field :users_get_by_id_limit, class: 'form-control gl-form-input' + .form-group + = f.label :users_get_by_id_limit_allowlist_raw, _('Users to exclude from the rate limit'), class: 'label-bold' + = f.text_area :users_get_by_id_limit_allowlist_raw, placeholder: 'username1, username2', class: 'form-control gl-form-input', rows: 5 + .form-text.text-muted + = _('List of users allowed to exceed the rate limit.') + + = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' } diff --git a/app/views/admin/application_settings/network.html.haml b/app/views/admin/application_settings/network.html.haml index 242d0c364f4..90183b028f0 100644 --- a/app/views/admin/application_settings/network.html.haml +++ b/app/views/admin/application_settings/network.html.haml @@ -122,6 +122,18 @@ .settings-content = render 'note_limits' +%section.settings.as-users-api-limits.no-animate#js-users-api-limits-settings{ class: ('expanded' if expanded_by_default?) } + .settings-header + %h4 + = _('Users API rate limit') + %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' } + = expanded_by_default? ? _('Collapse') : _('Expand') + %p + = _('Set the per-user rate limit for getting a user by ID via the API.') + = link_to _('Learn more.'), help_page_path('user/admin_area/settings/rate_limit_on_users_api.md'), target: '_blank', rel: 'noopener noreferrer' + .settings-content + = render 'users_api_limits' + %section.settings.as-import-export-limits.no-animate#js-import-export-limits-settings{ class: ('expanded' if expanded_by_default?) } .settings-header %h4 diff --git a/app/views/admin/application_settings/service_usage_data.html.haml b/app/views/admin/application_settings/service_usage_data.html.haml new file mode 100644 index 00000000000..d9825183d88 --- /dev/null +++ b/app/views/admin/application_settings/service_usage_data.html.haml @@ -0,0 +1,16 @@ +- name = _("Service usage data") + +- breadcrumb_title name +- page_title name +- @content_class = "limit-container-width" unless fluid_layout +- payload_class = 'js-service-ping-payload' + +%h3= name + +%button.gl-button.btn.btn-default.js-payload-preview-trigger{ type: 'button', data: { payload_selector: ".#{payload_class}" } } + .gl-spinner.js-spinner.gl-display-none.gl-mr-2 + .js-text.gl-display-inline= _('Preview payload') +%button.gl-button.btn.btn-default.js-payload-download-trigger{ type: 'button', data: { endpoint: usage_data_admin_application_settings_path(format: :json) } } + .gl-spinner.js-spinner.gl-display-none.gl-mr-2 + .js-text.d-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) } } diff --git a/app/views/admin/background_migrations/index.html.haml b/app/views/admin/background_migrations/index.html.haml index 13ac511f1b4..afceb6427e0 100644 --- a/app/views/admin/background_migrations/index.html.haml +++ b/app/views/admin/background_migrations/index.html.haml @@ -1,33 +1,26 @@ - page_title _('Background Migrations') -.tabs.gl-tabs - %div - %ul.nav.gl-tabs-nav{ role: 'tablist' } - - active_tab_classes = ['gl-tab-nav-item-active', 'gl-tab-nav-item-active-indigo'] += gl_tabs_nav do + = gl_tab_link_to admin_background_migrations_path, item_active: @current_tab == 'queued' do + = _('Queued') + = gl_tab_counter_badge limited_counter_with_delimiter(@relations_by_tab['queued']) + = gl_tab_link_to admin_background_migrations_path(tab: 'failed'), item_active: @current_tab == 'failed' do + = _('Failed') + = gl_tab_counter_badge limited_counter_with_delimiter(@relations_by_tab['failed']) + = gl_tab_link_to admin_background_migrations_path(tab: 'finished'), item_active: @current_tab == 'finished' do + = _('Finished') + = gl_tab_counter_badge limited_counter_with_delimiter(@relations_by_tab['finished']) - %li.nav-item{ role: 'presentation' } - %a.nav-link.gl-tab-nav-item{ href: admin_background_migrations_path, class: (active_tab_classes if @current_tab == 'queued'), role: 'tab' } - = _('Queued') - = gl_tab_counter_badge limited_counter_with_delimiter(@relations_by_tab['queued']) - %li.nav-item{ role: 'presentation' } - %a.nav-link.gl-tab-nav-item{ href: admin_background_migrations_path(tab: 'failed'), class: (active_tab_classes if @current_tab == 'failed'), role: 'tab' } - = _('Failed') - = gl_tab_counter_badge limited_counter_with_delimiter(@relations_by_tab['failed']) - %li.nav-item{ role: 'presentation' } - %a.nav-link.gl-tab-nav-item{ href: admin_background_migrations_path(tab: 'finished'), class: (active_tab_classes if @current_tab == 'finished'), role: 'tab' } - = _('Finished') - = gl_tab_counter_badge limited_counter_with_delimiter(@relations_by_tab['finished']) +.tab-content.gl-tab-content + .tab-pane.active{ role: 'tabpanel' } + %table.table.b-table.gl-table.b-table-stacked-md{ role: 'table' } + %thead{ role: 'rowgroup' } + %tr{ role: 'row' } + %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Migration') + %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Progress') + %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Status') + %th.table-th-transparent.border-bottom{ role: 'cell' } + %tbody{ role: 'rowgroup' } + = render partial: 'migration', collection: @migrations - .tab-content.gl-tab-content - .tab-pane.active{ role: 'tabpanel' } - %table.table.b-table.gl-table.b-table-stacked-md{ role: 'table' } - %thead{ role: 'rowgroup' } - %tr{ role: 'row' } - %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Migration') - %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Progress') - %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Status') - %th.table-th-transparent.border-bottom{ role: 'cell' } - %tbody{ role: 'rowgroup' } - = render partial: 'migration', collection: @migrations - - = paginate_collection @migrations + = paginate_collection @migrations diff --git a/app/views/admin/broadcast_messages/index.html.haml b/app/views/admin/broadcast_messages/index.html.haml index 9dce33bf037..3f07bea7840 100644 --- a/app/views/admin/broadcast_messages/index.html.haml +++ b/app/views/admin/broadcast_messages/index.html.haml @@ -11,33 +11,33 @@ %br.clearfix - if @broadcast_messages.any? - %table.table.table-responsive - %thead - %tr - %th= _('Status') - %th= _('Preview') - %th= _('Starts') - %th= _('Ends') - %th= _(' Target Path') - %th= _(' Type') - %th - %tbody - - @broadcast_messages.each do |message| + .table-responsive + %table.table.b-table.gl-table + %thead %tr - %td - = broadcast_message_status(message) - %td - = broadcast_message(message, preview: true) - %td - = message.starts_at - %td - = message.ends_at - %td - = message.target_path - %td - = message.broadcast_type.capitalize - %td.gl-white-space-nowrap.gl-display-flex - = link_to sprite_icon('pencil-square', 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 ml-2' - - = paginate @broadcast_messages, theme: 'gitlab' + %th= _('Status') + %th= _('Preview') + %th= _('Starts') + %th= _('Ends') + %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 + %td + = message.target_path + %td + = message.broadcast_type.capitalize + %td.gl-white-space-nowrap + = link_to sprite_icon('pencil-square', 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 ml-2' + = paginate @broadcast_messages, theme: 'gitlab' diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index 85b6ebfc63a..69033d274a2 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -143,6 +143,11 @@ = _('GitLab Pages') %span.float-right = Gitlab::Pages::VERSION + - if Gitlab::Kas.enabled? + %p + = _('GitLab KAS') + %span.gl-float-right + = Gitlab::Kas.version = render_if_exists 'admin/dashboard/geo' diff --git a/app/views/admin/groups/_group.html.haml b/app/views/admin/groups/_group.html.haml index 0c2280a2f63..c27ff348f59 100644 --- a/app/views/admin/groups/_group.html.haml +++ b/app/views/admin/groups/_group.html.haml @@ -33,4 +33,4 @@ .controls.gl-flex-shrink-0.gl-ml-5 = link_to _('Edit'), admin_group_edit_path(group), id: "edit_#{dom_id(group)}", class: 'btn gl-button btn-default' - = link_to _('Delete'), [:admin, group], data: { confirm: _("Are you sure you want to remove %{group_name}?") % { group_name: group.name } }, method: :delete, class: 'gl-button btn btn-danger' + = link_to _('Delete'), [:admin, group], aria: { label: _('Remove') }, data: { confirm: _("Are you sure you want to remove %{group_name}?") % { group_name: group.name }, confirm_btn_variant: 'danger' }, method: :delete, class: 'gl-button btn btn-danger' diff --git a/app/views/admin/hooks/edit.html.haml b/app/views/admin/hooks/edit.html.haml index 9c258e10008..566d8a99ac6 100644 --- a/app/views/admin/hooks/edit.html.haml +++ b/app/views/admin/hooks/edit.html.haml @@ -13,7 +13,7 @@ .form-actions %span>= f.submit _('Save changes'), class: 'btn gl-button btn-confirm gl-mr-3' = 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', data: { confirm: _('Are you sure?') } + = 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' } %hr diff --git a/app/views/admin/labels/_label.html.haml b/app/views/admin/labels/_label.html.haml index 16661efce04..ae8fed8964f 100644 --- a/app/views/admin/labels/_label.html.haml +++ b/app/views/admin/labels/_label.html.haml @@ -3,5 +3,5 @@ .label-actions-list = link_to edit_admin_label_path(label), class: 'btn btn-default gl-button btn-default-tertiary label-action has-tooltip', title: _('Edit'), data: { placement: 'bottom' }, aria_label: _('Edit') do = sprite_icon('pencil') - = link_to admin_label_path(label), class: 'btn btn-default gl-button btn-default-tertiary hover-red js-remove-label label-action has-tooltip', title: _('Delete'), data: { placement: 'bottom', confirm: "Delete this label? Are you sure?" }, aria_label: _('Delete'), method: :delete, remote: true do + = link_to admin_label_path(label), class: 'btn btn-default gl-button btn-default-tertiary hover-red js-remove-label label-action has-tooltip', title: _('Delete'), data: { placement: 'bottom', confirm: _('Are you sure you want to delete this label?'), confirm_btn_variant: 'danger' }, aria: { label: _('Delete label') }, method: :delete, remote: true do = sprite_icon('remove') diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml index ee2e63353f0..e8bcf479d70 100644 --- a/app/views/admin/projects/show.html.haml +++ b/app/views/admin/projects/show.html.haml @@ -39,15 +39,15 @@ = _('Namespace:') %strong - if @project.namespace - = link_to @project.namespace.human_name, [:admin, @project.group || @project.owner] + = link_to @project.namespace.human_name, [:admin, @project.personal? ? @project.namespace.owner : @project.group] - else = s_('ProjectSettings|Global') %li %span.light = _('Owned by:') %strong - - if @project.owner - = link_to @project.owner_name, [:admin, @project.owner] + - if @project.owners.any? + = safe_join(@project.owners.map { |owner| link_to(owner.name, [:admin, owner]) }, ", ".html_safe) - else = _('(deleted)') diff --git a/app/views/admin/runners/edit.html.haml b/app/views/admin/runners/edit.html.haml index 0257983016c..b65fead49ab 100644 --- a/app/views/admin/runners/edit.html.haml +++ b/app/views/admin/runners/edit.html.haml @@ -1,7 +1,7 @@ - add_page_specific_style 'page_bundles/ci_status' - runner_name = "##{@runner.id} (#{@runner.short_sha})" -- if Feature.enabled?(:runner_read_only_admin_view) +- if Feature.enabled?(:runner_read_only_admin_view, default_enabled: :yaml) - breadcrumb_title _('Edit') - page_title _('Edit'), runner_name - add_to_breadcrumbs _('Runners'), admin_runners_path diff --git a/app/views/admin/runners/show.html.haml b/app/views/admin/runners/show.html.haml index 7b4390ae463..5c4a7026f50 100644 --- a/app/views/admin/runners/show.html.haml +++ b/app/views/admin/runners/show.html.haml @@ -5,4 +5,4 @@ - page_title title - add_to_breadcrumbs _('Runners'), admin_runners_path --# Empty view in development behind feature flag runner_read_only_admin_view +#js-admin-runner-show{ data: {runner_id: @runner.id} } diff --git a/app/views/admin/users/_access_levels.html.haml b/app/views/admin/users/_access_levels.html.haml index 5977de7c84c..1e4c3f3bb62 100644 --- a/app/views/admin/users/_access_levels.html.haml +++ b/app/views/admin/users/_access_levels.html.haml @@ -26,10 +26,10 @@ = render_if_exists 'admin/users/auditor_access_level_radio', f: f, disabled: editing_current_user - - help_text = s_('AdminUsers|Administrators have access to all groups, projects and users and can manage all features in this installation.') - - help_text += ' ' + s_('AdminUsers|You cannot remove your own admin rights.') if editing_current_user + - help_text = s_('AdminUsers|The user has unlimited access to all groups, projects, users, and features.') + - help_text += ' ' + s_('AdminUsers|You cannot remove your own administrator access.') if editing_current_user = f.gitlab_ui_radio_component :access_level, :admin, - s_('AdminUsers|Admin'), + s_('AdminUsers|Administrator'), radio_options: { disabled: editing_current_user }, help_text: help_text diff --git a/app/views/admin/users/_users.html.haml b/app/views/admin/users/_users.html.haml index 5edd5403d49..6fdf383d571 100644 --- a/app/views/admin/users/_users.html.haml +++ b/app/views/admin/users/_users.html.haml @@ -6,43 +6,44 @@ .gl-alert-body = render 'shared/registration_features_discovery_message', feature_title: s_('RegistrationFeatures|send emails to users') -.top-area.scrolling-tabs-container.inner-page-scroll-tabs - .fade-left - = sprite_icon('chevron-lg-left', size: 12) - .fade-right - = sprite_icon('chevron-lg-right', size: 12) - = gl_tabs_nav({ class: 'scrolling-tabs nav-links gl-display-flex gl-flex-grow-1' }) do - = gl_tab_link_to admin_users_path, { item_active: active_when(params[:filter].nil?), class: 'gl-border-0!' } do - = s_('AdminUsers|Active') - = gl_tab_counter_badge(limited_counter_with_delimiter(User.active_without_ghosts)) - = gl_tab_link_to admin_users_path(filter: "admins"), { item_active: active_when(params[:filter] == 'admins'), class: 'gl-border-0!' } do - = s_('AdminUsers|Admins') - = gl_tab_counter_badge(limited_counter_with_delimiter(User.admins)) - = gl_tab_link_to admin_users_path(filter: 'two_factor_enabled'), { item_active: active_when(params[:filter] == 'two_factor_enabled'), class: 'filter-two-factor-enabled gl-border-0!' } do - = s_('AdminUsers|2FA Enabled') - = gl_tab_counter_badge(limited_counter_with_delimiter(User.with_two_factor)) - = gl_tab_link_to admin_users_path(filter: 'two_factor_disabled'), { item_active: active_when(params[:filter] == 'two_factor_disabled'), class: 'filter-two-factor-disabled gl-border-0!' } do - = s_('AdminUsers|2FA Disabled') - = gl_tab_counter_badge(limited_counter_with_delimiter(User.without_two_factor)) - = gl_tab_link_to admin_users_path(filter: 'external'), { item_active: active_when(params[:filter] == 'external'), class: 'gl-border-0!' } do - = s_('AdminUsers|External') - = gl_tab_counter_badge(limited_counter_with_delimiter(User.external)) - = gl_tab_link_to admin_users_path(filter: "blocked"), { item_active: active_when(params[:filter] == 'blocked'), class: 'gl-border-0!' } do - = s_('AdminUsers|Blocked') - = gl_tab_counter_badge(limited_counter_with_delimiter(User.blocked)) - - if ban_feature_available? - = gl_tab_link_to admin_users_path(filter: "banned"), { item_active: active_when(params[:filter] == 'banned'), class: 'gl-border-0!' } do - = s_('AdminUsers|Banned') - = gl_tab_counter_badge(limited_counter_with_delimiter(User.banned)) - = gl_tab_link_to admin_users_path(filter: "blocked_pending_approval"), { item_active: active_when(params[:filter] == 'blocked_pending_approval'), class: 'filter-blocked-pending-approval gl-border-0!', data: { qa_selector: 'pending_approval_tab' } } do - = s_('AdminUsers|Pending approval') - = gl_tab_counter_badge(limited_counter_with_delimiter(User.blocked_pending_approval)) - = gl_tab_link_to admin_users_path(filter: "deactivated"), { item_active: active_when(params[:filter] == 'deactivated'), class: 'gl-border-0!' } do - = s_('AdminUsers|Deactivated') - = gl_tab_counter_badge(limited_counter_with_delimiter(User.deactivated)) - = gl_tab_link_to admin_users_path(filter: "wop"), { item_active: active_when(params[:filter] == 'wop'), class: 'gl-border-0!' } do - = s_('AdminUsers|Without projects') - = gl_tab_counter_badge(limited_counter_with_delimiter(User.without_projects)) +.top-area + .scrolling-tabs-container.inner-page-scroll-tabs.gl-flex-grow-1.gl-min-w-0.gl-w-full + .fade-left + = sprite_icon('chevron-lg-left', size: 12) + .fade-right + = sprite_icon('chevron-lg-right', size: 12) + = gl_tabs_nav({ class: 'scrolling-tabs nav-links gl-display-flex gl-flex-grow-1 gl-w-full' }) do + = gl_tab_link_to admin_users_path, { item_active: active_when(params[:filter].nil?), class: 'gl-border-0!' } do + = s_('AdminUsers|Active') + = gl_tab_counter_badge(limited_counter_with_delimiter(User.active_without_ghosts)) + = gl_tab_link_to admin_users_path(filter: "admins"), { item_active: active_when(params[:filter] == 'admins'), class: 'gl-border-0!' } do + = s_('AdminUsers|Admins') + = gl_tab_counter_badge(limited_counter_with_delimiter(User.admins)) + = gl_tab_link_to admin_users_path(filter: 'two_factor_enabled'), { item_active: active_when(params[:filter] == 'two_factor_enabled'), class: 'filter-two-factor-enabled gl-border-0!' } do + = s_('AdminUsers|2FA Enabled') + = gl_tab_counter_badge(limited_counter_with_delimiter(User.with_two_factor)) + = gl_tab_link_to admin_users_path(filter: 'two_factor_disabled'), { item_active: active_when(params[:filter] == 'two_factor_disabled'), class: 'filter-two-factor-disabled gl-border-0!' } do + = s_('AdminUsers|2FA Disabled') + = gl_tab_counter_badge(limited_counter_with_delimiter(User.without_two_factor)) + = gl_tab_link_to admin_users_path(filter: 'external'), { item_active: active_when(params[:filter] == 'external'), class: 'gl-border-0!' } do + = s_('AdminUsers|External') + = gl_tab_counter_badge(limited_counter_with_delimiter(User.external)) + = gl_tab_link_to admin_users_path(filter: "blocked"), { item_active: active_when(params[:filter] == 'blocked'), class: 'gl-border-0!' } do + = s_('AdminUsers|Blocked') + = gl_tab_counter_badge(limited_counter_with_delimiter(User.blocked)) + - if ban_feature_available? + = gl_tab_link_to admin_users_path(filter: "banned"), { item_active: active_when(params[:filter] == 'banned'), class: 'gl-border-0!' } do + = s_('AdminUsers|Banned') + = gl_tab_counter_badge(limited_counter_with_delimiter(User.banned)) + = gl_tab_link_to admin_users_path(filter: "blocked_pending_approval"), { item_active: active_when(params[:filter] == 'blocked_pending_approval'), class: 'filter-blocked-pending-approval gl-border-0!', data: { qa_selector: 'pending_approval_tab' } } do + = s_('AdminUsers|Pending approval') + = gl_tab_counter_badge(limited_counter_with_delimiter(User.blocked_pending_approval)) + = gl_tab_link_to admin_users_path(filter: "deactivated"), { item_active: active_when(params[:filter] == 'deactivated'), class: 'gl-border-0!' } do + = s_('AdminUsers|Deactivated') + = gl_tab_counter_badge(limited_counter_with_delimiter(User.deactivated)) + = gl_tab_link_to admin_users_path(filter: "wop"), { item_active: active_when(params[:filter] == 'wop'), class: 'gl-border-0!' } do + = s_('AdminUsers|Without projects') + = gl_tab_counter_badge(limited_counter_with_delimiter(User.without_projects)) .nav-controls = render_if_exists 'admin/users/admin_email_users' = render_if_exists 'admin/users/admin_export_user_permissions' diff --git a/app/views/admin/users/projects.html.haml b/app/views/admin/users/projects.html.haml index f51ac40df4f..580cfe9f956 100644 --- a/app/views/admin/users/projects.html.haml +++ b/app/views/admin/users/projects.html.haml @@ -16,7 +16,7 @@ .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), testid: 'remove-user' }, method: :delete, remote: true, class: "btn btn-sm btn-danger gl-button btn-icon gl-ml-3", title: _('Remove user from group') do + = 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 @@ -46,7 +46,7 @@ %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) }, remote: true, method: :delete, class: "btn btn-sm btn-danger gl-button btn-icon gl-ml-3", title: _('Remove user from project') do + = 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') = render partial: 'admin/users/modals' diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml index bdc5bdabb21..94542af3b96 100644 --- a/app/views/admin/users/show.html.haml +++ b/app/views/admin/users/show.html.haml @@ -10,7 +10,7 @@ = @user.name %ul.content-list %li - = image_tag avatar_icon_for_user(@user, 60), class: "avatar s60" + = image_tag avatar_icon_for_user(@user, 60, current_user: current_user), class: "avatar s60" %li %span.light= _('Profile page:') %strong |