From 8437a24ff46220e2813ce3d82a52062dd259276b Mon Sep 17 00:00:00 2001 From: Michael Kozono Date: Thu, 31 Aug 2017 22:58:05 -0700 Subject: Vary share lock setting UI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …based on whether the current user owns the parent group and whether the parent group or current group is share locked. --- app/helpers/groups_helper.rb | 32 +++++++ app/views/groups/edit.html.haml | 4 +- spec/views/groups/edit.html.haml_spec.rb | 140 +++++++++++++++++++++++++++++++ 3 files changed, 174 insertions(+), 2 deletions(-) create mode 100644 spec/views/groups/edit.html.haml_spec.rb diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb index eab1feb8a1f..1ced92e0828 100644 --- a/app/helpers/groups_helper.rb +++ b/app/helpers/groups_helper.rb @@ -65,6 +65,22 @@ module GroupsHelper { group_name: group.name } end + def share_with_group_lock_disabled + return false unless @group.has_parent? + return false unless @group.parent.share_with_group_lock? + return false unless @group.share_with_group_lock? + return false if @group.has_owner?(current_user) + return true + end + + def share_with_group_lock_help_text + return default_help unless @group.has_parent? + return default_help unless @group.parent.share_with_group_lock? + return parent_locked_and_has_been_overridden unless @group.share_with_group_lock? + return parent_locked_but_you_can_override if @group.has_owner?(current_user) + return parent_locked_so_ask_the_owner + end + private def group_title_link(group, hidable: false, show_avatar: false) @@ -80,4 +96,20 @@ module GroupsHelper output.html_safe end end + + def default_help + "This setting will be applied to all subgroups unless overridden by a group owner." + end + + def parent_locked_but_you_can_override + "This setting is applied on #{@group.parent.name}. You can override the setting or remove the share lock from the parent group." + end + + def parent_locked_so_ask_the_owner + "This setting is applied on #{@group.parent.name}. To share this group with another group, ask the owner to override the setting or remove the share lock from the parent group." + end + + def parent_locked_and_has_been_overridden + "This setting is applied on #{@group.parent.name} and has been overridden on this subgroup." + end end diff --git a/app/views/groups/edit.html.haml b/app/views/groups/edit.html.haml index b53f0b90b9c..fb7825b82fc 100644 --- a/app/views/groups/edit.html.haml +++ b/app/views/groups/edit.html.haml @@ -33,13 +33,13 @@ .col-sm-10 .checkbox = f.label :share_with_group_lock do - = f.check_box :share_with_group_lock + = f.check_box :share_with_group_lock, disabled: share_with_group_lock_disabled %strong Prevent sharing a project within = @group.name with other groups %br/ - %span.descr This setting will be applied to all subgroups unless overridden by a group owner + %span.descr= share_with_group_lock_help_text = render 'group_admin_settings', f: f diff --git a/spec/views/groups/edit.html.haml_spec.rb b/spec/views/groups/edit.html.haml_spec.rb new file mode 100644 index 00000000000..613368049e1 --- /dev/null +++ b/spec/views/groups/edit.html.haml_spec.rb @@ -0,0 +1,140 @@ +require 'spec_helper' + +describe 'groups/edit.html.haml' do + include Devise::Test::ControllerHelpers + + describe 'Share lock option' do + let(:root_owner) { create(:user) } + let(:root_group) { create(:group) } + let(:expected_label) { default_label } + let(:expected_help) { default_help } + + before do + root_group.add_owner(root_owner) + end + + shared_examples_for 'share lock option' do |checkbox_options| + it 'should have the correct label, help text, and checkbox options' do + assign(:group, test_group) + allow(view).to receive(:can?).and_return(true) + allow(view).to receive(:can_change_group_visibility_level?).and_return(false) + allow(view).to receive(:current_user).and_return(test_user) + + render + + expect(rendered).to have_content(expected_label) + expect(rendered).to have_css('.descr', text: expected_help) + expect(rendered).to have_field('group_share_with_group_lock', checkbox_options) + end + end + + context 'for a root group' do + let(:test_group) { root_group } + let(:test_user) { root_owner } + + it_behaves_like 'share lock option', { disabled: false, checked: false } + end + + context 'for a subgroup', :nested_groups do + let!(:subgroup) { create(:group, parent: root_group) } + let(:sub_owner) { create(:user) } + let(:test_group) { subgroup } + + context 'when the root_group has "Share lock" disabled' do + context 'when the subgroup has "Share lock" disabled' do + context 'as the root_owner' do + let(:test_user) { root_owner } + + it_behaves_like 'share lock option', { disabled: false, checked: false } + end + + context 'as the sub_owner' do + let(:test_user) { sub_owner } + + it_behaves_like 'share lock option', { disabled: false, checked: false } + end + end + + context 'when the subgroup has "Share lock" enabled' do + before do + subgroup.update_column(:share_with_group_lock, true) + end + + context 'as the root_owner' do + let(:test_user) { root_owner } + + it_behaves_like 'share lock option', { disabled: false, checked: true } + end + + context 'as the sub_owner' do + let(:test_user) { sub_owner } + + it_behaves_like 'share lock option', { disabled: false, checked: true } + end + end + end + + context 'when the root_group has "Share lock" enabled' do + before do + root_group.update_column(:share_with_group_lock, true) + end + + context 'when the subgroup has "Share lock" disabled (parent overridden)' do + context 'as the root_owner' do + let(:test_user) { root_owner } + let(:expected_help) { parent_locked_and_has_been_overridden } + + it_behaves_like 'share lock option', { disabled: false, checked: false } + end + + context 'as the sub_owner' do + let(:test_user) { sub_owner } + let(:expected_help) { parent_locked_and_has_been_overridden } + + it_behaves_like 'share lock option', { disabled: false, checked: false } + end + end + + context 'when the subgroup has "Share lock" enabled (same as parent)' do + before do + subgroup.update_column(:share_with_group_lock, true) + end + + context 'as the root_owner' do + let(:test_user) { root_owner } + let(:expected_help) { parent_locked_but_you_can_override } + + it_behaves_like 'share lock option', { disabled: false, checked: true } + end + + context 'as the sub_owner' do + let(:test_user) { sub_owner } + let(:expected_help) { parent_locked_so_ask_the_owner } + + it_behaves_like 'share lock option', { disabled: true, checked: true } + end + end + end + end + + def default_label + "Prevent sharing a project within #{test_group.name} with other groups" + end + + def default_help + "This setting will be applied to all subgroups unless overridden by a group owner." + end + + def parent_locked_but_you_can_override + "This setting is applied on #{test_group.parent.name}. You can override the setting or remove the share lock from the parent group." + end + + def parent_locked_so_ask_the_owner + "This setting is applied on #{test_group.parent.name}. To share this group with another group, ask the owner to override the setting or remove the share lock from the parent group." + end + + def parent_locked_and_has_been_overridden + "This setting is applied on #{test_group.parent.name} and has been overridden on this subgroup." + end + end +end -- cgit v1.2.1