@khanacademy/perseus 65.3.7 → 65.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/index.js +52 -52
- package/dist/es/index.js.map +1 -1
- package/dist/hint-renderer.d.ts +6 -0
- package/dist/hints-renderer.d.ts +6 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +51 -51
- package/dist/index.js.map +1 -1
- package/dist/mixins/changeable.d.ts +14 -0
- package/dist/mixins/widget-prop-denylist.d.ts +5 -0
- package/dist/renderer.d.ts +23 -11
- package/dist/server-item-renderer.d.ts +10 -0
- package/dist/types.d.ts +47 -13
- package/dist/widget-ai-utils/number-line/number-line-ai-utils.d.ts +1 -1
- package/dist/widget-type-utils.d.ts +1 -1
- package/dist/widgets/categorizer/categorizer.d.ts +28 -10
- package/dist/widgets/cs-program/cs-program.d.ts +9 -5
- package/dist/widgets/definition/definition.d.ts +0 -1
- package/dist/widgets/dropdown/dropdown.d.ts +22 -9
- package/dist/widgets/explanation/explanation.d.ts +0 -1
- package/dist/widgets/expression/expression.d.ts +107 -11
- package/dist/widgets/free-response/free-response.d.ts +9 -7
- package/dist/widgets/graded-group-set/graded-group-set.d.ts +1 -3
- package/dist/widgets/grapher/grapher.d.ts +139 -14
- package/dist/widgets/grapher/util.d.ts +2 -2
- package/dist/widgets/group/group.d.ts +6 -0
- package/dist/widgets/iframe/iframe.d.ts +10 -8
- package/dist/widgets/image/image.d.ts +1 -2
- package/dist/widgets/input-number/input-number.d.ts +17 -6
- package/dist/widgets/interaction/interaction.d.ts +0 -2
- package/dist/widgets/interactive-graph.d.ts +101 -4
- package/dist/widgets/interactive-graphs/stateful-mafs-graph.d.ts +1 -1
- package/dist/widgets/interactive-graphs/types.d.ts +2 -2
- package/dist/widgets/label-image/label-image.d.ts +28 -8
- package/dist/widgets/matcher/matcher.d.ts +19 -7
- package/dist/widgets/matrix/matrix.d.ts +30 -18
- package/dist/widgets/mock-widgets/mock-widget.d.ts +89 -8
- package/dist/widgets/number-line/number-line.d.ts +108 -13
- package/dist/widgets/numeric-input/numeric-input.class.d.ts +93 -4
- package/dist/widgets/numeric-input/numeric-input.d.ts +1 -2
- package/dist/widgets/orderer/orderer.d.ts +15 -8
- package/dist/widgets/passage-ref/passage-ref.d.ts +1 -2
- package/dist/widgets/passage-ref-target/passage-ref-target.d.ts +1 -3
- package/dist/widgets/phet-simulation/phet-simulation.d.ts +1 -2
- package/dist/widgets/plotter/plotter.d.ts +105 -6
- package/dist/widgets/radio/radio-component.d.ts +1 -1
- package/dist/widgets/radio/radio.class.new.d.ts +1 -1
- package/dist/widgets/radio/radio.d.ts +4 -0
- package/dist/widgets/radio/radio.ff.d.ts +2 -2
- package/dist/widgets/radio/radio.new.d.ts +2 -2
- package/dist/widgets/sorter/sorter.d.ts +26 -9
- package/dist/widgets/table/table.d.ts +88 -5
- package/dist/widgets/video/video.d.ts +0 -1
- package/package.json +7 -7
|
@@ -6,7 +6,7 @@ import type { WidgetProps } from "../types";
|
|
|
6
6
|
import type { InteractiveGraphPromptJSON } from "../widget-ai-utils/interactive-graph/interactive-graph-ai-utils";
|
|
7
7
|
import type { UnsupportedWidgetPromptJSON } from "../widget-ai-utils/unsupported-widget";
|
|
8
8
|
import type { QuadraticCoefficient, SineCoefficient, Range } from "@khanacademy/kmath";
|
|
9
|
-
import type { PerseusGraphType, PerseusGraphTypeAngle, PerseusGraphTypePoint, PerseusGraphTypeSegment, GraphRange, LockedFigure, PerseusImageBackground, MarkingsType, PerseusInteractiveGraphUserInput, AxisLabelLocation } from "@khanacademy/perseus-core";
|
|
9
|
+
import type { PerseusGraphType, PerseusGraphTypeAngle, PerseusGraphTypePoint, PerseusGraphTypeSegment, GraphRange, InteractiveGraphPublicWidgetOptions, LockedFigure, PerseusImageBackground, MarkingsType, PerseusInteractiveGraphUserInput, AxisLabelLocation } from "@khanacademy/perseus-core";
|
|
10
10
|
type RenderProps = {
|
|
11
11
|
/**
|
|
12
12
|
* Where the little black axis lines & labels (ticks) should render.
|
|
@@ -106,7 +106,7 @@ type RenderProps = {
|
|
|
106
106
|
*/
|
|
107
107
|
fullGraphAriaDescription?: string;
|
|
108
108
|
};
|
|
109
|
-
type Props = WidgetProps<RenderProps>;
|
|
109
|
+
type Props = WidgetProps<RenderProps, PerseusInteractiveGraphUserInput>;
|
|
110
110
|
type State = any;
|
|
111
111
|
type DefaultProps = {
|
|
112
112
|
labels: string[];
|
|
@@ -117,13 +117,103 @@ type DefaultProps = {
|
|
|
117
117
|
markings: Props["markings"];
|
|
118
118
|
showTooltips: Props["showTooltips"];
|
|
119
119
|
showProtractor: Props["showProtractor"];
|
|
120
|
-
|
|
120
|
+
userInput: Props["userInput"];
|
|
121
121
|
};
|
|
122
122
|
declare class InteractiveGraph extends React.Component<Props, State> {
|
|
123
123
|
mafsRef: React.RefObject<StatefulMafsGraphType>;
|
|
124
124
|
static defaultProps: DefaultProps;
|
|
125
125
|
getUserInput(): PerseusInteractiveGraphUserInput;
|
|
126
126
|
getPromptJSON(): InteractiveGraphPromptJSON | UnsupportedWidgetPromptJSON;
|
|
127
|
+
/**
|
|
128
|
+
* @deprecated and likely very broken API
|
|
129
|
+
* [LEMS-3185] do not trust serializedState/restoreSerializedState
|
|
130
|
+
*/
|
|
131
|
+
getSerializedState(): {
|
|
132
|
+
graph: PerseusGraphType;
|
|
133
|
+
step: [number, number];
|
|
134
|
+
gridStep?: [x: number, y: number];
|
|
135
|
+
snapStep?: [x: number, y: number];
|
|
136
|
+
backgroundImage?: PerseusImageBackground;
|
|
137
|
+
markings: MarkingsType;
|
|
138
|
+
labels: string[];
|
|
139
|
+
labelLocation: AxisLabelLocation;
|
|
140
|
+
showProtractor: boolean;
|
|
141
|
+
showRuler?: boolean;
|
|
142
|
+
showTooltips?: boolean;
|
|
143
|
+
rulerLabel?: string;
|
|
144
|
+
rulerTicks?: number;
|
|
145
|
+
range: GraphRange;
|
|
146
|
+
correct?: PerseusGraphType;
|
|
147
|
+
lockedFigures: LockedFigure[];
|
|
148
|
+
fullGraphAriaLabel?: string;
|
|
149
|
+
fullGraphAriaDescription?: string;
|
|
150
|
+
reviewModeRubric?: Empty | null | undefined;
|
|
151
|
+
trackInteraction: (extraData?: Empty | undefined) => void;
|
|
152
|
+
widgetId: string;
|
|
153
|
+
alignment: string | null | undefined;
|
|
154
|
+
static: boolean | null | undefined;
|
|
155
|
+
problemNum: number | null | undefined;
|
|
156
|
+
apiOptions: Readonly<Readonly<{
|
|
157
|
+
isArticle?: boolean;
|
|
158
|
+
onFocusChange?: (newFocusPath: import("..").FocusPath, oldFocusPath: import("..").FocusPath, keypadHeight?: number, focusedElement?: HTMLElement) => unknown;
|
|
159
|
+
GroupMetadataEditor?: React.ComponentType<any>;
|
|
160
|
+
showAlignmentOptions?: boolean;
|
|
161
|
+
readOnly?: boolean;
|
|
162
|
+
answerableCallback?: (arg1: boolean) => unknown;
|
|
163
|
+
getAnotherHint?: () => unknown;
|
|
164
|
+
interactionCallback?: (widgetData: {
|
|
165
|
+
[widgetId: string]: any;
|
|
166
|
+
}) => void;
|
|
167
|
+
groupAnnotator?: (groupNumber: number, widgetId: string) => React.ReactNode;
|
|
168
|
+
imagePlaceholder?: React.ReactNode;
|
|
169
|
+
widgetPlaceholder?: React.ReactNode;
|
|
170
|
+
baseElements?: {
|
|
171
|
+
Link: React.ComponentType<any>;
|
|
172
|
+
};
|
|
173
|
+
imagePreloader?: (dimensions: import("../types").Dimensions) => React.ReactNode;
|
|
174
|
+
trackInteraction?: (args: {
|
|
175
|
+
type: string;
|
|
176
|
+
id: string;
|
|
177
|
+
correct?: boolean;
|
|
178
|
+
} & Partial<import("../types").TrackingGradedGroupExtraArguments> & Partial<{
|
|
179
|
+
visible: number;
|
|
180
|
+
}>) => void;
|
|
181
|
+
customKeypad?: boolean;
|
|
182
|
+
nativeKeypadProxy?: (blur: () => void) => import("@khanacademy/math-input").KeypadAPI;
|
|
183
|
+
isMobile?: boolean;
|
|
184
|
+
isMobileApp?: boolean;
|
|
185
|
+
setDrawingAreaAvailable?: (arg1: boolean) => unknown;
|
|
186
|
+
hintProgressColor?: string;
|
|
187
|
+
canScrollPage?: boolean;
|
|
188
|
+
editorChangeDelay?: number;
|
|
189
|
+
flags?: Record<"new-radio-widget", boolean>;
|
|
190
|
+
onWidgetStartProps?: (widgets: import("@khanacademy/perseus-core").PerseusWidgetsMap) => void;
|
|
191
|
+
}> & {
|
|
192
|
+
baseElements: NonNullable<import("..").APIOptions["baseElements"]>;
|
|
193
|
+
canScrollPage: NonNullable<import("..").APIOptions["canScrollPage"]>;
|
|
194
|
+
editorChangeDelay: NonNullable<import("..").APIOptions["editorChangeDelay"]>;
|
|
195
|
+
groupAnnotator: NonNullable<import("..").APIOptions["groupAnnotator"]>;
|
|
196
|
+
isArticle: NonNullable<import("..").APIOptions["isArticle"]>;
|
|
197
|
+
isMobile: NonNullable<import("..").APIOptions["isMobile"]>;
|
|
198
|
+
isMobileApp: NonNullable<import("..").APIOptions["isMobileApp"]>;
|
|
199
|
+
onFocusChange: NonNullable<import("..").APIOptions["onFocusChange"]>;
|
|
200
|
+
readOnly: NonNullable<import("..").APIOptions["readOnly"]>;
|
|
201
|
+
setDrawingAreaAvailable: NonNullable<import("..").APIOptions["setDrawingAreaAvailable"]>;
|
|
202
|
+
showAlignmentOptions: NonNullable<import("..").APIOptions["showAlignmentOptions"]>;
|
|
203
|
+
}>;
|
|
204
|
+
keypadElement?: any;
|
|
205
|
+
questionCompleted?: boolean;
|
|
206
|
+
onFocus: (blurPath: import("..").FocusPath) => void;
|
|
207
|
+
onBlur: (blurPath: import("..").FocusPath) => void;
|
|
208
|
+
findWidgets: (criterion: import("../types").FilterCriterion) => ReadonlyArray<import("../types").Widget>;
|
|
209
|
+
reviewMode: boolean;
|
|
210
|
+
showSolutions?: import("@khanacademy/perseus-core").ShowSolutions;
|
|
211
|
+
onChange: import("..").ChangeHandler;
|
|
212
|
+
handleUserInput: (newUserInput: PerseusGraphType, cb?: () => void, silent?: boolean) => void;
|
|
213
|
+
isLastUsedWidget: boolean;
|
|
214
|
+
linterContext: import("@khanacademy/perseus-linter").LinterContextProps;
|
|
215
|
+
containerSizeClass: import("../util/sizing-utils").SizeClass;
|
|
216
|
+
};
|
|
127
217
|
render(): React.JSX.Element;
|
|
128
218
|
/**
|
|
129
219
|
* @param {object} graph Like props.graph or props.correct
|
|
@@ -173,12 +263,19 @@ declare class InteractiveGraph extends React.Component<Props, State> {
|
|
|
173
263
|
static getRayEquationString(props: Props): string;
|
|
174
264
|
static getPolygonEquationString(props: Props): string;
|
|
175
265
|
static getAngleEquationString(props: Props): string;
|
|
176
|
-
static getUserInputFromProps(props: Props): PerseusGraphType;
|
|
177
266
|
}
|
|
267
|
+
/**
|
|
268
|
+
* @deprecated and likely a very broken API
|
|
269
|
+
* [LEMS-3185] do not trust serializedState/restoreSerializedState
|
|
270
|
+
*/
|
|
271
|
+
declare function getUserInputFromSerializedState(serializedState: any): PerseusInteractiveGraphUserInput;
|
|
272
|
+
declare function getStartUserInput(options: InteractiveGraphPublicWidgetOptions): PerseusGraphType;
|
|
178
273
|
declare const _default: {
|
|
179
274
|
name: string;
|
|
180
275
|
displayName: string;
|
|
181
276
|
widget: typeof InteractiveGraph;
|
|
182
277
|
staticTransform: <T>(value: T) => T;
|
|
278
|
+
getStartUserInput: typeof getStartUserInput;
|
|
279
|
+
getUserInputFromSerializedState: typeof getUserInputFromSerializedState;
|
|
183
280
|
};
|
|
184
281
|
export default _default;
|
|
@@ -16,7 +16,7 @@ export type StatefulMafsGraphProps = {
|
|
|
16
16
|
gridStep: [x: number, y: number];
|
|
17
17
|
containerSizeClass: InteractiveGraphProps["containerSizeClass"];
|
|
18
18
|
markings: InteractiveGraphProps["markings"];
|
|
19
|
-
onChange:
|
|
19
|
+
onChange: (userInput: PerseusGraphType) => void;
|
|
20
20
|
showTooltips: Required<InteractiveGraphProps["showTooltips"]>;
|
|
21
21
|
showProtractor: boolean;
|
|
22
22
|
labels: ReadonlyArray<string>;
|
|
@@ -2,10 +2,10 @@ import type { InteractiveGraphAction } from "./reducer/interactive-graph-action"
|
|
|
2
2
|
import type { Coord } from "../../interactive2/types";
|
|
3
3
|
import type { WidgetProps } from "../../types";
|
|
4
4
|
import type { QuadraticCoords } from "@khanacademy/kmath";
|
|
5
|
-
import type { PerseusInteractiveGraphWidgetOptions } from "@khanacademy/perseus-core";
|
|
5
|
+
import type { PerseusInteractiveGraphUserInput, PerseusInteractiveGraphWidgetOptions } from "@khanacademy/perseus-core";
|
|
6
6
|
import type { Interval, vec } from "mafs";
|
|
7
7
|
import type { ReactNode } from "react";
|
|
8
|
-
export type InteractiveGraphProps = WidgetProps<PerseusInteractiveGraphWidgetOptions>;
|
|
8
|
+
export type InteractiveGraphProps = WidgetProps<PerseusInteractiveGraphWidgetOptions, PerseusInteractiveGraphUserInput>;
|
|
9
9
|
export type Dispatch = (action: InteractiveGraphAction) => unknown;
|
|
10
10
|
export type MafsGraphProps<T extends InteractiveGraphState> = {
|
|
11
11
|
graphState: T;
|
|
@@ -11,7 +11,7 @@ import Marker from "./marker";
|
|
|
11
11
|
import type { DependencyProps } from "../../dependencies";
|
|
12
12
|
import type { Widget, WidgetProps } from "../../types";
|
|
13
13
|
import type { LabelImagePromptJSON } from "../../widget-ai-utils/label-image/label-image-ai-utils";
|
|
14
|
-
import type { InteractiveMarkerType, PerseusLabelImageWidgetOptions, PerseusLabelImageUserInput, ShowSolutions } from "@khanacademy/perseus-core";
|
|
14
|
+
import type { InteractiveMarkerType, PerseusLabelImageWidgetOptions, PerseusLabelImageUserInput, LabelImagePublicWidgetOptions, ShowSolutions, PerseusLabelImageUserInputMarker } from "@khanacademy/perseus-core";
|
|
15
15
|
type PreferredPopoverDirection = "NONE" | "UP" | "DOWN" | "LEFT" | "RIGHT";
|
|
16
16
|
/**
|
|
17
17
|
* Represents a direction vector.
|
|
@@ -37,7 +37,8 @@ export type OptionalAnswersMarkerType = Omit<InteractiveMarkerType, "answers"> &
|
|
|
37
37
|
type Options = Omit<PerseusLabelImageWidgetOptions, "markers"> & {
|
|
38
38
|
markers: ReadonlyArray<OptionalAnswersMarkerType>;
|
|
39
39
|
};
|
|
40
|
-
type Props = WidgetProps<Options> &
|
|
40
|
+
type Props = WidgetProps<Options, PerseusLabelImageUserInput> & {
|
|
41
|
+
analytics: DependencyProps["analytics"];
|
|
41
42
|
preferredPopoverDirection?: PreferredPopoverDirection;
|
|
42
43
|
};
|
|
43
44
|
type LabelImageState = {
|
|
@@ -46,14 +47,15 @@ type LabelImageState = {
|
|
|
46
47
|
hideAnswers: boolean;
|
|
47
48
|
};
|
|
48
49
|
/**
|
|
49
|
-
* Get marker with the appropriate selection state for current display mode.
|
|
50
|
+
* Get user input marker with the appropriate selection state for current display mode.
|
|
50
51
|
* When showing solutions, it auto-selects correct answers, or clears
|
|
51
52
|
* selections for markers without answers.
|
|
52
53
|
*
|
|
53
|
-
* @param marker - The marker
|
|
54
|
-
* @
|
|
54
|
+
* @param marker - The widget options marker (possibly with answer).
|
|
55
|
+
* @param userInputMarker - The user input marker (with user selection).
|
|
56
|
+
* @returns A modified version of user input, possibly with correct answer.
|
|
55
57
|
*/
|
|
56
|
-
export declare function
|
|
58
|
+
export declare function getComputedSelectedState(marker: OptionalAnswersMarkerType, userInputMarker: PerseusLabelImageUserInputMarker, reviewMode: boolean, showSolutions?: ShowSolutions): PerseusLabelImageUserInputMarker;
|
|
57
59
|
export declare class LabelImage extends React.Component<Props, LabelImageState> implements Widget {
|
|
58
60
|
static contextType: React.Context<import("../../components/i18n-context").I18nContextType>;
|
|
59
61
|
context: React.ContextType<typeof PerseusI18nContext>;
|
|
@@ -83,24 +85,42 @@ export declare class LabelImage extends React.Component<Props, LabelImageState>
|
|
|
83
85
|
constructor(props: Props);
|
|
84
86
|
componentDidMount(): void;
|
|
85
87
|
componentWillUnmount(): void;
|
|
88
|
+
/**
|
|
89
|
+
* TODO: remove this when everything is pulling from Renderer state
|
|
90
|
+
* @deprecated get user input from Renderer state
|
|
91
|
+
*/
|
|
86
92
|
getUserInput(): PerseusLabelImageUserInput;
|
|
87
93
|
getPromptJSON(): LabelImagePromptJSON;
|
|
88
|
-
handleMarkerChange(index: number, marker:
|
|
94
|
+
handleMarkerChange(index: number, marker: PerseusLabelImageUserInput["markers"][number]): void;
|
|
89
95
|
activateMarker(index: number, opened: boolean): void;
|
|
90
96
|
handleMarkerKeyDown(index: number, e: React.KeyboardEvent): void;
|
|
91
97
|
handleAnswerChoicesChangeForMarker(index: number, selection: ReadonlyArray<boolean>): void;
|
|
92
98
|
renderMarkers(): ReadonlyArray<React.ReactNode>;
|
|
93
99
|
renderInstructions(): React.ReactNode;
|
|
100
|
+
/**
|
|
101
|
+
* @deprecated and likely very broken API
|
|
102
|
+
* [LEMS-3185] do not trust serializedState/restoreSerializedState
|
|
103
|
+
*/
|
|
104
|
+
getSerializedState(): any;
|
|
94
105
|
render(): React.ReactNode;
|
|
95
106
|
}
|
|
107
|
+
declare function getStartUserInput(options: LabelImagePublicWidgetOptions): PerseusLabelImageUserInput;
|
|
108
|
+
/**
|
|
109
|
+
* @deprecated and likely a very broken API
|
|
110
|
+
* [LEMS-3185] do not trust serializedState/restoreSerializedState
|
|
111
|
+
*/
|
|
112
|
+
declare function getUserInputFromSerializedState(serializedState: any): PerseusLabelImageUserInput;
|
|
96
113
|
declare const _default: {
|
|
97
114
|
name: string;
|
|
98
115
|
displayName: string;
|
|
99
116
|
widget: React.ForwardRefExoticComponent<Omit<Omit<PerseusLabelImageWidgetOptions, "markers"> & {
|
|
100
117
|
markers: ReadonlyArray<OptionalAnswersMarkerType>;
|
|
101
|
-
} & import("../../types").UniversalWidgetProps<Empty, Empty> &
|
|
118
|
+
} & import("../../types").UniversalWidgetProps<Empty, PerseusLabelImageUserInput, Empty> & {
|
|
119
|
+
analytics: DependencyProps["analytics"];
|
|
102
120
|
preferredPopoverDirection?: PreferredPopoverDirection;
|
|
103
121
|
}, keyof import("../..").PerseusDependenciesV2> & React.RefAttributes<LabelImage>>;
|
|
104
122
|
isLintable: true;
|
|
123
|
+
getStartUserInput: typeof getStartUserInput;
|
|
124
|
+
getUserInputFromSerializedState: typeof getUserInputFromSerializedState;
|
|
105
125
|
};
|
|
106
126
|
export default _default;
|
|
@@ -3,18 +3,17 @@ import { PerseusI18nContext } from "../../components/i18n-context";
|
|
|
3
3
|
import type { SortableOption } from "../../components/sortable";
|
|
4
4
|
import type { WidgetProps, Widget } from "../../types";
|
|
5
5
|
import type { MatcherPromptJSON } from "../../widget-ai-utils/matcher/matcher-ai-utils";
|
|
6
|
-
import type { PerseusMatcherWidgetOptions, PerseusMatcherUserInput } from "@khanacademy/perseus-core";
|
|
7
|
-
type RenderProps = PerseusMatcherWidgetOptions
|
|
8
|
-
type Props = WidgetProps<RenderProps>;
|
|
6
|
+
import type { PerseusMatcherWidgetOptions, PerseusMatcherUserInput, MatcherPublicWidgetOptions } from "@khanacademy/perseus-core";
|
|
7
|
+
type RenderProps = Pick<PerseusMatcherWidgetOptions, "labels" | "orderMatters" | "padding">;
|
|
8
|
+
type Props = WidgetProps<RenderProps, PerseusMatcherUserInput>;
|
|
9
9
|
type DefaultProps = {
|
|
10
|
-
left: Props["left"];
|
|
11
|
-
right: Props["right"];
|
|
12
10
|
labels: Props["labels"];
|
|
13
11
|
orderMatters: Props["orderMatters"];
|
|
14
12
|
padding: Props["padding"];
|
|
15
13
|
problemNum: Props["problemNum"];
|
|
16
14
|
onChange: Props["onChange"];
|
|
17
15
|
linterContext: Props["linterContext"];
|
|
16
|
+
userInput: Props["userInput"];
|
|
18
17
|
};
|
|
19
18
|
type State = {
|
|
20
19
|
leftHeight: number;
|
|
@@ -26,19 +25,32 @@ export declare class Matcher extends React.Component<Props, State> implements Wi
|
|
|
26
25
|
context: React.ContextType<typeof PerseusI18nContext>;
|
|
27
26
|
static defaultProps: DefaultProps;
|
|
28
27
|
state: State;
|
|
29
|
-
changeAndTrack: (
|
|
28
|
+
changeAndTrack: () => void;
|
|
30
29
|
onMeasureLeft: (arg1: any) => void;
|
|
31
30
|
onMeasureRight: (arg1: any) => void;
|
|
32
|
-
|
|
31
|
+
_getUserInputFromSortable: () => PerseusMatcherUserInput;
|
|
32
|
+
/**
|
|
33
|
+
* TODO: remove this when everything is pulling from Renderer state
|
|
34
|
+
* @deprecated get user input from Renderer state
|
|
35
|
+
*/
|
|
36
|
+
getUserInput(): PerseusMatcherUserInput;
|
|
33
37
|
getPromptJSON(): MatcherPromptJSON;
|
|
34
38
|
moveLeftOptionToIndex: (option: SortableOption, index: number) => void;
|
|
35
39
|
moveRightOptionToIndex: (option: SortableOption, index: number) => void;
|
|
36
40
|
render(): React.ReactElement;
|
|
37
41
|
}
|
|
42
|
+
declare function getStartUserInput(options: MatcherPublicWidgetOptions, problemNum: number): PerseusMatcherUserInput;
|
|
43
|
+
/**
|
|
44
|
+
* @deprecated and likely a very broken API
|
|
45
|
+
* [LEMS-3185] do not trust serializedState/restoreSerializedState
|
|
46
|
+
*/
|
|
47
|
+
declare function getUserInputFromSerializedState(serializedState: any): PerseusMatcherUserInput;
|
|
38
48
|
declare const _default: {
|
|
39
49
|
name: string;
|
|
40
50
|
displayName: string;
|
|
41
51
|
widget: typeof Matcher;
|
|
42
52
|
isLintable: true;
|
|
53
|
+
getStartUserInput: typeof getStartUserInput;
|
|
54
|
+
getUserInputFromSerializedState: typeof getUserInputFromSerializedState;
|
|
43
55
|
};
|
|
44
56
|
export default _default;
|
|
@@ -2,33 +2,22 @@ import * as React from "react";
|
|
|
2
2
|
import { PerseusI18nContext } from "../../components/i18n-context";
|
|
3
3
|
import type { FocusPath, Widget, WidgetProps } from "../../types";
|
|
4
4
|
import type { MatrixPromptJSON } from "../../widget-ai-utils/matrix/matrix-ai-utils";
|
|
5
|
-
import type { MatrixPublicWidgetOptions, PerseusMatrixUserInput,
|
|
6
|
-
type
|
|
7
|
-
|
|
8
|
-
suffix: string;
|
|
9
|
-
answers: PerseusMatrixWidgetAnswers;
|
|
5
|
+
import type { MatrixPublicWidgetOptions, PerseusMatrixUserInput, PerseusMatrixWidgetOptions } from "@khanacademy/perseus-core";
|
|
6
|
+
type RenderProps = Pick<PerseusMatrixWidgetOptions, "matrixBoardSize" | "prefix" | "suffix">;
|
|
7
|
+
type Props = WidgetProps<RenderProps, PerseusMatrixUserInput> & {
|
|
10
8
|
cursorPosition: ReadonlyArray<number>;
|
|
11
|
-
|
|
12
|
-
static?: boolean | undefined;
|
|
13
|
-
}>;
|
|
14
|
-
type RenderProps = MatrixPublicWidgetOptions & {
|
|
15
|
-
emptyMatrix: ReadonlyArray<ReadonlyArray<string>>;
|
|
16
|
-
};
|
|
17
|
-
type Props = ExternalProps & {
|
|
18
|
-
onChange: (arg1: {
|
|
9
|
+
onChange: (nextProps: {
|
|
19
10
|
cursorPosition?: ReadonlyArray<number>;
|
|
20
|
-
|
|
21
|
-
}, arg2: () => boolean) => void;
|
|
22
|
-
numericInput?: boolean;
|
|
11
|
+
}, cb: () => boolean) => void;
|
|
23
12
|
};
|
|
24
13
|
type DefaultProps = {
|
|
25
14
|
matrixBoardSize: Props["matrixBoardSize"];
|
|
26
|
-
answers: Props["answers"];
|
|
27
15
|
prefix: string;
|
|
28
16
|
suffix: string;
|
|
29
17
|
cursorPosition: ReadonlyArray<number>;
|
|
30
18
|
apiOptions: Props["apiOptions"];
|
|
31
19
|
linterContext: Props["linterContext"];
|
|
20
|
+
userInput: PerseusMatrixUserInput;
|
|
32
21
|
};
|
|
33
22
|
type State = {
|
|
34
23
|
enterTheMatrix: number;
|
|
@@ -50,18 +39,41 @@ declare class Matrix extends React.Component<Props, State> implements Widget {
|
|
|
50
39
|
setInputValue: (arg1: any, arg2: any, arg3: any) => void;
|
|
51
40
|
handleKeyDown: (arg1: any, arg2: any, arg3: any) => void;
|
|
52
41
|
onValueChange: (arg1: any, arg2: any, arg3: any, arg4: any) => void;
|
|
42
|
+
/**
|
|
43
|
+
* TODO: remove this when everything is pulling from Renderer state
|
|
44
|
+
* @deprecated get user input from Renderer state
|
|
45
|
+
*/
|
|
53
46
|
getUserInput(): PerseusMatrixUserInput;
|
|
54
47
|
getPromptJSON(): MatrixPromptJSON;
|
|
48
|
+
/**
|
|
49
|
+
* @deprecated and likely very broken API
|
|
50
|
+
* [LEMS-3185] do not trust serializedState/restoreSerializedState
|
|
51
|
+
*/
|
|
52
|
+
getSerializedState(): any;
|
|
55
53
|
render(): React.ReactNode;
|
|
56
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* TODO: I don't really think we need this. The default for a transform
|
|
57
|
+
* is an identity function and all this is doing is taking a selection from
|
|
58
|
+
* widget options; it's probably fine to pass all widget options down.
|
|
59
|
+
* @deprecated [LEMS-3199]
|
|
60
|
+
*/
|
|
57
61
|
declare function transform(widgetOptions: MatrixPublicWidgetOptions): RenderProps;
|
|
62
|
+
declare function getCorrectUserInput(options: PerseusMatrixWidgetOptions): PerseusMatrixUserInput;
|
|
63
|
+
/**
|
|
64
|
+
* @deprecated and likely a very broken API
|
|
65
|
+
* [LEMS-3185] do not trust serializedState/restoreSerializedState
|
|
66
|
+
*/
|
|
67
|
+
declare function getUserInputFromSerializedState(serializedState: any): PerseusMatrixUserInput;
|
|
58
68
|
declare const _default: {
|
|
59
69
|
name: string;
|
|
60
70
|
displayName: string;
|
|
61
71
|
hidden: true;
|
|
62
72
|
widget: typeof Matrix;
|
|
63
73
|
transform: typeof transform;
|
|
64
|
-
staticTransform:
|
|
74
|
+
staticTransform: typeof transform;
|
|
65
75
|
isLintable: true;
|
|
76
|
+
getCorrectUserInput: typeof getCorrectUserInput;
|
|
77
|
+
getUserInputFromSerializedState: typeof getUserInputFromSerializedState;
|
|
66
78
|
};
|
|
67
79
|
export default _default;
|
|
@@ -3,12 +3,10 @@ import type { MockWidgetOptions } from "./mock-widget-types";
|
|
|
3
3
|
import type { WidgetProps, Widget, FocusPath } from "../../types";
|
|
4
4
|
import type { MockWidgetPromptJSON } from "../../widget-ai-utils/mock-widget/prompt-utils";
|
|
5
5
|
import type { PerseusMockWidgetUserInput } from "@khanacademy/perseus-score";
|
|
6
|
-
type ExternalProps = WidgetProps<MockWidgetOptions>;
|
|
6
|
+
type ExternalProps = WidgetProps<MockWidgetOptions, PerseusMockWidgetUserInput>;
|
|
7
|
+
type Props = ExternalProps;
|
|
7
8
|
type DefaultProps = {
|
|
8
|
-
|
|
9
|
-
};
|
|
10
|
-
type Props = ExternalProps & {
|
|
11
|
-
currentValue: string;
|
|
9
|
+
userInput: Props["userInput"];
|
|
12
10
|
};
|
|
13
11
|
/**
|
|
14
12
|
* This is a Mock Perseus widget, which is used for our various rendering tests
|
|
@@ -25,21 +23,104 @@ type Props = ExternalProps & {
|
|
|
25
23
|
declare class MockWidgetComponent extends React.Component<Props> implements Widget {
|
|
26
24
|
static defaultProps: DefaultProps;
|
|
27
25
|
inputRef: HTMLElement | null;
|
|
28
|
-
static getUserInputFromProps(props: Props): PerseusMockWidgetUserInput;
|
|
29
26
|
getPromptJSON(): MockWidgetPromptJSON;
|
|
30
|
-
setInputValue: (
|
|
27
|
+
setInputValue: (path: FocusPath, newValue: string, cb?: () => unknown | null | undefined) => void;
|
|
31
28
|
focus: () => boolean;
|
|
32
29
|
focusInputPath: () => void;
|
|
33
30
|
blurInputPath: () => void;
|
|
34
31
|
getInputPaths: () => ReadonlyArray<ReadonlyArray<string>>;
|
|
32
|
+
/**
|
|
33
|
+
* TODO: remove this when everything is pulling from Renderer state
|
|
34
|
+
* @deprecated get user input from Renderer state
|
|
35
|
+
*/
|
|
35
36
|
getUserInput(): PerseusMockWidgetUserInput;
|
|
36
|
-
handleChange: (
|
|
37
|
+
handleChange: (newValue: string, cb?: () => unknown | null | undefined) => void;
|
|
38
|
+
/**
|
|
39
|
+
* @deprecated and likely very broken API
|
|
40
|
+
* [LEMS-3185] do not trust serializedState/restoreSerializedState
|
|
41
|
+
*/
|
|
42
|
+
getSerializedState(): {
|
|
43
|
+
currentValue: string;
|
|
44
|
+
static: boolean;
|
|
45
|
+
value: string;
|
|
46
|
+
reviewModeRubric?: Empty | null | undefined;
|
|
47
|
+
trackInteraction: (extraData?: Empty | undefined) => void;
|
|
48
|
+
widgetId: string;
|
|
49
|
+
alignment: string | null | undefined;
|
|
50
|
+
problemNum: number | null | undefined;
|
|
51
|
+
apiOptions: Readonly<Readonly<{
|
|
52
|
+
isArticle?: boolean;
|
|
53
|
+
onFocusChange?: (newFocusPath: FocusPath, oldFocusPath: FocusPath, keypadHeight?: number, focusedElement?: HTMLElement) => unknown;
|
|
54
|
+
GroupMetadataEditor?: React.ComponentType<any>;
|
|
55
|
+
showAlignmentOptions?: boolean;
|
|
56
|
+
readOnly?: boolean;
|
|
57
|
+
answerableCallback?: (arg1: boolean) => unknown;
|
|
58
|
+
getAnotherHint?: () => unknown;
|
|
59
|
+
interactionCallback?: (widgetData: {
|
|
60
|
+
[widgetId: string]: any;
|
|
61
|
+
}) => void;
|
|
62
|
+
groupAnnotator?: (groupNumber: number, widgetId: string) => React.ReactNode;
|
|
63
|
+
imagePlaceholder?: React.ReactNode;
|
|
64
|
+
widgetPlaceholder?: React.ReactNode;
|
|
65
|
+
baseElements?: {
|
|
66
|
+
Link: React.ComponentType<any>;
|
|
67
|
+
};
|
|
68
|
+
imagePreloader?: (dimensions: import("../../types").Dimensions) => React.ReactNode;
|
|
69
|
+
trackInteraction?: (args: {
|
|
70
|
+
type: string;
|
|
71
|
+
id: string;
|
|
72
|
+
correct?: boolean;
|
|
73
|
+
} & Partial<import("../../types").TrackingGradedGroupExtraArguments> & Partial<{
|
|
74
|
+
visible: number;
|
|
75
|
+
}>) => void;
|
|
76
|
+
customKeypad?: boolean;
|
|
77
|
+
nativeKeypadProxy?: (blur: () => void) => import("@khanacademy/math-input").KeypadAPI;
|
|
78
|
+
isMobile?: boolean;
|
|
79
|
+
isMobileApp?: boolean;
|
|
80
|
+
setDrawingAreaAvailable?: (arg1: boolean) => unknown;
|
|
81
|
+
hintProgressColor?: string;
|
|
82
|
+
canScrollPage?: boolean;
|
|
83
|
+
editorChangeDelay?: number;
|
|
84
|
+
flags?: Record<"new-radio-widget", boolean>;
|
|
85
|
+
onWidgetStartProps?: (widgets: import("@khanacademy/perseus-core").PerseusWidgetsMap) => void;
|
|
86
|
+
}> & {
|
|
87
|
+
baseElements: NonNullable<import("../..").APIOptions["baseElements"]>;
|
|
88
|
+
canScrollPage: NonNullable<import("../..").APIOptions["canScrollPage"]>;
|
|
89
|
+
editorChangeDelay: NonNullable<import("../..").APIOptions["editorChangeDelay"]>;
|
|
90
|
+
groupAnnotator: NonNullable<import("../..").APIOptions["groupAnnotator"]>;
|
|
91
|
+
isArticle: NonNullable<import("../..").APIOptions["isArticle"]>;
|
|
92
|
+
isMobile: NonNullable<import("../..").APIOptions["isMobile"]>;
|
|
93
|
+
isMobileApp: NonNullable<import("../..").APIOptions["isMobileApp"]>;
|
|
94
|
+
onFocusChange: NonNullable<import("../..").APIOptions["onFocusChange"]>;
|
|
95
|
+
readOnly: NonNullable<import("../..").APIOptions["readOnly"]>;
|
|
96
|
+
setDrawingAreaAvailable: NonNullable<import("../..").APIOptions["setDrawingAreaAvailable"]>;
|
|
97
|
+
showAlignmentOptions: NonNullable<import("../..").APIOptions["showAlignmentOptions"]>;
|
|
98
|
+
}>;
|
|
99
|
+
keypadElement?: any;
|
|
100
|
+
questionCompleted?: boolean;
|
|
101
|
+
onFocus: (blurPath: FocusPath) => void;
|
|
102
|
+
onBlur: (blurPath: FocusPath) => void;
|
|
103
|
+
findWidgets: (criterion: import("../../types").FilterCriterion) => ReadonlyArray<Widget>;
|
|
104
|
+
reviewMode: boolean;
|
|
105
|
+
showSolutions?: import("@khanacademy/perseus-core").ShowSolutions;
|
|
106
|
+
onChange: import("../..").ChangeHandler;
|
|
107
|
+
handleUserInput: (newUserInput: PerseusMockWidgetUserInput, cb?: () => void, silent?: boolean) => void;
|
|
108
|
+
isLastUsedWidget: boolean;
|
|
109
|
+
linterContext: import("@khanacademy/perseus-linter").LinterContextProps;
|
|
110
|
+
containerSizeClass: import("../../util/sizing-utils").SizeClass;
|
|
111
|
+
};
|
|
37
112
|
render(): React.ReactNode;
|
|
38
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* @deprecated and likely a very broken API
|
|
116
|
+
* [LEMS-3185] do not trust serializedState/restoreSerializedState
|
|
117
|
+
*/
|
|
118
|
+
declare function getUserInputFromSerializedState(serializedState: any): PerseusMockWidgetUserInput;
|
|
39
119
|
declare const _default: {
|
|
40
120
|
name: string;
|
|
41
121
|
displayName: string;
|
|
42
122
|
widget: typeof MockWidgetComponent;
|
|
43
123
|
isLintable: true;
|
|
124
|
+
getUserInputFromSerializedState: typeof getUserInputFromSerializedState;
|
|
44
125
|
};
|
|
45
126
|
export default _default;
|