diff --git a/.changeset/fast-kids-attend.md b/.changeset/fast-kids-attend.md new file mode 100644 index 0000000000..2173ba9c03 --- /dev/null +++ b/.changeset/fast-kids-attend.md @@ -0,0 +1,7 @@ +--- +"@khanacademy/perseus-core": minor +"@khanacademy/perseus": patch +"@khanacademy/perseus-editor": patch +--- + +Move Passage widgets upgrade logic to Perseus Core diff --git a/packages/perseus-core/src/index.ts b/packages/perseus-core/src/index.ts index a9c9e71cce..044e55296d 100644 --- a/packages/perseus-core/src/index.ts +++ b/packages/perseus-core/src/index.ts @@ -36,6 +36,12 @@ export {default as expressionLogic} from "./widgets/expression"; export type {ExpressionDefaultWidgetOptions} from "./widgets/expression"; export {default as measurerLogic} from "./widgets/measurer"; export type {MeasurerDefaultWidgetOptions} from "./widgets/measurer"; +export {default as passageLogic} from "./widgets/passage"; +export type {PassageDefaultWidgetOptions} from "./widgets/passage"; +export {default as passageRefLogic} from "./widgets/passage-ref"; +export type {PassageRefDefaultWidgetOptions} from "./widgets/passage-ref"; +export {default as passageRefTargetLogic} from "./widgets/passage-ref-target"; +export type {PassageRefTargetDefaultWidgetOptions} from "./widgets/passage-ref-target"; export {default as radioLogic} from "./widgets/radio"; export type {RadioDefaultWidgetOptions} from "./widgets/radio"; diff --git a/packages/perseus-core/src/widgets/passage-ref-target/index.ts b/packages/perseus-core/src/widgets/passage-ref-target/index.ts new file mode 100644 index 0000000000..b204baf665 --- /dev/null +++ b/packages/perseus-core/src/widgets/passage-ref-target/index.ts @@ -0,0 +1,18 @@ +import type {PerseusPassageRefTargetWidgetOptions} from "../../data-schema"; +import type {WidgetLogic} from "../logic-export.types"; + +export type PassageRefTargetDefaultWidgetOptions = Pick< + PerseusPassageRefTargetWidgetOptions, + "content" +>; + +const defaultWidgetOptions: PassageRefTargetDefaultWidgetOptions = { + content: "", +}; + +const passageRefTargetWidgetLogic: WidgetLogic = { + name: "passageRefTarget", + defaultWidgetOptions, +}; + +export default passageRefTargetWidgetLogic; diff --git a/packages/perseus-core/src/widgets/passage-ref/index.ts b/packages/perseus-core/src/widgets/passage-ref/index.ts new file mode 100644 index 0000000000..52d1b74a71 --- /dev/null +++ b/packages/perseus-core/src/widgets/passage-ref/index.ts @@ -0,0 +1,13 @@ +import {currentVersion, defaultWidgetOptions} from "./passage-ref-upgrade"; + +import type {WidgetLogic} from "../logic-export.types"; + +export type {PassageRefDefaultWidgetOptions} from "./passage-ref-upgrade"; + +const passageRefWidgetLogic: WidgetLogic = { + name: "passageRef", + version: currentVersion, + defaultWidgetOptions: defaultWidgetOptions, +}; + +export default passageRefWidgetLogic; diff --git a/packages/perseus-core/src/widgets/passage-ref/passage-ref-upgrade.ts b/packages/perseus-core/src/widgets/passage-ref/passage-ref-upgrade.ts new file mode 100644 index 0000000000..9588dc0633 --- /dev/null +++ b/packages/perseus-core/src/widgets/passage-ref/passage-ref-upgrade.ts @@ -0,0 +1,14 @@ +import type {PerseusPassageRefWidgetOptions} from "../../data-schema"; + +export const currentVersion = {major: 0, minor: 1}; + +export type PassageRefDefaultWidgetOptions = Pick< + PerseusPassageRefWidgetOptions, + "passageNumber" | "referenceNumber" | "summaryText" +>; + +export const defaultWidgetOptions: PassageRefDefaultWidgetOptions = { + passageNumber: 1, + referenceNumber: 1, + summaryText: "", +}; diff --git a/packages/perseus-core/src/widgets/passage/index.ts b/packages/perseus-core/src/widgets/passage/index.ts new file mode 100644 index 0000000000..98b0cd9f22 --- /dev/null +++ b/packages/perseus-core/src/widgets/passage/index.ts @@ -0,0 +1,21 @@ +import type {PerseusPassageWidgetOptions} from "../../data-schema"; +import type {WidgetLogic} from "../logic-export.types"; + +export type PassageDefaultWidgetOptions = Pick< + PerseusPassageWidgetOptions, + "passageTitle" | "passageText" | "footnotes" | "showLineNumbers" +>; + +const defaultWidgetOptions: PassageDefaultWidgetOptions = { + passageTitle: "", + passageText: "", + footnotes: "", + showLineNumbers: true, +}; + +const passageWidgetLogic: WidgetLogic = { + name: "passage", + defaultWidgetOptions, +}; + +export default passageWidgetLogic; diff --git a/packages/perseus-editor/src/widgets/passage-editor.tsx b/packages/perseus-editor/src/widgets/passage-editor.tsx index c0755a1b32..824a687f05 100644 --- a/packages/perseus-editor/src/widgets/passage-editor.tsx +++ b/packages/perseus-editor/src/widgets/passage-editor.tsx @@ -1,4 +1,5 @@ import {components, Changeable, EditorJsonify} from "@khanacademy/perseus"; +import {passageLogic} from "@khanacademy/perseus-core"; import {Checkbox} from "@khanacademy/wonder-blocks-form"; import PropTypes from "prop-types"; import * as React from "react"; @@ -6,6 +7,8 @@ import _ from "underscore"; import Editor from "../editor"; +import type {PassageDefaultWidgetOptions} from "@khanacademy/perseus-core"; + const {InfoTip} = components; type Props = any; @@ -21,12 +24,8 @@ class PassageEditor extends React.Component { static widgetName = "passage" as const; - static defaultProps: Props = { - passageTitle: "", - passageText: "", - footnotes: "", - showLineNumbers: true, - }; + static defaultProps: PassageDefaultWidgetOptions = + passageLogic.defaultWidgetOptions; change: (arg1: any, arg2: any, arg3: any) => any = (...args) => { return Changeable.change.apply(this, args); diff --git a/packages/perseus-editor/src/widgets/passage-ref-editor.tsx b/packages/perseus-editor/src/widgets/passage-ref-editor.tsx index 4f9ac43b67..79bd1ee272 100644 --- a/packages/perseus-editor/src/widgets/passage-ref-editor.tsx +++ b/packages/perseus-editor/src/widgets/passage-ref-editor.tsx @@ -1,8 +1,11 @@ /* eslint-disable @khanacademy/ts-no-error-suppressions */ import {components, Changeable, EditorJsonify} from "@khanacademy/perseus"; +import {passageRefLogic} from "@khanacademy/perseus-core"; import PropTypes from "prop-types"; import * as React from "react"; +import type {PassageRefDefaultWidgetOptions} from "@khanacademy/perseus-core"; + const {InfoTip, NumberInput, TextInput} = components; type Props = any; @@ -17,11 +20,8 @@ class PassageRefEditor extends React.Component { static widgetName = "passage-ref" as const; - static defaultProps: Props = { - passageNumber: 1, - referenceNumber: 1, - summaryText: "", - }; + static defaultProps: PassageRefDefaultWidgetOptions = + passageRefLogic.defaultWidgetOptions; change: (arg1: any, arg2: any, arg3: any) => any = (...args) => { return Changeable.change.apply(this, args); diff --git a/packages/perseus-editor/src/widgets/passage-ref-target-editor.tsx b/packages/perseus-editor/src/widgets/passage-ref-target-editor.tsx index 3ef0024ea0..8265e6c535 100644 --- a/packages/perseus-editor/src/widgets/passage-ref-target-editor.tsx +++ b/packages/perseus-editor/src/widgets/passage-ref-target-editor.tsx @@ -1,4 +1,8 @@ import {Changeable, EditorJsonify} from "@khanacademy/perseus"; +import { + passageRefTargetLogic, + type PassageRefTargetDefaultWidgetOptions, +} from "@khanacademy/perseus-core"; import PropTypes from "prop-types"; import * as React from "react"; import _ from "underscore"; @@ -13,9 +17,8 @@ class PassageRefTargetEditor extends React.Component { static widgetName = "passage-ref-target" as const; - static defaultProps: Props = { - content: "", - }; + static defaultProps: PassageRefTargetDefaultWidgetOptions = + passageRefTargetLogic.defaultWidgetOptions; change: (arg1: any, arg2: any, arg3: any) => any = (...args) => { return Changeable.change.apply(this, args); diff --git a/packages/perseus/src/widgets/interactive-graphs/interactive-graph-question-builder.ts b/packages/perseus/src/widgets/interactive-graphs/interactive-graph-question-builder.ts index 26e03de0ef..2fa43ae8d4 100644 --- a/packages/perseus/src/widgets/interactive-graphs/interactive-graph-question-builder.ts +++ b/packages/perseus/src/widgets/interactive-graphs/interactive-graph-question-builder.ts @@ -91,10 +91,6 @@ class InteractiveGraphQuestionBuilder { lockedFigures: this.lockedFigures, }, type: "interactive-graph", - version: { - major: 0, - minor: 0, - }, }, }, }; diff --git a/packages/perseus/src/widgets/mock-widgets/mock-asset-loading-widget.tsx b/packages/perseus/src/widgets/mock-widgets/mock-asset-loading-widget.tsx index 8a8dc69cfe..38608404fa 100644 --- a/packages/perseus/src/widgets/mock-widgets/mock-asset-loading-widget.tsx +++ b/packages/perseus/src/widgets/mock-widgets/mock-asset-loading-widget.tsx @@ -18,7 +18,6 @@ export const mockedAssetItem: PerseusItem = { static: false, graded: true, options: Object.freeze({value: ""}), - version: {major: 1, minor: 0}, }, }, }, diff --git a/packages/perseus/src/widgets/passage-ref-target/passage-ref-target.tsx b/packages/perseus/src/widgets/passage-ref-target/passage-ref-target.tsx index d19c3a37c8..5565aa5c6e 100644 --- a/packages/perseus/src/widgets/passage-ref-target/passage-ref-target.tsx +++ b/packages/perseus/src/widgets/passage-ref-target/passage-ref-target.tsx @@ -67,7 +67,6 @@ export default { transform: (editorProps: any): any => { return _.pick(editorProps, "content"); }, - version: {major: 0, minor: 0}, isLintable: true, // TODO: things that aren't interactive shouldn't need scoring functions scorer: () => scoreNoop(), diff --git a/packages/perseus/src/widgets/passage-ref/passage-ref.tsx b/packages/perseus/src/widgets/passage-ref/passage-ref.tsx index 7df272a274..c7409a929b 100644 --- a/packages/perseus/src/widgets/passage-ref/passage-ref.tsx +++ b/packages/perseus/src/widgets/passage-ref/passage-ref.tsx @@ -1,3 +1,7 @@ +import { + passageRefLogic, + type PerseusPassageRefWidgetOptions, +} from "@khanacademy/perseus-core"; import * as React from "react"; import _ from "underscore"; @@ -10,7 +14,6 @@ import {isPassageWidget} from "../passage/utils"; import type {ChangeFn, Widget, WidgetExports, WidgetProps} from "../../types"; import type {PassageRefPromptJSON} from "../../widget-ai-utils/passage-ref/passage-ref-ai-utils"; -import type {PerseusPassageRefWidgetOptions} from "@khanacademy/perseus-core"; import type {PropsFor} from "@khanacademy/wonder-blocks-core"; const EN_DASH = "\u2013"; @@ -185,7 +188,7 @@ export default { referenceNumber: widgetOptions.referenceNumber, summaryText: widgetOptions.summaryText, }), - version: {major: 0, minor: 1}, + version: passageRefLogic.version, // TODO: things that aren't interactive shouldn't need scoring functions scorer: () => scoreNoop(), } satisfies WidgetExports;