Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Locked Figure Labels] View locked function labels #1658

Merged
merged 11 commits into from
Sep 24, 2024
6 changes: 6 additions & 0 deletions .changeset/dry-parents-invite.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@khanacademy/perseus": minor
"@khanacademy/perseus-editor": minor
---

[Locked Figure Labels] Add/edit/delete locked ellipse labels
6 changes: 6 additions & 0 deletions .changeset/early-rivers-tell.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@khanacademy/perseus": minor
"@khanacademy/perseus-editor": minor
---

[Locked Figure Labels] View locked ellipse labels
6 changes: 6 additions & 0 deletions .changeset/modern-sheep-bathe.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@khanacademy/perseus": minor
"@khanacademy/perseus-editor": minor
---

[Locked Figure Labels] Add/edit/delete locked vector labels
6 changes: 6 additions & 0 deletions .changeset/spotty-days-burn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@khanacademy/perseus": minor
"@khanacademy/perseus-editor": minor
---

[Locked Figure Labels] View locked function labels
6 changes: 6 additions & 0 deletions .changeset/strange-houses-breathe.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@khanacademy/perseus": minor
"@khanacademy/perseus-editor": minor
---

[Locked Figure Labels] View locked vector labels
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ export const flags = {
"interactive-graph-locked-features-labels": true,
"locked-point-labels": true,
"locked-line-labels": true,
"locked-vector-labels": true,
"locked-ellipse-labels": true,
"locked-function-labels": true,
},
} satisfies APIOptions["flags"];

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,9 @@ export const MafsWithLockedFiguresCurrent = (): React.ReactElement => {
"interactive-graph-locked-features-labels": false,
"locked-point-labels": false,
"locked-line-labels": false,
"locked-vector-labels": false,
"locked-ellipse-labels": false,
"locked-function-labels": false,
},
},
}}
Expand All @@ -181,6 +184,9 @@ export const MafsWithLockedLabelsFlag = (): React.ReactElement => {
"interactive-graph-locked-features-labels": true,
"locked-point-labels": false,
"locked-line-labels": false,
"locked-vector-labels": false,
"locked-ellipse-labels": false,
"locked-function-labels": false,
},
},
}}
Expand All @@ -189,14 +195,6 @@ export const MafsWithLockedLabelsFlag = (): React.ReactElement => {
);
};

MafsWithLockedLabelsFlag.parameters = {
chromatic: {
// Disabling because this isn't visually testing anything on the
// initial load of the editor page.
disable: true,
},
};

export const MafsWithLockedPointLabelsFlag = (): React.ReactElement => {
return (
<EditorPageWithStorybookPreview
Expand All @@ -207,6 +205,9 @@ export const MafsWithLockedPointLabelsFlag = (): React.ReactElement => {
"interactive-graph-locked-features-labels": true,
"locked-point-labels": true,
"locked-line-labels": false,
"locked-vector-labels": false,
"locked-ellipse-labels": false,
"locked-function-labels": false,
},
},
}}
Expand All @@ -215,14 +216,6 @@ export const MafsWithLockedPointLabelsFlag = (): React.ReactElement => {
);
};

MafsWithLockedPointLabelsFlag.parameters = {
chromatic: {
// Disabling because this isn't visually testing anything on the
// initial load of the editor page.
disable: true,
},
};

export const MafsWithLockedLineLabelsFlag = (): React.ReactElement => {
return (
<EditorPageWithStorybookPreview
Expand All @@ -233,6 +226,9 @@ export const MafsWithLockedLineLabelsFlag = (): React.ReactElement => {
"interactive-graph-locked-features-labels": true,
"locked-point-labels": false,
"locked-line-labels": true,
"locked-vector-labels": false,
"locked-ellipse-labels": false,
"locked-function-labels": false,
},
},
}}
Expand All @@ -241,12 +237,73 @@ export const MafsWithLockedLineLabelsFlag = (): React.ReactElement => {
);
};

MafsWithLockedLineLabelsFlag.parameters = {
chromatic: {
// Disabling because this isn't visually testing anything on the
// initial load of the editor page.
disable: true,
},
export const MafsWithLockedVectorLabelsFlag = (): React.ReactElement => {
return (
<EditorPageWithStorybookPreview
apiOptions={{
flags: {
mafs: {
...flags.mafs,
"interactive-graph-locked-features-labels": true,
"locked-point-labels": false,
"locked-line-labels": false,
"locked-vector-labels": true,
"locked-ellipse-labels": false,
"locked-function-labels": false,
},
},
}}
question={segmentWithLockedFigures}
/>
);
};

export const MafsWithLockedEllipseLabelsFlag = (): React.ReactElement => {
return (
<EditorPageWithStorybookPreview
apiOptions={{
flags: {
mafs: {
...flags.mafs,
"interactive-graph-locked-features-labels": true,
"locked-point-labels": false,
"locked-line-labels": false,
"locked-vector-labels": false,
"locked-ellipse-labels": true,
"locked-function-labels": false,
},
},
}}
question={segmentWithLockedFigures}
/>
);
};

export const MafsWithLockedFunctionLabelsFlag = (): React.ReactElement => {
return (
<EditorPageWithStorybookPreview
apiOptions={{
flags: {
mafs: {
...flags.mafs,
"interactive-graph-locked-features-labels": true,
"locked-point-labels": false,
"locked-line-labels": false,
"locked-vector-labels": false,
"locked-ellipse-labels": false,
"locked-function-labels": true,
},
},
}}
question={segmentWithLockedFigures}
/>
);
};

export const MafsWithLockedFigureLabelsAllFlags = (): React.ReactElement => {
return (
<EditorPageWithStorybookPreview question={segmentWithLockedFigures} />
);
};

export const WithSaveWarnings = (): React.ReactElement => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,29 @@ import {render, screen} from "@testing-library/react";
import {userEvent as userEventLib} from "@testing-library/user-event";
import * as React from "react";

import {flags} from "../../../__stories__/flags-for-api-options";

import LockedEllipseSettings from "./locked-ellipse-settings";
import {getDefaultFigureForType} from "./util";

import type {UserEvent} from "@testing-library/user-event";

const defaultProps = {
flags: {
...flags,
mafs: {
...flags.mafs,
"locked-ellipse-settings": true,
},
},
...getDefaultFigureForType("ellipse"),
onChangeProps: () => {},
onMove: () => {},
onRemove: () => {},
};

const defaultLabel = getDefaultFigureForType("label");

describe("LockedEllipseSettings", () => {
let userEvent: UserEvent;
beforeEach(() => {
Expand Down Expand Up @@ -138,4 +149,172 @@ describe("LockedEllipseSettings", () => {
// Assert
expect(onToggle).toHaveBeenCalled();
});

describe("Labels", () => {
test("Updates the label coords when the ellipse center change", async () => {
// Arrange
const onChangeProps = jest.fn();
render(
<LockedEllipseSettings
{...defaultProps}
center={[1, 1]}
labels={[
{
...defaultLabel,
coord: [1, 1],
},
]}
onChangeProps={onChangeProps}
/>,
{wrapper: RenderStateRoot},
);

// Act
const point1XInput = screen.getAllByLabelText("x coord")[0];
// Change the x coord of the second point to 20
await userEvent.type(point1XInput, "0");

// Assert
expect(onChangeProps).toHaveBeenCalledWith({
center: [10, 1],
labels: [
{
...defaultLabel,
coord: [10, 1],
},
],
});
});

test("Updates the label color when the ellipse color changes", async () => {
// Arrange
const onChangeProps = jest.fn();
render(
<LockedEllipseSettings
{...defaultProps}
color="green"
labels={[
{
...defaultLabel,
color: "green",
},
]}
onChangeProps={onChangeProps}
/>,
{wrapper: RenderStateRoot},
);

// Act
const colorSelect = screen.getByLabelText("color");
await userEvent.click(colorSelect);
const colorOption = screen.getByText("pink");
await userEvent.click(colorOption);

// Assert
expect(onChangeProps).toHaveBeenCalledWith({
color: "pink",
labels: [
{
...defaultLabel,
color: "pink",
},
],
});
});

test("Updates the label when the label text changes", async () => {
// Arrange
const onChangeProps = jest.fn();
render(
<LockedEllipseSettings
{...defaultProps}
labels={[
{
...defaultLabel,
text: "label text",
},
]}
onChangeProps={onChangeProps}
/>,
{wrapper: RenderStateRoot},
);

// Act
const labelText = screen.getByLabelText("TeX");
await userEvent.type(labelText, "!");

// Assert
expect(onChangeProps).toHaveBeenCalledWith({
labels: [{...defaultLabel, text: "label text!"}],
});
});

test("Removes label when delete button is clicked", async () => {
// Arrange
const onChangeProps = jest.fn();
render(
<LockedEllipseSettings
{...defaultProps}
labels={[
{
...defaultLabel,
text: "label text",
},
]}
onChangeProps={onChangeProps}
/>,
{wrapper: RenderStateRoot},
);

// Act
const deleteButton = screen.getByRole("button", {
name: "Delete locked label",
});
await userEvent.click(deleteButton);

// Assert
expect(onChangeProps).toHaveBeenCalledWith({
labels: [],
});
});

test("Adds a new label when the add label button is clicked", async () => {
// Arrange
const onChangeProps = jest.fn();
render(
<LockedEllipseSettings
{...defaultProps}
labels={[
{
...defaultLabel,
text: "label text",
},
]}
onChangeProps={onChangeProps}
/>,
{wrapper: RenderStateRoot},
);

// Act
const addLabelButton = screen.getByRole("button", {
name: "Add visible label",
});
await userEvent.click(addLabelButton);

// Assert
expect(onChangeProps).toHaveBeenCalledWith({
labels: [
{
...defaultLabel,
text: "label text",
},
{
...defaultLabel,
// One unit down vertically from the first label.
coord: [0, -1],
},
],
});
});
});
});
Loading
Loading