Remove k5_parent_support flag

closes LS-2984
flag = k5_parent_support

[fsc-timeout=45]
[fsc-max-nodes=20]

Test plan:
 - Visit the k5 dashboard as an observer with several students
 - Expect to see the observer picker
 - Expect switching students to function normally
 - Open a course and expect the selected student to remain selected
   in the picker
 - Open dashboard as a non-observer user and expect the picker to
   be gone

Change-Id: I0f6aa230976b6929ceba7621c1ff34a400226340
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/284783
Reviewed-by: Ed Schiebel <eschiebel@instructure.com>
QA-Review: Ed Schiebel <eschiebel@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Product-Review: Jackson Howe <jackson.howe@instructure.com>
This commit is contained in:
Jackson Howe 2022-02-09 10:28:37 -07:00
parent 47a302159c
commit f6173a54b8
21 changed files with 50 additions and 82 deletions

View File

@ -276,9 +276,8 @@ class ApplicationController < ActionController::Base
# put feature checks on Account.site_admin and @domain_root_account that we're loading for every page in here
# so altogether we can get them faster the vast majority of the time
JS_ENV_SITE_ADMIN_FEATURES = %i[
featured_help_links feature_flag_filters k5_parent_support
conferencing_in_planner word_count_in_speed_grader observer_picker lti_platform_storage
scale_equation_images new_equation_editor buttons_and_icons_cropper
featured_help_links feature_flag_filters conferencing_in_planner word_count_in_speed_grader observer_picker
lti_platform_storage scale_equation_images new_equation_editor buttons_and_icons_cropper
].freeze
JS_ENV_ROOT_ACCOUNT_FEATURES = %i[
product_tours files_dnd usage_rights_discussion_topics

View File

@ -531,7 +531,7 @@ class UsersController < ApplicationController
})
# prefetch dashboard cards with the right observer url param
if @current_user.roles(@domain_root_account).include?("observer") && (Account.site_admin.feature_enabled?(:k5_parent_support) || Account.site_admin.feature_enabled?(:observer_picker))
if @current_user.roles(@domain_root_account).include?("observer")
@cards_prefetch_observed_param = @selected_observed_user&.id
end

View File

@ -1200,7 +1200,7 @@ module ApplicationHelper
def planner_enabled?
!!@current_user&.has_student_enrollment? ||
(Account.site_admin.feature_enabled?(:k5_parent_support) && @current_user&.roles(@domain_root_account)&.include?("observer") && k5_user?) ||
(@current_user&.roles(@domain_root_account)&.include?("observer") && k5_user?) ||
(!!@current_user&.roles(@domain_root_account)&.include?("observer") && Account.site_admin.feature_enabled?(:observer_picker)) # TODO: ensure observee is a student?
end

View File

@ -26,7 +26,7 @@
<% provide :page_title do %><%= dashboard_title %><% end %>
<%
is_observer = Account.site_admin.feature_enabled?(:k5_parent_support) && @current_user&.roles(@domain_root_account)&.include?('observer')
is_observer = @current_user&.roles(@domain_root_account)&.include?('observer')
if show_planner?
# fire off these `fetch` requests now so they are ready sooner
six_months_ago = CGI.escape Time.now.utc.at_beginning_of_day.months_ago(6).iso8601(3)

View File

@ -25,11 +25,6 @@ auto_show_cc:
Automatically show closed captions in the user's current
language (if available) when playing canvas media.
applies_to: User
k5_parent_support:
state: hidden
display_name: 'Canvas for Elementary: Parent Support'
description: Enables support for observers within Canvas for Elementary.
applies_to: SiteAdmin
pace_plans:
state: hidden
display_name: 'Pace Plans'

View File

@ -2730,7 +2730,6 @@ describe UsersController do
context "@cards_prefetch_observed_param" do
before :once do
Account.site_admin.enable_feature!(:k5_parent_support)
@user1 = user_factory(active_all: true, account: @account)
@course = course_factory(active_all: true, account: @account)
end

View File

@ -839,47 +839,35 @@ describe ApplicationHelper do
@course1.enroll_user(@observer, "ObserverEnrollment", { associated_user_id: @student1.id })
end
context "with the k5_parent_support flag enabled" do
before :once do
Account.site_admin.enable_feature! :k5_parent_support
end
it "still returns true for the observed student" do
@current_user = @student1
expect(planner_enabled?).to be true
end
it "returns false for the observer if not k5_user" do
allow(helper).to receive(:k5_user?).and_return(false)
@current_user = @observer
expect(helper.planner_enabled?).to be false
end
it "returns true for the observer if k5_user" do
allow(helper).to receive(:k5_user?).and_return(true)
@current_user = @observer
expect(helper.planner_enabled?).to be true
end
it "still returns false for a teacher" do
teacher = user_factory(active_all: true)
@course1.enroll_teacher(teacher)
@current_user = teacher
expect(planner_enabled?).to be false
end
it "still returns true for the observed student" do
@current_user = @student1
expect(planner_enabled?).to be true
end
context "with the k5_parent_support flag disabled" do
it "returns false as an observer" do
@current_user = @observer
expect(planner_enabled?).to be false
end
it "returns false for the observer if not k5_user and observer_picker flag is disabled" do
allow(helper).to receive(:k5_user?).and_return(false)
@current_user = @observer
expect(helper.planner_enabled?).to be false
end
it "returns true as an observer with observer_picker flag enabled" do
Account.site_admin.enable_feature! :observer_picker
@current_user = @observer
expect(planner_enabled?).to be true
end
it "returns true for the observer if k5_user" do
allow(helper).to receive(:k5_user?).and_return(true)
@current_user = @observer
expect(helper.planner_enabled?).to be true
end
it "still returns false for a teacher" do
teacher = user_factory(active_all: true)
@course1.enroll_teacher(teacher)
@current_user = teacher
expect(planner_enabled?).to be false
end
it "returns true as an observer with observer_picker flag enabled" do
allow(helper).to receive(:k5_user?).and_return(false)
Account.site_admin.enable_feature! :observer_picker
@current_user = @observer
expect(helper.planner_enabled?).to be true
end
end
end

View File

@ -101,7 +101,6 @@ describe "dashboard" do
context "as an observer" do
before :once do
Account.site_admin.enable_feature!(:k5_parent_support)
course_with_student(active_all: true)
@student = @user
@observer = user_factory(active_all: true)

View File

@ -42,7 +42,6 @@ describe "observer k5 dashboard" do
include ObserverEnrollmentsHelper
before :once do
Account.site_admin.enable_feature!(:k5_parent_support)
student_setup
observer_setup
end

View File

@ -32,7 +32,6 @@ describe "observer k5 dashboard important dates" do
include K5ImportantDatesSectionPageObject
before :once do
Account.site_admin.enable_feature!(:k5_parent_support)
student_setup
observer_setup
end

View File

@ -185,7 +185,6 @@ shared_examples_for "k5 important dates calendar picker" do |context|
end
user_session(@homeroom_teacher)
when :observer
Account.site_admin.enable_feature!(:k5_parent_support)
@observer = user_with_pseudonym(name: "Mom", email: "bestmom@example.com", workflow_state: "available")
add_linked_observer(@student, @observer, root_account: @account)
# For now, The calendar picker is only available if the observer is viewing his own enrollments

View File

@ -34,7 +34,6 @@ shared_examples_for "k5 subject navigation tabs" do
let(:navigation_names) { ["Home", "Schedule", "Modules", "Grades", "Groups", lti_a, lti_b] }
before :once do
Account.site_admin.enable_feature!(:k5_parent_support)
@resource_a = "context_external_tool_#{create_lti_resource(lti_a).id}"
@resource_b = "context_external_tool_#{create_lti_resource(lti_b).id}"
end

View File

@ -56,7 +56,6 @@ ready(() => {
pagesPath={ENV.COURSE.pages_url}
hasWikiPages={ENV.COURSE.has_wiki_pages}
hasSyllabusBody={ENV.COURSE.has_syllabus_body}
parentSupportEnabled={ENV.FEATURES?.k5_parent_support}
observedUsersList={ENV.OBSERVED_USERS_LIST}
selfEnrollment={ENV.COURSE.self_enrollment}
tabContentOnly={ENV.TAB_CONTENT_ONLY}

View File

@ -462,7 +462,6 @@ export function K5Course({
pagesPath,
hasWikiPages,
hasSyllabusBody,
parentSupportEnabled,
observedUsersList,
selfEnrollment,
tabContentOnly,
@ -497,8 +496,7 @@ export function K5Course({
const tabsPaddingRef = useRef(null)
const [modulesExist, setModulesExist] = useState(true)
const [windowSize, setWindowSize] = useState(() => getWindowSize())
const showObserverOptions =
parentSupportEnabled && shouldShowObserverOptions(observedUsersList, currentUser)
const showObserverOptions = shouldShowObserverOptions(observedUsersList, currentUser)
const showingMobileNav = windowSize.width < MOBILE_NAV_BREAKPOINT_PX
useEffect(() => {
modulesRef.current = document.getElementById('k5-modules-container')
@ -627,7 +625,6 @@ export function K5Course({
showStudentView={showStudentView}
studentViewPath={`${studentViewPath + window.location.hash}`}
courseContext={name}
parentSupportEnabled={parentSupportEnabled}
observedUsersList={observedUsersList}
currentUser={currentUser}
handleChangeObservedUser={setObservedUserId}
@ -740,7 +737,6 @@ K5Course.propTypes = {
pagesPath: PropTypes.string.isRequired,
hasWikiPages: PropTypes.bool.isRequired,
hasSyllabusBody: PropTypes.bool.isRequired,
parentSupportEnabled: PropTypes.bool.isRequired,
observedUsersList: ObservedUsersListShape.isRequired,
selfEnrollment: PropTypes.object,
tabContentOnly: PropTypes.bool,

View File

@ -105,8 +105,7 @@ const defaultProps = {
pagesPath: '/courses/30/pages',
hasWikiPages: true,
hasSyllabusBody: true,
parentSupportEnabled: false,
observedUsersList: MOCK_OBSERVED_USERS_LIST,
observedUsersList: [{id: currentUser.id, name: currentUser.display_name}],
selfEnrollment: {
option: null,
url: null
@ -789,7 +788,9 @@ describe('K-5 Subject Course', () => {
})
it('shows picker when user is an observer', () => {
const {getByRole} = render(<K5Course {...defaultProps} parentSupportEnabled />)
const {getByRole} = render(
<K5Course {...defaultProps} observedUsersList={MOCK_OBSERVED_USERS_LIST} />
)
const select = getByRole('combobox', {name: 'Select a student to view'})
expect(select).toBeInTheDocument()
expect(select.value).toBe('Zelda')
@ -797,7 +798,11 @@ describe('K-5 Subject Course', () => {
it('shows the observee grades on the Grades Tab', async () => {
const {getByRole, getByText} = render(
<K5Course {...defaultProps} parentSupportEnabled defaultTab={TAB_IDS.GRADES} />
<K5Course
{...defaultProps}
observedUsersList={MOCK_OBSERVED_USERS_LIST}
defaultTab={TAB_IDS.GRADES}
/>
)
const select = getByRole('combobox', {name: 'Select a student to view'})
act(() => select.click())

View File

@ -39,7 +39,6 @@ ready(() => {
restrictCourseCreation={ENV.CREATE_COURSES_PERMISSIONS.RESTRICT_TO_MCC_ACCOUNT}
selectedContextCodes={ENV.SELECTED_CONTEXT_CODES}
selectedContextsLimit={ENV.SELECTED_CONTEXTS_LIMIT}
parentSupportEnabled={ENV.FEATURES?.k5_parent_support}
observedUsersList={ENV.OBSERVED_USERS_LIST}
canAddObservee={ENV.CAN_ADD_OBSERVEE}
openTodosInNewTab={ENV.OPEN_TEACHER_TODOS_IN_NEW_TAB}

View File

@ -54,7 +54,7 @@ const ImportantDates = ({
const [selectedContextCodes, setSelectedContextCodes] = useState(null)
const previousContextsRef = useRef(null)
const [fetchEventsPath, setFetchEventsPath] = useState('/api/v1/calendar_events')
const observerMode = !!(ENV.FEATURES?.k5_parent_support && observedUserId)
const observerMode = !!observedUserId
const isObservingUser = observerMode && observedUserId !== ENV.current_user_id
useEffect(() => {

View File

@ -138,7 +138,6 @@ export const K5Dashboard = ({
hideGradesTabForStudents = false,
selectedContextCodes,
selectedContextsLimit,
parentSupportEnabled,
observedUsersList,
canAddObservee,
openTodosInNewTab,
@ -168,7 +167,7 @@ export const K5Dashboard = ({
})
const canDisableElementaryDashboard = currentUserRoles.some(r => ['admin', 'teacher'].includes(r))
const useImportantDatesTray = responsiveSize !== 'large'
const observerMode = parentSupportEnabled && currentUserRoles.includes('observer')
const observerMode = currentUserRoles.includes('observer')
// If the view width increases while the tray is open, change the state to close the tray
if (trayOpen && !useImportantDatesTray) {
@ -421,7 +420,6 @@ K5Dashboard.propTypes = {
hideGradesTabForStudents: PropTypes.bool,
selectedContextCodes: PropTypes.arrayOf(PropTypes.string),
selectedContextsLimit: PropTypes.number.isRequired,
parentSupportEnabled: PropTypes.bool.isRequired,
observedUsersList: ObservedUsersListShape.isRequired,
canAddObservee: PropTypes.bool.isRequired,
openTodosInNewTab: PropTypes.bool.isRequired

View File

@ -229,10 +229,7 @@ describe('ImportantDates', () => {
describe('Parent Support', () => {
beforeEach(() => {
global.ENV = {
current_user_id: currentUserId,
FEATURES: {
k5_parent_support: true
}
current_user_id: currentUserId
}
fetchMock.get(OBSERVER_ASSIGNMENTS_URL, JSON.stringify(MOCK_OBSERVEE_ASSIGNMENTS))
fetchMock.get(OBSERVER_EVENTS_URL, JSON.stringify(MOCK_OBSERVEE_EVENTS))

View File

@ -188,9 +188,8 @@ const defaultProps = {
hideGradesTabForStudents: false,
selectedContextCodes: ['course_1', 'course_3'],
selectedContextsLimit: 2,
parentSupportEnabled: false,
canAddObservee: false,
observedUsersList: MOCK_OBSERVED_USERS_LIST,
observedUsersList: [{id: currentUser.id, name: currentUser.display_name}],
openTodosInNewTab: true
}
function createPlannerMocks() {
@ -602,7 +601,6 @@ describe('K-5 Dashboard', () => {
{...defaultProps}
defaultTab="tab-schedule"
plannerEnabled
parentSupportEnabled
canAddObservee
currentUserRoles={['user', 'observer']}
observedUsersList={observedUsersList}
@ -782,9 +780,9 @@ describe('K-5 Dashboard', () => {
const {getByRole} = render(
<K5Dashboard
{...defaultProps}
parentSupportEnabled
canAddObservee
currentUserRoles={['user', 'observer']}
observedUsersList={MOCK_OBSERVED_USERS_LIST}
/>
)
const select = getByRole('combobox', {name: 'Select a student to view'})
@ -803,7 +801,7 @@ describe('K-5 Dashboard', () => {
{...defaultProps}
currentUserRoles={['user', 'observer', 'teacher']}
canAddObservee
parentSupportEnabled
observedUsersList={MOCK_OBSERVED_USERS_LIST}
/>
)
// let the dashboard execute all its queries and render
@ -832,8 +830,8 @@ describe('K-5 Dashboard', () => {
<K5Dashboard
{...defaultProps}
currentUserRoles={['user', 'observer', 'teacher']}
parentSupportEnabled
canAddObservee
observedUsersList={MOCK_OBSERVED_USERS_LIST}
/>
)
expect(await findByText('Economics 101')).toBeInTheDocument()
@ -889,7 +887,7 @@ describe('K-5 Dashboard', () => {
<K5Dashboard
{...defaultProps}
currentUserRoles={['user', 'observer', 'teacher']}
parentSupportEnabled
observedUsersList={MOCK_OBSERVED_USERS_LIST}
canAddObservee
plannerEnabled
/>

View File

@ -185,7 +185,7 @@ export default class Navigation extends React.Component {
// only retrive the courses for my observee
if (type === 'courses' && ENV.current_user_roles.includes('observer')) {
let forceLoad = false
const k5_observed_user_id = savedObservedId(ENV.current_user_id) // only returns a value if k5_parent_support is on
const k5_observed_user_id = savedObservedId(ENV.current_user_id)
if (k5_observed_user_id) {
url = `${url}&observed_user=${k5_observed_user_id}`
if (k5_observed_user_id !== this.state.observedUserId) {