Skip to content

Commit 5fe2676

Browse files
authored
Maintain font size in grading view using localStorage (#7525)
1 parent dedc070 commit 5fe2676

File tree

3 files changed

+51
-1
lines changed

3 files changed

+51
-1
lines changed

Changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
### ✨ New features and improvements
88
- Improved layout and labeling in the assignment settings form for both standard and timed assessments. (#7531)
99
- Improved Assignment view for students (#7533)
10+
- Maintain font size in grading view (#7525)
1011

1112
### 🐛 Bug fixes
1213

app/javascript/Components/Result/text_viewer.jsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,19 @@ export class TextViewer extends React.PureComponent {
3737
componentDidMount() {
3838
this.highlight_root = this.raw_content.current.parentNode;
3939

40+
let textViewerFontSize = localStorage.getItem("text_viewer_font_size");
41+
if (textViewerFontSize !== null) {
42+
try {
43+
if (isNaN(textViewerFontSize) || textViewerFontSize.trim() === "") {
44+
throw new Error("Local storage item 'text_viewer_font_size' is not a number.");
45+
}
46+
this.setState({font_size: Number(textViewerFontSize)});
47+
} catch (error) {
48+
localStorage.removeItem("text_viewer_font_size");
49+
console.error("An error occurred:", error.message);
50+
}
51+
}
52+
4053
// Fetch content from a URL if it is passed as a prop. The URL should point to plaintext data.
4154
if (this.props.url) {
4255
this.props.setLoadingCallback(true);
@@ -178,7 +191,9 @@ export class TextViewer extends React.PureComponent {
178191
};
179192

180193
change_font_size = delta => {
181-
this.setState({font_size: Math.max(this.state.font_size + delta, 0.25)});
194+
let font_size = Math.max(this.state.font_size + delta, 0.25);
195+
this.setState({font_size: font_size});
196+
localStorage.setItem("text_viewer_font_size", font_size);
182197
};
183198

184199
display_annotation = annotation => {

app/javascript/Components/__tests__/text_viewer.test.jsx

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ import React from "react";
22
import {render, screen, waitFor} from "@testing-library/react";
33
import {TextViewer} from "../Result/text_viewer";
44
import fetchMock from "jest-fetch-mock";
5+
import userEvent from "@testing-library/user-event";
56
import {BinaryViewer} from "../Result/binary_viewer";
67

78
describe("TextViewer", () => {
89
const successfulFetchResp = "File content";
910
const loadingCallback = jest.fn();
1011
const errorCallback = jest.fn();
12+
const getItemMock = jest.spyOn(Storage.prototype, "getItem");
1113
const props = {
1214
annotations: [],
1315
focusLine: null,
@@ -21,6 +23,38 @@ describe("TextViewer", () => {
2123
fetchMock.resetMocks();
2224
});
2325

26+
it("should save font size to localStorage when font size change", async () => {
27+
jest.spyOn(Storage.prototype, "setItem");
28+
29+
render(<TextViewer {...props} />);
30+
userEvent.click(screen.getByText("+A"));
31+
32+
await waitFor(() => {
33+
expect(localStorage.setItem).toHaveBeenCalledWith("text_viewer_font_size", 1.25);
34+
});
35+
});
36+
37+
it("should remove local storage text_viewer_font_size when it is not a number", async () => {
38+
localStorage.setItem("text_viewer_font_size", "not a number");
39+
40+
render(<TextViewer {...props} />);
41+
42+
await waitFor(() => {
43+
expect(localStorage.getItem("text_viewer_font_size")).toBeNull();
44+
});
45+
});
46+
47+
it("should render using font size from localStorage", async () => {
48+
getItemMock.mockReturnValue("3");
49+
50+
const {container} = render(<TextViewer {...props} />);
51+
const element = container.querySelector(".line-numbers");
52+
53+
await waitFor(() => {
54+
expect(element).toHaveStyle("font-size: 3em");
55+
});
56+
});
57+
2458
it("should render its text content when the content ends with a new line", () => {
2559
render(<TextViewer {...props} content={"def f(n: int) -> int:\n return n + 1\n"} />);
2660

0 commit comments

Comments
 (0)