Skip to content

Commit

Permalink
[LEMS-2737/default-number-line] number line
Browse files Browse the repository at this point in the history
  • Loading branch information
handeyeco committed Jan 23, 2025
1 parent 19332bb commit 7eb3d0d
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 42 deletions.
2 changes: 2 additions & 0 deletions packages/perseus-core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,7 @@ export {pluck, mapObject} from "./utils/objective_";

export {default as expressionLogic} from "./widgets/expression";
export type {ExpressionDefaultWidgetOptions} from "./widgets/expression";
export {default as numberLineLogic} from "./widgets/number-line";
export type {NumberLineDefaultWidgetOptions} from "./widgets/number-line";

export type * from "./widgets/logic-export.types";
44 changes: 44 additions & 0 deletions packages/perseus-core/src/widgets/number-line/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import type {PerseusNumberLineWidgetOptions} from "../../data-schema";
import type {WidgetLogic} from "../logic-export.types";

export type NumberLineDefaultWidgetOptions = Pick<
PerseusNumberLineWidgetOptions,
| "range"
| "labelRange"
| "labelStyle"
| "labelTicks"
| "divisionRange"
| "numDivisions"
| "snapDivisions"
| "tickStep"
| "correctRel"
| "correctX"
| "initialX"
| "showTooltip"
>;

const defaultWidgetOptions: NumberLineDefaultWidgetOptions = {
range: [0, 10],

labelRange: [null, null],
labelStyle: "decimal",
labelTicks: true,

divisionRange: [1, 12],
numDivisions: 5,
snapDivisions: 2,

tickStep: null,
correctRel: "eq",
correctX: null,
initialX: null,

showTooltip: false,
};

const numberLineWidgetLogic: WidgetLogic = {
name: "number-line",
defaultWidgetOptions,
};

export default numberLineWidgetLogic;
69 changes: 27 additions & 42 deletions packages/perseus-editor/src/widgets/number-line-editor.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
/* eslint-disable @khanacademy/ts-no-error-suppressions */
import {number as knumber} from "@khanacademy/kmath";
import {components, EditorJsonify} from "@khanacademy/perseus";
import {
numberLineLogic,
type NumberLineDefaultWidgetOptions,
} from "@khanacademy/perseus-core";
import {Checkbox} from "@khanacademy/wonder-blocks-form";
import PropTypes from "prop-types";
import * as React from "react";
import _ from "underscore";

import type {Changeable} from "@khanacademy/perseus";

const {ButtonGroup, InfoTip, NumberInput, RangeInput} = components;

type Range = [number, number];
Expand All @@ -15,52 +20,32 @@ const bound = (x: number, gt: number, lt: number): number =>

const EN_DASH = "\u2013";

type Props = any;

class NumberLineEditor extends React.Component<Props> {
static propTypes = {
range: PropTypes.arrayOf(PropTypes.number).isRequired,

labelRange: PropTypes.arrayOf(PropTypes.number).isRequired,
labelStyle: PropTypes.string.isRequired,
labelTicks: PropTypes.bool,
type Props = {
range: number[];

divisionRange: PropTypes.arrayOf(PropTypes.number).isRequired,
numDivisions: PropTypes.number.isRequired,
snapDivisions: PropTypes.number,
labelRange: ReadonlyArray<number>;
labelStyle: string;
labelTicks: boolean;

tickStep: PropTypes.number,
correctRel: PropTypes.oneOf(["lt", "gt", "le", "ge", "eq"]),
correctX: PropTypes.number,
initialX: PropTypes.number,
isTickCtrl: PropTypes.bool,
divisionRange: ReadonlyArray<number>;
numDivisions: number;
snapDivisions: number;

onChange: PropTypes.func.isRequired,
tickStep: number;
correctRel: "lt" | "gt" | "le" | "ge" | "eq";
correctX: number;
initialX: number;
isTickCtrl?: boolean;

static: PropTypes.bool,
showTooltips: PropTypes.bool,
};
static?: boolean;
showTooltip: boolean;
} & Changeable.ChangeableProps;

class NumberLineEditor extends React.Component<Props> {
static widgetName = "number-line" as const;

static defaultProps: Props = {
range: [0, 10],

labelRange: [null, null],
labelStyle: "decimal",
labelTicks: true,

divisionRange: [1, 12],
numDivisions: 5,
snapDivisions: 2,

tickStep: null,
correctRel: "eq",
correctX: null,
initialX: null,

showTooltips: false,
};
static defaultProps: NumberLineDefaultWidgetOptions =
numberLineLogic.defaultWidgetOptions;

onRangeChange: (arg1: Range) => void = (range) => {
// Changing the range constrains the initial position, as well as the
Expand Down Expand Up @@ -389,9 +374,9 @@ class NumberLineEditor extends React.Component<Props> {
{!this.props.static && (
<Checkbox
label="Show tooltips"
checked={this.props.showTooltips}
checked={this.props.showTooltip}
onChange={(value) => {
this.props.onChange({showTooltips: value});
this.props.onChange({showTooltip: value});
}}
/>
)}
Expand Down

0 comments on commit 7eb3d0d

Please sign in to comment.