Commit 16c883d9 authored by Steve Mokris's avatar Steve Mokris Committed by Martin Wortschack

Add option to hide the default "thumbs up" and "thumbs down" buttons on...

Add option to hide the default "thumbs up" and "thumbs down" buttons on issues, merge requests, and snippets.
parent b7b0255d
<script> <script>
import { GlSprintf, GlLink } from '@gitlab/ui'; import { GlSprintf, GlLink, GlFormCheckbox } from '@gitlab/ui';
import settingsMixin from 'ee_else_ce/pages/projects/shared/permissions/mixins/settings_pannel_mixin'; import settingsMixin from 'ee_else_ce/pages/projects/shared/permissions/mixins/settings_pannel_mixin';
import { s__ } from '~/locale'; import { s__ } from '~/locale';
...@@ -24,6 +24,7 @@ export default { ...@@ -24,6 +24,7 @@ export default {
projectSettingRow, projectSettingRow,
GlSprintf, GlSprintf,
GlLink, GlLink,
GlFormCheckbox,
}, },
mixins: [settingsMixin], mixins: [settingsMixin],
...@@ -519,5 +520,23 @@ export default { ...@@ -519,5 +520,23 @@ export default {
) )
}}</span> }}</span>
</project-setting-row> </project-setting-row>
<project-setting-row class="mb-3">
<input
:value="showDefaultAwardEmojis"
type="hidden"
name="project[project_setting_attributes][show_default_award_emojis]"
/>
<gl-form-checkbox
v-model="showDefaultAwardEmojis"
name="project[project_setting_attributes][show_default_award_emojis]"
>
{{ s__('ProjectSettings|Show default award emojis') }}
<template #help>{{
s__(
'ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons.',
)
}}</template>
</gl-form-checkbox>
</project-setting-row>
</div> </div>
</template> </template>
...@@ -400,6 +400,9 @@ class ProjectsController < Projects::ApplicationController ...@@ -400,6 +400,9 @@ class ProjectsController < Projects::ApplicationController
wiki_access_level wiki_access_level
pages_access_level pages_access_level
metrics_dashboard_access_level metrics_dashboard_access_level
],
project_setting_attributes: %i[
show_default_award_emojis
] ]
] ]
end end
......
...@@ -588,7 +588,8 @@ module ProjectsHelper ...@@ -588,7 +588,8 @@ module ProjectsHelper
containerRegistryEnabled: !!project.container_registry_enabled, containerRegistryEnabled: !!project.container_registry_enabled,
lfsEnabled: !!project.lfs_enabled, lfsEnabled: !!project.lfs_enabled,
emailsDisabled: project.emails_disabled?, emailsDisabled: project.emails_disabled?,
metricsDashboardAccessLevel: feature.metrics_dashboard_access_level metricsDashboardAccessLevel: feature.metrics_dashboard_access_level,
showDefaultAwardEmojis: project.show_default_award_emojis?
} }
end end
......
...@@ -74,7 +74,7 @@ module Awardable ...@@ -74,7 +74,7 @@ module Awardable
# By default we always load award_emoji user association # By default we always load award_emoji user association
awards = award_emoji.group_by(&:name) awards = award_emoji.group_by(&:name)
if with_thumbs if with_thumbs && (!project || project.show_default_award_emojis?)
awards[AwardEmoji::UPVOTE_NAME] ||= [] awards[AwardEmoji::UPVOTE_NAME] ||= []
awards[AwardEmoji::DOWNVOTE_NAME] ||= [] awards[AwardEmoji::DOWNVOTE_NAME] ||= []
end end
......
...@@ -329,6 +329,7 @@ class Project < ApplicationRecord ...@@ -329,6 +329,7 @@ class Project < ApplicationRecord
accepts_nested_attributes_for :variables, allow_destroy: true accepts_nested_attributes_for :variables, allow_destroy: true
accepts_nested_attributes_for :project_feature, update_only: true accepts_nested_attributes_for :project_feature, update_only: true
accepts_nested_attributes_for :project_setting, update_only: true
accepts_nested_attributes_for :import_data accepts_nested_attributes_for :import_data
accepts_nested_attributes_for :auto_devops, update_only: true accepts_nested_attributes_for :auto_devops, update_only: true
accepts_nested_attributes_for :ci_cd_settings, update_only: true accepts_nested_attributes_for :ci_cd_settings, update_only: true
...@@ -352,6 +353,9 @@ class Project < ApplicationRecord ...@@ -352,6 +353,9 @@ class Project < ApplicationRecord
:wiki_access_level, :snippets_access_level, :builds_access_level, :wiki_access_level, :snippets_access_level, :builds_access_level,
:repository_access_level, :pages_access_level, :metrics_dashboard_access_level, :repository_access_level, :pages_access_level, :metrics_dashboard_access_level,
to: :project_feature, allow_nil: true to: :project_feature, allow_nil: true
delegate :show_default_award_emojis, :show_default_award_emojis=,
:show_default_award_emojis?,
to: :project_setting, allow_nil: true
delegate :scheduled?, :started?, :in_progress?, :failed?, :finished?, delegate :scheduled?, :started?, :in_progress?, :failed?, :finished?,
prefix: :import, to: :import_state, allow_nil: true prefix: :import, to: :import_state, allow_nil: true
delegate :no_import?, to: :import_state, allow_nil: true delegate :no_import?, to: :import_state, allow_nil: true
......
...@@ -196,6 +196,7 @@ class ProjectPolicy < BasePolicy ...@@ -196,6 +196,7 @@ class ProjectPolicy < BasePolicy
enable :set_issue_updated_at enable :set_issue_updated_at
enable :set_note_created_at enable :set_note_created_at
enable :set_emails_disabled enable :set_emails_disabled
enable :set_show_default_award_emojis
end end
rule { can?(:guest_access) }.policy do rule { can?(:guest_access) }.policy do
......
---
title: Add option to hide the default "thumbs up" and "thumbs down" buttons on
issues, merge requests, and snippets.
merge_request: 27734
author: Steve Mokris
type: added
# frozen_string_literal: true
class AddProjectShowDefaultAwardEmojis < ActiveRecord::Migration[6.0]
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
def change
add_column :project_settings, :show_default_award_emojis, :boolean, default: true, null: false # rubocop: disable Migration/AddColumn
end
end
...@@ -5252,7 +5252,9 @@ CREATE TABLE public.project_settings ( ...@@ -5252,7 +5252,9 @@ CREATE TABLE public.project_settings (
project_id integer NOT NULL, project_id integer NOT NULL,
created_at timestamp with time zone NOT NULL, created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL, updated_at timestamp with time zone NOT NULL,
push_rule_id bigint push_rule_id bigint,
show_default_award_emojis boolean DEFAULT true,
CONSTRAINT check_bde223416c CHECK ((show_default_award_emojis IS NOT NULL))
); );
CREATE TABLE public.project_statistics ( CREATE TABLE public.project_statistics (
...@@ -13659,6 +13661,7 @@ COPY "schema_migrations" (version) FROM STDIN; ...@@ -13659,6 +13661,7 @@ COPY "schema_migrations" (version) FROM STDIN;
20200319203901 20200319203901
20200320112455 20200320112455
20200320123839 20200320123839
20200320212400
20200323011225 20200323011225
20200323011955 20200323011955
20200323071918 20200323071918
......
...@@ -1029,6 +1029,7 @@ POST /projects ...@@ -1029,6 +1029,7 @@ POST /projects
| `snippets_access_level` | string | no | One of `disabled`, `private` or `enabled` | | `snippets_access_level` | string | no | One of `disabled`, `private` or `enabled` |
| `pages_access_level` | string | no | One of `disabled`, `private`, `enabled` or `public` | | `pages_access_level` | string | no | One of `disabled`, `private`, `enabled` or `public` |
| `emails_disabled` | boolean | no | Disable email notifications | | `emails_disabled` | boolean | no | Disable email notifications |
| `show_default_award_emojis` | boolean | no | Show default award emojis |
| `resolve_outdated_diff_discussions` | boolean | no | Automatically resolve merge request diffs discussions on lines changed with a push | | `resolve_outdated_diff_discussions` | boolean | no | Automatically resolve merge request diffs discussions on lines changed with a push |
| `container_registry_enabled` | boolean | no | Enable container registry for this project | | `container_registry_enabled` | boolean | no | Enable container registry for this project |
| `container_expiration_policy_attributes` | hash | no | Update the image expiration policy for this project. Accepts: `cadence` (string), `keep_n` (string), `older_than` (string), `name_regex` (string), `name_regex_delete` (string), `name_regex_keep` (string), `enabled` (boolean) | | `container_expiration_policy_attributes` | hash | no | Update the image expiration policy for this project. Accepts: `cadence` (string), `keep_n` (string), `older_than` (string), `name_regex` (string), `name_regex_delete` (string), `name_regex_keep` (string), `enabled` (boolean) |
...@@ -1098,6 +1099,7 @@ POST /projects/user/:user_id ...@@ -1098,6 +1099,7 @@ POST /projects/user/:user_id
| `snippets_access_level` | string | no | One of `disabled`, `private` or `enabled` | | `snippets_access_level` | string | no | One of `disabled`, `private` or `enabled` |
| `pages_access_level` | string | no | One of `disabled`, `private`, `enabled` or `public` | | `pages_access_level` | string | no | One of `disabled`, `private`, `enabled` or `public` |
| `emails_disabled` | boolean | no | Disable email notifications | | `emails_disabled` | boolean | no | Disable email notifications |
| `show_default_award_emojis` | boolean | no | Show default award emojis |
| `resolve_outdated_diff_discussions` | boolean | no | Automatically resolve merge request diffs discussions on lines changed with a push | | `resolve_outdated_diff_discussions` | boolean | no | Automatically resolve merge request diffs discussions on lines changed with a push |
| `container_registry_enabled` | boolean | no | Enable container registry for this project | | `container_registry_enabled` | boolean | no | Enable container registry for this project |
| `shared_runners_enabled` | boolean | no | Enable shared runners for this project | | `shared_runners_enabled` | boolean | no | Enable shared runners for this project |
...@@ -1166,6 +1168,7 @@ PUT /projects/:id ...@@ -1166,6 +1168,7 @@ PUT /projects/:id
| `snippets_access_level` | string | no | One of `disabled`, `private` or `enabled` | | `snippets_access_level` | string | no | One of `disabled`, `private` or `enabled` |
| `pages_access_level` | string | no | One of `disabled`, `private`, `enabled` or `public` | | `pages_access_level` | string | no | One of `disabled`, `private`, `enabled` or `public` |
| `emails_disabled` | boolean | no | Disable email notifications | | `emails_disabled` | boolean | no | Disable email notifications |
| `show_default_award_emojis` | boolean | no | Show default award emojis |
| `resolve_outdated_diff_discussions` | boolean | no | Automatically resolve merge request diffs discussions on lines changed with a push | | `resolve_outdated_diff_discussions` | boolean | no | Automatically resolve merge request diffs discussions on lines changed with a push |
| `container_registry_enabled` | boolean | no | Enable container registry for this project | | `container_registry_enabled` | boolean | no | Enable container registry for this project |
| `container_expiration_policy_attributes` | hash | no | Update the image expiration policy for this project. Accepts: `cadence` (string), `keep_n` (string), `older_than` (string), `name_regex` (string), `name_regex_delete` (string), `name_regex_keep` (string), `enabled` (boolean) | | `container_expiration_policy_attributes` | hash | no | Update the image expiration policy for this project. Accepts: `cadence` (string), `keep_n` (string), `older_than` (string), `name_regex` (string), `name_regex_delete` (string), `name_regex_keep` (string), `enabled` (boolean) |
......
...@@ -31,6 +31,7 @@ module API ...@@ -31,6 +31,7 @@ module API
optional :pages_access_level, type: String, values: %w(disabled private enabled public), desc: 'Pages access level. One of `disabled`, `private`, `enabled` or `public`' optional :pages_access_level, type: String, values: %w(disabled private enabled public), desc: 'Pages access level. One of `disabled`, `private`, `enabled` or `public`'
optional :emails_disabled, type: Boolean, desc: 'Disable email notifications' optional :emails_disabled, type: Boolean, desc: 'Disable email notifications'
optional :show_default_award_emojis, type: Boolean, desc: 'Show default award emojis'
optional :shared_runners_enabled, type: Boolean, desc: 'Flag indication if shared runners are enabled for that project' optional :shared_runners_enabled, type: Boolean, desc: 'Flag indication if shared runners are enabled for that project'
optional :resolve_outdated_diff_discussions, type: Boolean, desc: 'Automatically resolve merge request diffs discussions on lines changed with a push' optional :resolve_outdated_diff_discussions, type: Boolean, desc: 'Automatically resolve merge request diffs discussions on lines changed with a push'
optional :remove_source_branch_after_merge, type: Boolean, desc: 'Remove the source branch by default after merge' optional :remove_source_branch_after_merge, type: Boolean, desc: 'Remove the source branch by default after merge'
......
...@@ -168,6 +168,7 @@ excluded_attributes: ...@@ -168,6 +168,7 @@ excluded_attributes:
- :marked_for_deletion_at - :marked_for_deletion_at
- :marked_for_deletion_by_user_id - :marked_for_deletion_by_user_id
- :compliance_framework_setting - :compliance_framework_setting
- :show_default_award_emojis
namespaces: namespaces:
- :runners_token - :runners_token
- :runners_token_encrypted - :runners_token_encrypted
......
...@@ -16570,6 +16570,9 @@ msgstr "" ...@@ -16570,6 +16570,9 @@ msgstr ""
msgid "ProjectSettings|Share code pastes with others out of Git repository" msgid "ProjectSettings|Share code pastes with others out of Git repository"
msgstr "" msgstr ""
msgid "ProjectSettings|Show default award emojis"
msgstr ""
msgid "ProjectSettings|Show link to create/view merge request when pushing from the command line" msgid "ProjectSettings|Show link to create/view merge request when pushing from the command line"
msgstr "" msgstr ""
...@@ -16615,6 +16618,9 @@ msgstr "" ...@@ -16615,6 +16618,9 @@ msgstr ""
msgid "ProjectSettings|When conflicts arise the user is given the option to rebase" msgid "ProjectSettings|When conflicts arise the user is given the option to rebase"
msgstr "" msgstr ""
msgid "ProjectSettings|When enabled, issues, merge requests, and snippets will always show thumbs-up and thumbs-down award emoji buttons."
msgstr ""
msgid "ProjectSettings|Wiki" msgid "ProjectSettings|Wiki"
msgstr "" msgstr ""
......
...@@ -54,6 +54,36 @@ describe 'Projects settings' do ...@@ -54,6 +54,36 @@ describe 'Projects settings' do
end end
end end
context 'default award emojis', :js do
it 'shows award emojis by default' do
visit edit_project_path(project)
default_award_emojis_input = find('input[name="project[project_setting_attributes][show_default_award_emojis]"]', visible: :hidden)
expect(default_award_emojis_input.value).to eq('true')
end
it 'disables award emojis when the checkbox is toggled off' do
visit edit_project_path(project)
default_award_emojis_input = find('input[name="project[project_setting_attributes][show_default_award_emojis]"]', visible: :hidden)
default_award_emojis_checkbox = find('input[name="project[project_setting_attributes][show_default_award_emojis]"][type=checkbox]')
expect(default_award_emojis_input.value).to eq('true')
default_award_emojis_checkbox.click
expect(default_award_emojis_input.value).to eq('false')
page.within('.sharing-permissions') do
find('input[value="Save changes"]').click
end
wait_for_requests
expect(default_award_emojis_input.value).to eq('false')
end
end
def expect_toggle_state(state) def expect_toggle_state(state)
is_collapsed = state == :collapsed is_collapsed = state == :collapsed
......
...@@ -23,6 +23,7 @@ const defaultProps = { ...@@ -23,6 +23,7 @@ const defaultProps = {
lfsEnabled: true, lfsEnabled: true,
emailsDisabled: false, emailsDisabled: false,
packagesEnabled: true, packagesEnabled: true,
showDefaultAwardEmojis: true,
}, },
canDisableEmails: true, canDisableEmails: true,
canChangeVisibilityLevel: true, canChangeVisibilityLevel: true,
...@@ -474,6 +475,18 @@ describe('Settings Panel', () => { ...@@ -474,6 +475,18 @@ describe('Settings Panel', () => {
}); });
}); });
describe('Default award emojis', () => {
it('should show the "Show default award emojis" input', () => {
return wrapper.vm.$nextTick(() => {
expect(
wrapper
.find('input[name="project[project_setting_attributes][show_default_award_emojis]"]')
.exists(),
).toBe(true);
});
});
});
describe('Metrics dashboard', () => { describe('Metrics dashboard', () => {
it('should show the metrics dashboard access toggle', () => { it('should show the metrics dashboard access toggle', () => {
return wrapper.vm.$nextTick(() => { return wrapper.vm.$nextTick(() => {
......
...@@ -91,4 +91,45 @@ describe Awardable do ...@@ -91,4 +91,45 @@ describe Awardable do
expect(issue.award_emoji).to eq issue.award_emoji.sort_by(&:id) expect(issue.award_emoji).to eq issue.award_emoji.sort_by(&:id)
end end
end end
describe "#grouped_awards" do
context 'default award emojis' do
let(:issue_without_downvote) { create(:issue) }
let(:issue_with_downvote) do
issue_with_downvote = create(:issue)
create(:award_emoji, :downvote, awardable: issue_with_downvote)
issue_with_downvote
end
it "includes unused thumbs buttons by default" do
expect(issue_without_downvote.grouped_awards.keys.sort).to eq %w(thumbsdown thumbsup)
end
it "doesn't include unused thumbs buttons when disabled in project" do
issue_without_downvote.project.show_default_award_emojis = false
expect(issue_without_downvote.grouped_awards.keys.sort).to eq []
end
it "includes unused thumbs buttons when enabled in project" do
issue_without_downvote.project.show_default_award_emojis = true
expect(issue_without_downvote.grouped_awards.keys.sort).to eq %w(thumbsdown thumbsup)
end
it "doesn't include unused thumbs buttons in summary" do
expect(issue_without_downvote.grouped_awards(with_thumbs: false).keys).to eq []
end
it "includes used thumbs buttons when disabled in project" do
issue_with_downvote.project.show_default_award_emojis = false
expect(issue_with_downvote.grouped_awards.keys).to eq %w(thumbsdown)
end
it "includes used thumbs buttons in summary" do
expect(issue_with_downvote.grouped_awards(with_thumbs: false).keys).to eq %w(thumbsdown)
end
end
end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment