Skip to content

Commit

Permalink
[tb/LEMS-2761/matcher-split] Merge branch 'main' into tb/LEMS-2761/ma…
Browse files Browse the repository at this point in the history
…tcher-split

# Conflicts:
#	packages/perseus-core/src/index.ts
#	packages/perseus/src/types.ts
#	packages/perseus/src/widgets/sorter/sorter.tsx
  • Loading branch information
Myranae committed Jan 30, 2025
2 parents 8b39196 + 3c4c6bc commit 31aa314
Show file tree
Hide file tree
Showing 10 changed files with 143 additions and 2 deletions.
6 changes: 6 additions & 0 deletions .changeset/beige-glasses-reflect.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@khanacademy/perseus": minor
"@khanacademy/perseus-core": minor
---

Implement a widget export function to filter out rubric data from widget options for the Sorter widget
6 changes: 6 additions & 0 deletions .changeset/twelve-spies-lie.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@khanacademy/perseus": minor
"@khanacademy/perseus-core": minor
---

Implement a widget export function to filter out rubric data from widget options for the Dropdown widget
2 changes: 2 additions & 0 deletions packages/perseus-core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,8 @@ export {default as getOrdererPublicWidgetOptions} from "./widgets/orderer/ordere
export {default as getCategorizerPublicWidgetOptions} from "./widgets/categorizer/categorizer-util";
export {default as getExpressionPublicWidgetOptions} from "./widgets/expression/expression-util";
export {default as getLabelImagePublicWidgetOptions} from "./widgets/label-image/label-image-util";
export {default as getSorterPublicWidgetOptions} from "./widgets/sorter/sorter-util";
export {default as getDropdownPublicWidgetOptions} from "./widgets/dropdown/dropdown-util";
export {default as getMatcherPublicWidgetOptions} from "./widgets/matcher/matcher-util";
export {matcherShuffle} from "./widgets/matcher/matcher-util";
export {default as CoreUtil} from "./utils/util";
32 changes: 32 additions & 0 deletions packages/perseus-core/src/widgets/dropdown/dropdown-util.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import getDropdownPublicWidgetOptions from "./dropdown-util";

import type {PerseusDropdownWidgetOptions} from "../../data-schema";

describe("getDropdownPublicWidgetOptions", () => {
it("should return the correct public options without any answer data", () => {
// Arrange
const options: PerseusDropdownWidgetOptions = {
choices: [
{content: "1", correct: false},
{content: "2", correct: false},
{content: "3", correct: true},
],
placeholder: "Select an option",
static: false,
visibleLabel: "Test Label",
ariaLabel: "Test Aria Label",
};

// Act
const publicWidgetOptions = getDropdownPublicWidgetOptions(options);

// Assert
expect(publicWidgetOptions).toEqual({
choices: [{content: "1"}, {content: "2"}, {content: "3"}],
placeholder: "Select an option",
static: false,
visibleLabel: "Test Label",
ariaLabel: "Test Aria Label",
});
});
});
31 changes: 31 additions & 0 deletions packages/perseus-core/src/widgets/dropdown/dropdown-util.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import type {PerseusDropdownWidgetOptions} from "@khanacademy/perseus-core";

/**
* For details on the individual options, see the
* PerseusDropdownWidgetOptions type
*/
type DropdownPublicWidgetOptions = {
choices: ReadonlyArray<{content: string}>;
placeholder: PerseusDropdownWidgetOptions["placeholder"];
static: PerseusDropdownWidgetOptions["static"];
visibleLabel?: PerseusDropdownWidgetOptions["visibleLabel"];
ariaLabel?: PerseusDropdownWidgetOptions["ariaLabel"];
};

/**
* Given a PerseusDropdownWidgetOptions object, return a new object with only
* the public options that should be exposed to the client.
*/
function getDropdownPublicWidgetOptions(
options: PerseusDropdownWidgetOptions,
): DropdownPublicWidgetOptions {
return {
choices: options.choices.map((choice) => ({content: choice.content})),
placeholder: options.placeholder,
static: options.static,
visibleLabel: options.visibleLabel,
ariaLabel: options.ariaLabel,
};
}

export default getDropdownPublicWidgetOptions;
24 changes: 24 additions & 0 deletions packages/perseus-core/src/widgets/sorter/sorter-util.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import getSorterPublicWidgetOptions from "./sorter-util";

import type {PerseusSorterWidgetOptions} from "../../data-schema";

describe("getSorterPublicWidgetOptions", () => {
it("should return the correct public options without any answer data", () => {
// Arrange
const options: PerseusSorterWidgetOptions = {
correct: ["$15$ grams", "$55$ grams", "$0.005$ kilograms"],
layout: "horizontal",
padding: true,
};

// Act
const publicWidgetOptions = getSorterPublicWidgetOptions(options);

// Assert
expect(publicWidgetOptions).toEqual({
correct: ["$0.005$ kilograms", "$15$ grams", "$55$ grams"],
layout: "horizontal",
padding: true,
});
});
});
30 changes: 30 additions & 0 deletions packages/perseus-core/src/widgets/sorter/sorter-util.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import type {PerseusSorterWidgetOptions} from "@khanacademy/perseus-core";

/**
* For details on the individual options, see the
* PerseusSorterWidgetOptions type
*/
type SorterPublicWidgetOptions = {
correct: PerseusSorterWidgetOptions["correct"];
padding: PerseusSorterWidgetOptions["padding"];
layout: PerseusSorterWidgetOptions["layout"];
};

/**
* Given a PerseusSorterWidgetOptions object, return a new object with only
* the public options that should be exposed to the client.
*/
function getSorterPublicWidgetOptions(
options: PerseusSorterWidgetOptions,
): SorterPublicWidgetOptions {
return {
// Note(Tamara): This does not provide correct answer information any longer.
// To maintain compatibility with the original widget options, we are
// keeping the key the same. Represents initial state of the cards here.
correct: options.correct.slice().sort(),
padding: options.padding,
layout: options.layout,
};
}

export default getSorterPublicWidgetOptions;
6 changes: 5 additions & 1 deletion packages/perseus/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import type {
getOrdererPublicWidgetOptions,
getCategorizerPublicWidgetOptions,
getExpressionPublicWidgetOptions,
getSorterPublicWidgetOptions,
getDropdownPublicWidgetOptions,
getMatcherPublicWidgetOptions,
} from "@khanacademy/perseus-core";
import type {LinterContextProps} from "@khanacademy/perseus-linter";
Expand Down Expand Up @@ -544,10 +546,12 @@ export type WidgetScorerFunction = (
*/
export type PublicWidgetOptionsFunction =
| typeof getMatcherPublicWidgetOptions
| typeof getDropdownPublicWidgetOptions
| typeof getCategorizerPublicWidgetOptions
| typeof getOrdererPublicWidgetOptions
| typeof getExpressionPublicWidgetOptions
| typeof getLabelImagePublicWidgetOptions;
| typeof getLabelImagePublicWidgetOptions
| typeof getSorterPublicWidgetOptions;

export type WidgetExports<
T extends React.ComponentType<any> & Widget = React.ComponentType<any>,
Expand Down
2 changes: 2 additions & 0 deletions packages/perseus/src/widgets/dropdown/dropdown.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import {getDropdownPublicWidgetOptions} from "@khanacademy/perseus-core";
import {scoreDropdown, validateDropdown} from "@khanacademy/perseus-score";
import {Id, View} from "@khanacademy/wonder-blocks-core";
import {SingleSelect, OptionItem} from "@khanacademy/wonder-blocks-dropdown";
Expand Down Expand Up @@ -176,4 +177,5 @@ export default {
// TODO(LEMS-2656): remove TS suppression
// @ts-expect-error: Type 'UserInput' is not assignable to type 'PerseusDropdownUserInput'.
validator: validateDropdown,
getPublicWidgetOptions: getDropdownPublicWidgetOptions,
} satisfies WidgetExports<typeof Dropdown>;
6 changes: 5 additions & 1 deletion packages/perseus/src/widgets/sorter/sorter.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import {
type PerseusSorterWidgetOptions,
getSorterPublicWidgetOptions,
} from "@khanacademy/perseus-core";
import {CoreUtil} from "@khanacademy/perseus-core";
import {linterContextDefault} from "@khanacademy/perseus-linter";
import {scoreSorter, validateSorter} from "@khanacademy/perseus-score";
Expand All @@ -9,7 +13,6 @@ import {getPromptJSON as _getPromptJSON} from "../../widget-ai-utils/sorter/sort
import type {SortableOption} from "../../components/sortable";
import type {Widget, WidgetExports, WidgetProps} from "../../types";
import type {SorterPromptJSON} from "../../widget-ai-utils/sorter/sorter-ai-utils";
import type {PerseusSorterWidgetOptions} from "@khanacademy/perseus-core";
import type {
PerseusSorterRubric,
PerseusSorterUserInput,
Expand Down Expand Up @@ -138,4 +141,5 @@ export default {
// TODO(LEMS-2656): remove TS suppression
// @ts-expect-error: Type UserInput is not assignable to type PerseusSorterUserInput
validator: validateSorter,
getPublicWidgetOptions: getSorterPublicWidgetOptions,
} satisfies WidgetExports<typeof Sorter>;

0 comments on commit 31aa314

Please sign in to comment.