From a92d556a34b8c8398f91917b6306154748fd2b9f Mon Sep 17 00:00:00 2001 From: Tamara Date: Fri, 24 Jan 2025 10:21:49 -0600 Subject: [PATCH 1/9] [tb/LEMS-2765/sorter-split] Create sorter public widget options function and type --- .../src/widgets/sorter/sorter-util.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 packages/perseus-core/src/widgets/sorter/sorter-util.ts diff --git a/packages/perseus-core/src/widgets/sorter/sorter-util.ts b/packages/perseus-core/src/widgets/sorter/sorter-util.ts new file mode 100644 index 0000000000..6d410f6bd8 --- /dev/null +++ b/packages/perseus-core/src/widgets/sorter/sorter-util.ts @@ -0,0 +1,25 @@ +import type {PerseusSorterWidgetOptions} from "@khanacademy/perseus-core"; + +/** + * For details on the individual options, see the + * PerseusSorterWidgetOptions type + */ +type SorterPublicWidgetOptions = { + 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 { + padding: options.padding, + layout: options.layout, + }; +} + +export default getSorterPublicWidgetOptions; From b661575b2aefff6852ddd4379f44ad70fc544b14 Mon Sep 17 00:00:00 2001 From: Tamara Date: Fri, 24 Jan 2025 10:22:04 -0600 Subject: [PATCH 2/9] [tb/LEMS-2765/sorter-split] Create test for public widget options function --- .../src/widgets/sorter/sorter-util.test.ts | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 packages/perseus-core/src/widgets/sorter/sorter-util.test.ts diff --git a/packages/perseus-core/src/widgets/sorter/sorter-util.test.ts b/packages/perseus-core/src/widgets/sorter/sorter-util.test.ts new file mode 100644 index 0000000000..b581b524b5 --- /dev/null +++ b/packages/perseus-core/src/widgets/sorter/sorter-util.test.ts @@ -0,0 +1,23 @@ +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: ["$0.005$ kilograms", "$15$ grams", "$55$ grams"], + layout: "horizontal", + padding: true, + }; + + // Act + const publicWidgetOptions = getSorterPublicWidgetOptions(options); + + // Assert + expect(publicWidgetOptions).toEqual({ + layout: "horizontal", + padding: true, + }); + }); +}); From 756f4e2046f1b1d2b92773f78db773f57837594d Mon Sep 17 00:00:00 2001 From: Tamara Date: Fri, 24 Jan 2025 10:22:39 -0600 Subject: [PATCH 3/9] [tb/LEMS-2765/sorter-split] Export the function from perseus-core --- packages/perseus-core/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/perseus-core/src/index.ts b/packages/perseus-core/src/index.ts index 81b6172cc8..14c06b8294 100644 --- a/packages/perseus-core/src/index.ts +++ b/packages/perseus-core/src/index.ts @@ -40,3 +40,4 @@ export type * from "./widgets/logic-export.types"; export {default as getOrdererPublicWidgetOptions} from "./widgets/orderer/orderer-util"; export {default as getCategorizerPublicWidgetOptions} from "./widgets/categorizer/categorizer-util"; export {default as getExpressionPublicWidgetOptions} from "./widgets/expression/expression-util"; +export {default as getSorterPublicWidgetOptions} from "./widgets/sorter/sorter-util"; From 77e630e350e6cbc45bdcc785bc555e5f8ea9ee04 Mon Sep 17 00:00:00 2001 From: Tamara Date: Fri, 24 Jan 2025 10:23:53 -0600 Subject: [PATCH 4/9] [tb/LEMS-2765/sorter-split] Add the function to sorter widget export --- packages/perseus/src/widgets/sorter/sorter.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/perseus/src/widgets/sorter/sorter.tsx b/packages/perseus/src/widgets/sorter/sorter.tsx index 46017d1b15..a3c768f7bf 100644 --- a/packages/perseus/src/widgets/sorter/sorter.tsx +++ b/packages/perseus/src/widgets/sorter/sorter.tsx @@ -1,3 +1,4 @@ +import getSorterPublicWidgetOptions from "@khanacademy/perseus-core/src/widgets/sorter/sorter-util"; import {linterContextDefault} from "@khanacademy/perseus-linter"; import {scoreSorter, validateSorter} from "@khanacademy/perseus-score"; import * as React from "react"; @@ -138,4 +139,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; From e15b1a5211cf2f2f4da5989dce38a35790d4b271 Mon Sep 17 00:00:00 2001 From: Tamara Date: Fri, 24 Jan 2025 10:24:20 -0600 Subject: [PATCH 5/9] [tb/LEMS-2765/sorter-split] Add to union type of all public widget option functions --- packages/perseus/src/types.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/perseus/src/types.ts b/packages/perseus/src/types.ts index f752f1417b..e33943be9e 100644 --- a/packages/perseus/src/types.ts +++ b/packages/perseus/src/types.ts @@ -15,6 +15,7 @@ import type { getOrdererPublicWidgetOptions, getCategorizerPublicWidgetOptions, getExpressionPublicWidgetOptions, + getSorterPublicWidgetOptions, } from "@khanacademy/perseus-core"; import type {LinterContextProps} from "@khanacademy/perseus-linter"; import type { @@ -543,7 +544,8 @@ export type WidgetScorerFunction = ( export type PublicWidgetOptionsFunction = | typeof getCategorizerPublicWidgetOptions | typeof getOrdererPublicWidgetOptions - | typeof getExpressionPublicWidgetOptions; + | typeof getExpressionPublicWidgetOptions + | typeof getSorterPublicWidgetOptions; export type WidgetExports< T extends React.ComponentType & Widget = React.ComponentType, From dc2055fe7f153774b87b1597b6b19908708de274 Mon Sep 17 00:00:00 2001 From: Tamara Date: Fri, 24 Jan 2025 10:26:46 -0600 Subject: [PATCH 6/9] [tb/LEMS-2765/sorter-split] Combine duplicate import statements --- packages/perseus/src/widgets/sorter/sorter.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/perseus/src/widgets/sorter/sorter.tsx b/packages/perseus/src/widgets/sorter/sorter.tsx index a3c768f7bf..22d3eaeaa6 100644 --- a/packages/perseus/src/widgets/sorter/sorter.tsx +++ b/packages/perseus/src/widgets/sorter/sorter.tsx @@ -1,4 +1,7 @@ -import getSorterPublicWidgetOptions from "@khanacademy/perseus-core/src/widgets/sorter/sorter-util"; +import { + type PerseusSorterWidgetOptions, + getSorterPublicWidgetOptions, +} from "@khanacademy/perseus-core"; import {linterContextDefault} from "@khanacademy/perseus-linter"; import {scoreSorter, validateSorter} from "@khanacademy/perseus-score"; import * as React from "react"; @@ -10,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 { PerseusSorterScoringData, PerseusSorterUserInput, From 8f3aa440775790dcf6ab1e3a1fa655592c72eed8 Mon Sep 17 00:00:00 2001 From: Tamara Date: Fri, 24 Jan 2025 10:27:37 -0600 Subject: [PATCH 7/9] [tb/LEMS-2765/sorter-split] docs(changeset): Implement a widget export function to filter out rubric data from widget options for the Sorter widget --- .changeset/beige-glasses-reflect.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/beige-glasses-reflect.md diff --git a/.changeset/beige-glasses-reflect.md b/.changeset/beige-glasses-reflect.md new file mode 100644 index 0000000000..ed497801ad --- /dev/null +++ b/.changeset/beige-glasses-reflect.md @@ -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 From a1c36307ec10769d7927aec0ff9ef1d473052a4b Mon Sep 17 00:00:00 2001 From: Tamara Date: Tue, 28 Jan 2025 11:09:34 -0600 Subject: [PATCH 8/9] [tb/LEMS-2765/sorter-split] Update expect to have sorted options --- packages/perseus-core/src/widgets/sorter/sorter-util.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/perseus-core/src/widgets/sorter/sorter-util.test.ts b/packages/perseus-core/src/widgets/sorter/sorter-util.test.ts index b581b524b5..b9128dac40 100644 --- a/packages/perseus-core/src/widgets/sorter/sorter-util.test.ts +++ b/packages/perseus-core/src/widgets/sorter/sorter-util.test.ts @@ -6,7 +6,7 @@ describe("getSorterPublicWidgetOptions", () => { it("should return the correct public options without any answer data", () => { // Arrange const options: PerseusSorterWidgetOptions = { - correct: ["$0.005$ kilograms", "$15$ grams", "$55$ grams"], + correct: ["$15$ grams", "$55$ grams", "$0.005$ kilograms"], layout: "horizontal", padding: true, }; @@ -16,6 +16,7 @@ describe("getSorterPublicWidgetOptions", () => { // Assert expect(publicWidgetOptions).toEqual({ + correct: ["$0.005$ kilograms", "$15$ grams", "$55$ grams"], layout: "horizontal", padding: true, }); From f3e2f19c8812250e5b35231e7cf2cdc079389a3c Mon Sep 17 00:00:00 2001 From: Tamara Date: Tue, 28 Jan 2025 11:12:59 -0600 Subject: [PATCH 9/9] [tb/LEMS-2765/sorter-split] Add back correct to public options but sorted Sorted to remove correct order information --- packages/perseus-core/src/widgets/sorter/sorter-util.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/perseus-core/src/widgets/sorter/sorter-util.ts b/packages/perseus-core/src/widgets/sorter/sorter-util.ts index 6d410f6bd8..e42bd7c033 100644 --- a/packages/perseus-core/src/widgets/sorter/sorter-util.ts +++ b/packages/perseus-core/src/widgets/sorter/sorter-util.ts @@ -5,6 +5,7 @@ import type {PerseusSorterWidgetOptions} from "@khanacademy/perseus-core"; * PerseusSorterWidgetOptions type */ type SorterPublicWidgetOptions = { + correct: PerseusSorterWidgetOptions["correct"]; padding: PerseusSorterWidgetOptions["padding"]; layout: PerseusSorterWidgetOptions["layout"]; }; @@ -17,6 +18,10 @@ 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, };