From 8489c6bb38e75c55c9dd1aca5391e6469e69e492 Mon Sep 17 00:00:00 2001 From: Ben Christel Date: Fri, 31 Jan 2025 11:27:58 -0800 Subject: [PATCH] [benc/split-number-line-widget] Create getNumberLinePublicWidgetOptions --- packages/perseus-core/src/index.ts | 1 + .../number-line/number-line-util.test.ts | 41 +++++++++++++++++++ .../widgets/number-line/number-line-util.ts | 24 +++++++++++ packages/perseus/src/types.ts | 4 +- .../src/widgets/number-line/number-line.tsx | 2 + 5 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 packages/perseus-core/src/widgets/number-line/number-line-util.test.ts create mode 100644 packages/perseus-core/src/widgets/number-line/number-line-util.ts diff --git a/packages/perseus-core/src/index.ts b/packages/perseus-core/src/index.ts index fd720226f41..b7b4a77cefc 100644 --- a/packages/perseus-core/src/index.ts +++ b/packages/perseus-core/src/index.ts @@ -117,3 +117,4 @@ export {default as getCategorizerPublicWidgetOptions} from "./widgets/categorize export {default as getCSProgramPublicWidgetOptions} from "./widgets/cs-program/cs-program-util"; export {default as getExpressionPublicWidgetOptions} from "./widgets/expression/expression-util"; export {default as getLabelImagePublicWidgetOptions} from "./widgets/label-image/label-image-util"; +export {default as getNumberLinePublicWidgetOptions} from "./widgets/number-line/number-line-util"; diff --git a/packages/perseus-core/src/widgets/number-line/number-line-util.test.ts b/packages/perseus-core/src/widgets/number-line/number-line-util.test.ts new file mode 100644 index 00000000000..32f9faf0059 --- /dev/null +++ b/packages/perseus-core/src/widgets/number-line/number-line-util.test.ts @@ -0,0 +1,41 @@ +import getNumberLinePublicWidgetOptions from "./number-line-util"; + +import type {PerseusNumberLineWidgetOptions} from "../../data-schema" + +describe("getNumberLinePublicWidgetOptions", () => { + it("removes correctX and correctRel", () => { + const options: PerseusNumberLineWidgetOptions = { + correctRel: "lt", + correctX: 42, + range: [0, 100], + numDivisions: 5, + tickStep: 6, + divisionRange: [], + initialX: 3, + labelRange: [], + labelStyle: "", + labelTicks: false, + snapDivisions: 0, + isTickCtrl: false, + showTooltips: false, + static: false, + }; + + const publicOptions = getNumberLinePublicWidgetOptions(options); + + expect(publicOptions).toEqual({ + range: [0, 100], + numDivisions: 5, + tickStep: 6, + divisionRange: [], + initialX: 3, + labelRange: [], + labelStyle: "", + labelTicks: false, + snapDivisions: 0, + isTickCtrl: false, + showTooltips: false, + static: false, + }) + }) +}) diff --git a/packages/perseus-core/src/widgets/number-line/number-line-util.ts b/packages/perseus-core/src/widgets/number-line/number-line-util.ts new file mode 100644 index 00000000000..0ee6f598f79 --- /dev/null +++ b/packages/perseus-core/src/widgets/number-line/number-line-util.ts @@ -0,0 +1,24 @@ +import type {PerseusNumberLineWidgetOptions} from "../../data-schema"; + +type NumberLinePublicWidgetOptions = Pick< + PerseusNumberLineWidgetOptions, + | "range" + | "labelRange" + | "labelStyle" + | "labelTicks" + | "isTickCtrl" + | "divisionRange" + | "numDivisions" + | "snapDivisions" + | "tickStep" + | "initialX" + | "showTooltips" + | "static" +>; + +export default function getNumberLinePublicWidgetOptions( + options: PerseusNumberLineWidgetOptions, +): NumberLinePublicWidgetOptions { + const {correctX: _, correctRel: __, ...publicOptions} = options; + return publicOptions; +} diff --git a/packages/perseus/src/types.ts b/packages/perseus/src/types.ts index acf60dd2aa7..b6744df98c1 100644 --- a/packages/perseus/src/types.ts +++ b/packages/perseus/src/types.ts @@ -17,6 +17,7 @@ import type { getCategorizerPublicWidgetOptions, getCSProgramPublicWidgetOptions, getExpressionPublicWidgetOptions, + getNumberLinePublicWidgetOptions, } from "@khanacademy/perseus-core"; import type {LinterContextProps} from "@khanacademy/perseus-linter"; import type { @@ -547,7 +548,8 @@ export type PublicWidgetOptionsFunction = | typeof getOrdererPublicWidgetOptions | typeof getExpressionPublicWidgetOptions | typeof getLabelImagePublicWidgetOptions - | typeof getCSProgramPublicWidgetOptions; + | typeof getCSProgramPublicWidgetOptions + | typeof getNumberLinePublicWidgetOptions; export type WidgetExports< T extends React.ComponentType & Widget = React.ComponentType, diff --git a/packages/perseus/src/widgets/number-line/number-line.tsx b/packages/perseus/src/widgets/number-line/number-line.tsx index 97924ff29d3..21a7257fe7a 100644 --- a/packages/perseus/src/widgets/number-line/number-line.tsx +++ b/packages/perseus/src/widgets/number-line/number-line.tsx @@ -1,4 +1,5 @@ import {number as knumber, KhanMath} from "@khanacademy/kmath"; +import {getNumberLinePublicWidgetOptions} from "@khanacademy/perseus-core"; import {scoreNumberLine, validateNumberLine} from "@khanacademy/perseus-score"; import * as React from "react"; import ReactDOM from "react-dom"; @@ -808,4 +809,5 @@ export default { // TODO(LEMS-2656): remove TS suppression // @ts-expect-error: Type 'UserInput' is not assignable to type 'PerseusNumberLineUserInput'. validator: validateNumberLine, + getPublicWidgetOptions: getNumberLinePublicWidgetOptions, } satisfies WidgetExports;