Add sticky footer to account and course.

closes OUT-6263 OUT-6336
flag=none

Test Plan
- Navigate to account settings  and verify a sticky footer
- Navigate to course settings and verify a sticky footer

Change-Id: Ia6ecf5f7c3179d51c42a6724309be63f3d0ab1b8
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/347067
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Angela Gomba <angela.gomba@instructure.com>
QA-Review: Angela Gomba <angela.gomba@instructure.com>
Product-Review: Kyle Rosenbaum <krosenbaum@instructure.com>
This commit is contained in:
davidwenzlick 2024-05-17 10:21:32 -04:00 committed by Kyle Rosenbaum
parent 284593172a
commit 83be46a9b0
5 changed files with 74 additions and 24 deletions

View File

@ -415,7 +415,22 @@ This is the standard form actions button bar at the bottom of every content form
@include clearfix(); // Adding clearfix to allow for .pull-right button containers
}
.sticky-footer {
background: #F5F5F5;
position: fixed;
z-index: 999;
right: 0;
left: 270px;
bottom: 0;
padding: 0;
}
.form-actions-sticky-footer {
text-align: direction(right);
padding: 10px 10px 11px;
border-top: 1px solid #C7CDD1;
@include clearfix(); // Adding clearfix to allow for .pull-right button containers
}
// HELP TEXT
// ---------

View File

@ -998,9 +998,11 @@ acknowledge that you have read and agreed to the
</fieldset>
<% end %>
<div class="button-container">
<button type="submit" class="Button Button--primary"><%= t(:update_settings_button, "Update Settings") %></button>
</div>
<footer class="sticky-footer">
<div class="form-actions-sticky-footer">
<button type="submit" class="Button Button--primary"><%= t(:update_settings_button, "Update Settings") %></button>
</div>
</footer>
<% end %>
</div>
<% end %>

View File

@ -712,19 +712,19 @@
</div>
</div>
<% if can_manage %>
<div class="form-row">
<div colspan="4">
<footer class="sticky-footer">
<div>
<% if Setting.get('cross_root_account_course_moves', 'false') == 'true' &&
Account.site_admin.grants_any_right?(@current_user, :manage_courses, :manage_courses_admin) && Account.root_accounts.length > 1 %>
<a href="#" class="move_course_link btn"><i class="icon-arrow-right"></i> <%= t('links.move_course', %{Move To Another Account}) %></a>
<% end %>
<span class="course_form">
<div class="form-actions">
<button type="submit" class="btn btn-primary"><%= t('buttons.update_course', %{Update Course Details}) %></button>
</div>
</span>
<span class="course_form">
<div class="form-actions-sticky-footer">
<button type="submit" class="btn btn-primary"><%= t('buttons.update_course', %{Update Course Details}) %></button>
</div>
</span>
</div>
</div>
</footer>
<% end %>
</div>
<% end %>

View File

@ -36,7 +36,9 @@ describe "root account basic settings" do
user_session(@admin)
get account_settings_url
f("#account_services_avatars").click
avatars = f("#account_services_avatars")
avatars.location_once_scrolled_into_view
avatars.click
f("#account_settings_enable_gravatar").click
submit_form("#account_settings")
@ -50,7 +52,9 @@ describe "root account basic settings" do
user_session(@admin)
get account_settings_url
f("#account_settings_kill_joy").click
el = f("#account_settings_kill_joy")
el.location_once_scrolled_into_view
el.click
submit_form("#account_settings")
wait_for_ajaximations
expect(Account.default.reload.settings[:kill_joy]).to be true
@ -69,7 +73,9 @@ describe "root account basic settings" do
get account_settings_url
# click then close restrict quantitative data helper dialog
fj("button:contains('About restrict quantitative data')").click
button = fj("button:contains('About restrict quantitative data')")
button.location_once_scrolled_into_view
button.click
expect(fj("div.ui-dialog-titlebar:contains('Restrict Quantitative Data')")).to be_present
force_click(".ui-dialog-titlebar-close")
@ -93,7 +99,9 @@ describe "root account basic settings" do
expect(is_checked("#account_settings_restrict_quantitative_data_locked")).to be_falsey
# restrict_quantitative_data true, then locked is enabled
f("#account_settings_restrict_quantitative_data_value").click
el = f("#account_settings_restrict_quantitative_data_value")
el.location_once_scrolled_into_view
el.click
expect(f("#account_settings_restrict_quantitative_data_locked")).to be_enabled
f("#account_settings_restrict_quantitative_data_locked").click
expect(is_checked("#account_settings_restrict_quantitative_data_locked")).to be_truthy
@ -118,7 +126,9 @@ describe "root account basic settings" do
user_session(@admin)
get account_settings_url
f("#account_settings_suppress_notifications").click
el = f("#account_settings_suppress_notifications")
el.location_once_scrolled_into_view
el.click
driver.switch_to.alert.accept
submit_form("#account_settings")
expect(Account.default.reload.settings[:suppress_notifications]).to be true
@ -130,6 +140,7 @@ describe "root account basic settings" do
user_session(@admin)
get account_settings_url
expect(is_checked(allow_observers_in_appointments_checkbox)).to be false
allow_observers_in_appointments_checkbox.location_once_scrolled_into_view
allow_observers_in_appointments_checkbox.click
expect_new_page_load { submit_form("#account_settings") }
expect(is_checked(allow_observers_in_appointments_checkbox)).to be true
@ -326,7 +337,9 @@ describe "root account basic settings" do
expect(account.settings[:ip_filters]).to be_present # should not have cleared them if we didn't do anything
filter = ff(".ip_filter").detect(&:displayed?)
filter.find_element(:css, ".delete_filter_link").click
el = filter.find_element(:css, ".delete_filter_link")
el.location_once_scrolled_into_view
el.click
expect_new_page_load { submit_form("#account_settings") }
@ -376,10 +389,20 @@ describe "root account basic settings" do
account.save!
get account_settings_url
f("input[type='radio'][name='account[settings][teachers_can_create_courses_anywhere]'][value='1'] + label").click
f("input[type='checkbox'][name='account[settings][students_can_create_courses]'] + label").click
f("input[type='radio'][name='account[settings][students_can_create_courses_anywhere]'][value='0'] + label").click
f("input[type='checkbox'][name='account[settings][no_enrollments_can_create_courses]'] + label").click
teacher = f("input[type='radio'][name='account[settings][teachers_can_create_courses_anywhere]'][value='1'] + label")
scroll_into_view(teacher)
teacher.click
student = f("input[type='checkbox'][name='account[settings][students_can_create_courses]'] + label")
scroll_into_view(student)
student.click
radio = f("input[type='radio'][name='account[settings][students_can_create_courses_anywhere]'][value='0'] + label")
scroll_into_view(radio)
radio.click
check = f("input[type='checkbox'][name='account[settings][no_enrollments_can_create_courses]'] + label")
scroll_into_view(check)
check.click
expect_new_page_load { submit_form("#account_settings") }
account.reload

View File

@ -73,7 +73,7 @@ describe "course settings" do
sync_checkbox = f(".sync_enrollments_from_homeroom_checkbox")
expect(sync_checkbox).to be_displayed
sync_checkbox.location_once_scrolled_into_view
sync_checkbox.click
homeroom_selection = f("#course_homeroom_course_id")
@ -186,6 +186,7 @@ describe "course settings" do
it "does not show archived grading schemes" do
get "/courses/#{@course.id}/settings"
scroll_into_view(".grading_standard_checkbox")
f(".grading_standard_checkbox").click unless is_checked(".grading_standard_checkbox")
f("[data-testid='grading-schemes-selector-dropdown']").click
expect(f("[data-testid='grading-schemes-selector-option-#{@active_grading_standard.id}']")).to include_text(@active_grading_standard.title)
@ -197,16 +198,19 @@ describe "course settings" do
get "/courses/#{@course.id}/settings"
f(".grading_standard_checkbox").click unless is_checked(".grading_standard_checkbox")
expect(f("[data-testid='grading-schemes-selector-dropdown']").attribute("value")).to eq(@archived_grading_standard.title)
scroll_into_view("[data-testid='grading-schemes-selector-dropdown']")
f("[data-testid='grading-schemes-selector-dropdown']").click
expect(f("[data-testid='grading-schemes-selector-option-#{@course.grading_standard.id}']")).to include_text(@course.grading_standard.title)
end
it "doesn't let you edit an account level grading scheme" do
get "/courses/#{@course.id}/settings"
scroll_into_view(".grading_standard_checkbox")
f(".grading_standard_checkbox").click unless is_checked(".grading_standard_checkbox")
f("[data-testid='grading-schemes-selector-dropdown']").click
expect(f("[data-testid='grading-schemes-selector-option-#{@account_grading_standard.id}']")).to include_text(@account_grading_standard.title)
f("[data-testid='grading-schemes-selector-option-#{@account_grading_standard.id}']").click
scroll_into_view("[data-testid='grading-schemes-selector-view-button']")
f("[data-testid='grading-schemes-selector-view-button']").click
wait_for_ajaximations
expect(f("[data-testid='grading-scheme-#{@account_grading_standard.id}-edit-button']").attribute("disabled")).to eq("true")
@ -216,8 +220,10 @@ describe "course settings" do
@course.update!(grading_standard_id: @active_grading_standard.id)
get "/courses/#{@course.id}/settings"
f(".grading_standard_checkbox").click unless is_checked(".grading_standard_checkbox")
scroll_into_view("[data-testid='grading-schemes-selector-dropdown']")
f("[data-testid='grading-schemes-selector-dropdown']").click
f("[data-testid='grading-schemes-selector-option-#{@course.grading_standard.id}']").click
scroll_into_view("[data-testid='grading-schemes-selector-view-button']")
f("[data-testid='grading-schemes-selector-view-button']").click
wait_for_ajaximations
f("[data-testid='grading-scheme-#{@course.grading_standard.id}-edit-button']").click
@ -234,6 +240,7 @@ describe "course settings" do
archived_gs2 = @course.grading_standards.create!(title: "Archived Grading Scheme 2", data: { "A" => 0.9, "F" => 0 }, scaling_factor: 1.0, points_based: false, workflow_state: "archived")
archived_gs3 = @course.grading_standards.create!(title: "Archived Grading Scheme 3", data: { "A" => 0.9, "F" => 0 }, scaling_factor: 1.0, points_based: false, workflow_state: "archived")
get "/courses/#{@course.id}/settings"
scroll_into_view(".grading_standard_checkbox")
f(".grading_standard_checkbox").click unless is_checked(".grading_standard_checkbox")
f("[data-testid='manage-all-grading-schemes-button']").click
wait_for_ajaximations
@ -259,7 +266,9 @@ describe "course settings" do
a.settings[:self_enrollment] = "manually_created"
a.save!
get "/courses/#{@course.id}/settings"
f("#course_self_enrollment").click
el = f("#course_self_enrollment")
el.location_once_scrolled_into_view
el.click
wait_for_ajaximations
wait_for_new_page_load { submit_form("#course_form") }
@ -299,6 +308,7 @@ describe "course settings" do
expect(is_checked(course_show_announcements_on_home_page)).not_to be_truthy
expect(home_page_announcement_limit).to be_disabled
course_show_announcements_on_home_page.location_once_scrolled_into_view
course_show_announcements_on_home_page.click
expect(home_page_announcement_limit).not_to be_disabled
end
@ -316,7 +326,7 @@ describe "course settings" do
caution_text = "Course Pacing is in active development."
course_paces_checkbox = f("#course_enable_course_paces")
course_paces_checkbox.location_once_scrolled_into_view
course_paces_checkbox.click
wait_for_ajaximations
expect(f(".course-paces-row")).to include_text caution_text