add student anonymous discussions setting

fixes VICE-2255
flag=discussion_anonymity

note 1: changing this settings will not persist
as the backend portion will happen in a different ticket

note 2: I had to put checkbox inside view even if
checkbox group wants only checkbox children because
it was the best way i can indent it. i added it to jest's
ignored errors

test pilan:
- with discussion redesign ff off but discussion anonymity ff on,
- visit discussion index page as a teacher
- verify that when you open the top right cog menu
- you do not see a Create anonymous discussion topics checkbox

- turn on both react discussions post and discussion anonymity ff's
- revisit index
- verify that cog menu checkbox has a Create anonymous discussion topics
checkbox
- verify that it is only enabled if parent Create discussion topics
is checked

Change-Id: I8fb22b10955d952a90d7c6c03c137cfa9a097ffd
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/278783
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Drake Harper <drake.harper@instructure.com>
QA-Review: Drake Harper <drake.harper@instructure.com>
Product-Review: Drake Harper <drake.harper@instructure.com>
This commit is contained in:
Caleb Guanzon 2021-11-18 10:10:06 -07:00
parent ce8a76cfa6
commit 784829e593
5 changed files with 41 additions and 19 deletions

View File

@ -415,6 +415,7 @@ class DiscussionTopicsController < ApplicationController
},
discussion_topic_menu_tools: external_tools_display_hashes(:discussion_topic_menu),
student_reporting_enabled: Account.site_admin.feature_enabled?(:discussions_reporting),
discussion_anonymity_enabled: @context.feature_enabled?(:react_discussions_post) && Account.site_admin.feature_enabled?(:discussion_anonymity),
discussion_topic_index_menu_tools: (@domain_root_account&.feature_enabled?(:commons_favorites) ?
external_tools_display_hashes(:discussion_topic_index_menu) : []),
}

View File

@ -90,6 +90,7 @@ const ignoredErrors = [
/Use the `defaultValue` or `value` props on <select> instead of setting `selected` on <option>/,
/validateDOMNesting\(...\): %s cannot appear as a child of <%s>/,
/WARNING: heuristic fragment matching going on!/,
/Warning: Failed prop type: Expected one of Checkbox in CheckboxGroup but found `View`/,
/You are using the simple \(heuristic\) fragment matcher, but your queries contain union or interface types./,
/You seem to have overlapping act\(\) calls/
]

View File

@ -259,6 +259,17 @@ describe DiscussionTopicsController do
expect(response).to be_successful
expect(assigns[:js_env][:DIRECT_SHARE_ENABLED]).to be(false)
end
it "sets discussions reporting and anonymity when their flags are enabled" do
Account.site_admin.enable_feature! :react_discussions_post
Account.site_admin.enable_feature! :discussions_reporting
Account.site_admin.enable_feature! :discussion_anonymity
user_session(@teacher)
get 'index', params: { course_id: @course.id }
expect(assigns[:js_env][:student_reporting_enabled]).to be(true)
expect(assigns[:js_env][:discussion_anonymity_enabled]).to be(true)
end
end
describe "GET 'show'" do

View File

@ -38,6 +38,7 @@ QUnit.module('DiscussionSettings component', suiteHooks => {
allow_student_forum_attachments: true,
allow_student_discussion_editing: true,
allow_student_discussion_reporting: true,
allow_student_anonymous_discussion_topics: true,
grading_standard_enabled: false,
grading_standard_id: null,
allow_student_organized_groups: true,
@ -59,7 +60,8 @@ QUnit.module('DiscussionSettings component', suiteHooks => {
suiteHooks.beforeEach(() => {
ENV = {
student_reporting_enabled: true
student_reporting_enabled: true,
discussion_anonymity_enabled: true
}
})
@ -76,17 +78,6 @@ QUnit.module('DiscussionSettings component', suiteHooks => {
equal(modalOpenSpy.callCount, 1)
})
test('should find 4 checked boxes', () => {
tree = mount(
<DiscussionSettings
{...makeProps({
permissions: {change_settings: true}
})}
/>
)
equal(document.querySelectorAll('[checked]').length, 4)
})
test('should find 0 checked boxes', () => {
tree = mount(
<DiscussionSettings
@ -96,7 +87,8 @@ QUnit.module('DiscussionSettings component', suiteHooks => {
allow_student_discussion_topics: false,
allow_student_forum_attachments: false,
allow_student_discussion_editing: false,
allow_student_discussion_reporting: false
allow_student_discussion_reporting: false,
allow_student_anonymous_discussion_topics: false
}
})}
/>
@ -111,14 +103,14 @@ QUnit.module('DiscussionSettings component', suiteHooks => {
equal(checkboxes.length, 1)
})
test('should render 5 checkbox if can change settings', () => {
test('should render 6 checkbox if can change settings', () => {
tree = shallow(
<DiscussionSettings
{...makeProps({isSettingsModalOpen: true, permissions: {change_settings: true}})}
/>
)
const checkboxes = tree.find('Checkbox')
equal(checkboxes.length, 5)
equal(checkboxes.length, 6)
})
test('should set state correctly with all true settings', () => {
@ -128,7 +120,7 @@ QUnit.module('DiscussionSettings component', suiteHooks => {
/>
)
tree.setProps({isSavingSettings: false})
equal(tree.instance().state.studentSettings.length, 4)
equal(tree.instance().state.studentSettings.length, 5)
})
test('should set state correctly with false props', () => {
@ -162,7 +154,8 @@ QUnit.module('DiscussionSettings component', suiteHooks => {
allow_student_discussion_topics: true,
allow_student_forum_attachments: true,
allow_student_discussion_editing: true,
allow_student_discussion_reporting: true
allow_student_discussion_reporting: true,
allow_student_anonymous_discussion_topics: true
}
const userSettings = {
markAsRead: false,
@ -188,7 +181,8 @@ QUnit.module('DiscussionSettings component', suiteHooks => {
allow_student_discussion_topics: true,
allow_student_forum_attachments: false,
allow_student_discussion_editing: true,
allow_student_discussion_reporting: false
allow_student_discussion_reporting: false,
allow_student_anonymous_discussion_topics: false
}
const userSettings = {
markAsRead: false,

View File

@ -27,13 +27,15 @@ import {Checkbox, CheckboxGroup} from '@instructure/ui-checkbox'
import Modal from '@canvas/instui-bindings/react/InstuiModal'
import {ScreenReaderContent} from '@instructure/ui-a11y-content'
import {IconSettingsLine} from '@instructure/ui-icons'
import {View} from '@instructure/ui-view'
import propTypes from '../propTypes'
const STUDENT_SETTINGS = [
'allow_student_forum_attachments',
'allow_student_discussion_editing',
'allow_student_discussion_topics',
'allow_student_discussion_reporting'
'allow_student_discussion_reporting',
'allow_student_anonymous_discussion_topics'
]
export default class DiscussionSettings extends Component {
@ -119,6 +121,19 @@ export default class DiscussionSettings extends Component {
label={I18n.t('Create discussion topics')}
value="allow_student_discussion_topics"
/>
{ENV.discussion_anonymity_enabled && (
<View as="div" padding="0 0 0 medium">
<Checkbox
id="allow_student_anonymous_discussion_topics"
disabled={
this.props.isSavingSettings ||
!this.state.studentSettings.includes('allow_student_discussion_topics')
}
label={I18n.t('Create anonymous discussion topics')}
value="allow_student_anonymous_discussion_topics"
/>
</View>
)}
<Checkbox
id="allow_student_discussion_editing"
disabled={this.props.isSavingSettings}