@khanacademy/perseus 7.2.0 → 8.0.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/CHANGELOG.md +38 -0
- package/dist/article-renderer.d.ts +26 -40
- package/dist/components/math-input.d.ts +1 -1
- package/dist/components/sortable.d.ts +1 -1
- package/dist/components/tex-buttons.d.ts +1 -1
- package/dist/es/index.css +61 -61
- package/dist/es/index.js +1189 -1308
- package/dist/es/index.js.map +1 -1
- package/dist/hints-renderer.d.ts +1 -1
- package/dist/index.css +61 -61
- package/dist/index.js +1180 -1269
- package/dist/index.js.map +1 -1
- package/dist/mixins/provide-keypad.d.ts +15 -12
- package/dist/perseus-api.d.ts +1 -1
- package/dist/types.d.ts +3 -2
- package/dist/widgets/expression.d.ts +1 -1
- package/dist/widgets/graded-group.d.ts +1 -1
- package/dist/widgets/interactive-graph.d.ts +1 -1
- package/dist/widgets/plotter.d.ts +47 -13
- package/dist/widgets/sequence.d.ts +1 -1
- package/dist/widgets/table.d.ts +8 -1
- package/dist/widgets.d.ts +1 -1
- package/package.json +33 -33
- package/src/__testdata__/article-renderer.testdata.ts +3 -1
- package/src/__testdata__/item-renderer.testdata.ts +1 -1
- package/src/__testdata__/renderer.testdata.ts +1 -1
- package/src/__tests__/item-renderer.test.tsx +2 -2
- package/src/__tests__/mock-asset-loading-widget.tsx +1 -1
- package/src/__tests__/perseus-markdown.test.ts +17 -17
- package/src/__tests__/renderer-api.test.tsx +21 -21
- package/src/__tests__/renderer.test.tsx +13 -13
- package/src/__tests__/server-item-renderer.test.tsx +3 -3
- package/src/__tests__/tex-wrangler.test.ts +1 -1
- package/src/article-renderer.tsx +39 -38
- package/src/components/__stories__/image-loader.stories.tsx +1 -0
- package/src/components/__tests__/number-input.test.tsx +4 -4
- package/src/components/__tests__/sortable.test.tsx +2 -2
- package/src/components/fixed-to-responsive.tsx +1 -1
- package/src/components/graph.tsx +12 -11
- package/src/components/graphie-classes.ts +7 -7
- package/src/components/graphie.tsx +14 -14
- package/src/components/highlighting/highlightable-content.tsx +1 -1
- package/src/components/highlighting/ui/highlight-renderer.tsx +1 -1
- package/src/components/highlighting/ui/util.ts +2 -2
- package/src/components/highlighting/word-indexer.tsx +4 -4
- package/src/components/icon.tsx +2 -1
- package/src/components/image-loader.tsx +5 -4
- package/src/components/input-with-examples.tsx +2 -2
- package/src/components/lint.tsx +1 -1
- package/src/components/math-input.tsx +5 -5
- package/src/components/math-output.tsx +1 -1
- package/src/components/multi-button-group.tsx +1 -1
- package/src/components/number-input.tsx +11 -10
- package/src/components/prop-check-box.tsx +1 -1
- package/src/components/simple-keypad-input.tsx +4 -4
- package/src/components/sortable.tsx +43 -41
- package/src/components/svg-image.tsx +13 -12
- package/src/components/tex-buttons.tsx +5 -3
- package/src/components/text-input.tsx +9 -8
- package/src/components/text-list-editor.tsx +12 -11
- package/src/components/visibility-observer/create-visibility-observer.ts +1 -1
- package/src/components/visibility-observer/visibility-observer.tsx +2 -2
- package/src/components/zoomable-tex.tsx +3 -3
- package/src/components/zoomable.tsx +9 -8
- package/src/hint-renderer.tsx +3 -3
- package/src/hints-renderer.tsx +12 -11
- package/src/index.ts +1 -0
- package/src/init.ts +1 -1
- package/src/interaction-tracker.ts +4 -4
- package/src/interactive2/__tests__/movable-point.test.ts +1 -1
- package/src/interactive2/interactive-util.ts +6 -6
- package/src/interactive2/movable-helper-methods.ts +2 -2
- package/src/interactive2/movable-line-options.ts +37 -37
- package/src/interactive2/movable-line.ts +2 -2
- package/src/interactive2/movable-point-options.ts +29 -29
- package/src/interactive2/movable-point.tsx +2 -2
- package/src/interactive2/movable-polygon-options.ts +45 -45
- package/src/interactive2/movable-polygon.ts +2 -2
- package/src/interactive2/movable.ts +2 -2
- package/src/interactive2/objective_.ts +1 -1
- package/src/interactive2/wrapped-defaults.ts +2 -2
- package/src/interactive2/wrapped-ellipse.ts +9 -9
- package/src/interactive2/wrapped-line.ts +8 -8
- package/src/interactive2/wrapped-path.ts +5 -5
- package/src/item-renderer.tsx +6 -5
- package/src/mixins/changeable.ts +2 -2
- package/src/mixins/editor-jsonify.ts +1 -1
- package/src/mixins/provide-keypad.tsx +24 -37
- package/src/mixins/widget-jsonify-deprecated.ts +1 -1
- package/src/multi-items/__tests__/items.test.ts +1 -1
- package/src/multi-items/__tests__/multi-renderer.test.tsx +7 -7
- package/src/multi-items/__tests__/trees.test.ts +12 -12
- package/src/multi-items/item-types.ts +2 -2
- package/src/multi-items/items.ts +1 -1
- package/src/multi-items/multi-renderer.tsx +15 -14
- package/src/multi-items/prop-type-builders.ts +2 -2
- package/src/multi-items/tree-types.ts +4 -4
- package/src/multi-items/trees.ts +16 -16
- package/src/perseus-env.ts +2 -2
- package/src/perseus-markdown.tsx +5 -5
- package/src/renderer.tsx +39 -38
- package/src/server-item-renderer.tsx +6 -5
- package/src/sigfigs.ts +1 -1
- package/src/styles/articles.less +8 -4
- package/src/styles/perseus-renderer.less +47 -38
- package/src/styles/util.less +1 -1
- package/src/styles/variables.boostrap.less +158 -182
- package/src/styles/variables.less +20 -20
- package/src/styles/variables.shared.less +162 -168
- package/src/styles/widgets/categorizer.less +1 -2
- package/src/styles/widgets/expression.less +7 -4
- package/src/styles/widgets/grapher.less +2 -1
- package/src/styles/widgets/image.less +3 -2
- package/src/styles/widgets/interactive-graph.less +4 -2
- package/src/styles/widgets/label-image.less +2 -1
- package/src/styles/widgets/matrix.less +11 -7
- package/src/styles/widgets/orderer.less +2 -1
- package/src/styles/widgets/passage.less +2 -1
- package/src/styles/widgets/plotter.less +4 -3
- package/src/styles/widgets/radio.less +4 -2
- package/src/styles/widgets/sortable.less +1 -1
- package/src/styles/widgets/table.less +2 -1
- package/src/styles/widgets/transformer.less +2 -1
- package/src/styles/widgets/unit.less +2 -1
- package/src/traversal.ts +1 -1
- package/src/types.ts +3 -3
- package/src/util/answer-types.ts +14 -14
- package/src/util/geometry.ts +7 -7
- package/src/util/graphie.ts +32 -32
- package/src/util/interactive.ts +118 -118
- package/src/util/math.ts +4 -4
- package/src/util/react-render.tsx +1 -1
- package/src/util/scroll-utils.ts +2 -2
- package/src/util/tex.ts +3 -3
- package/src/util.ts +15 -15
- package/src/widget-container.tsx +1 -1
- package/src/widgets/__stories__/plotter.stories.tsx +27 -0
- package/src/widgets/__stories__/test-keypad-context-wrapper.tsx +3 -3
- package/src/widgets/__testdata__/numeric-input.testdata.ts +1 -1
- package/src/widgets/__testdata__/plotter.testdata.ts +36 -0
- package/src/widgets/__tests__/__snapshots__/plotter.test.tsx.snap +863 -0
- package/src/widgets/__tests__/__snapshots__/video.test.ts.snap +2 -2
- package/src/widgets/__tests__/expression.test.ts +4 -3
- package/src/widgets/__tests__/grapher.cypress.ts +32 -32
- package/src/widgets/__tests__/group.test.tsx +1 -1
- package/src/widgets/__tests__/interactive-graph.cypress.ts +40 -40
- package/src/widgets/__tests__/interactive-graph.test.ts +1 -1
- package/src/widgets/__tests__/numeric-input.test.ts +1 -1
- package/src/widgets/__tests__/passage.test.tsx +2 -2
- package/src/widgets/__tests__/plotter.test.tsx +66 -0
- package/src/widgets/__tests__/radio/base-radio.test.tsx +7 -7
- package/src/widgets/__tests__/renderQuestion.tsx +3 -3
- package/src/widgets/categorizer.tsx +5 -4
- package/src/widgets/cs-program.tsx +2 -2
- package/src/widgets/dropdown.tsx +1 -1
- package/src/widgets/expression.tsx +10 -9
- package/src/widgets/graded-group-set.tsx +6 -5
- package/src/widgets/graded-group.tsx +19 -19
- package/src/widgets/grapher/util.tsx +6 -6
- package/src/widgets/grapher.tsx +10 -10
- package/src/widgets/group.tsx +3 -3
- package/src/widgets/iframe.tsx +2 -2
- package/src/widgets/image.tsx +1 -1
- package/src/widgets/input-number.tsx +4 -4
- package/src/widgets/interaction.tsx +78 -77
- package/src/widgets/interactive-graph.tsx +109 -107
- package/src/widgets/label-image/marker.tsx +3 -2
- package/src/widgets/label-image.test.ts +1 -1
- package/src/widgets/label-image.tsx +7 -7
- package/src/widgets/lights-puzzle.tsx +2 -2
- package/src/widgets/matcher.tsx +7 -6
- package/src/widgets/matrix.tsx +20 -20
- package/src/widgets/measurer.tsx +3 -3
- package/src/widgets/molecule/__tests__/layout.test.ts +4 -4
- package/src/widgets/molecule/__tests__/parser.test.ts +14 -14
- package/src/widgets/molecule/smiles-parser.ts +3 -3
- package/src/widgets/molecule.tsx +4 -4
- package/src/widgets/number-line.tsx +11 -11
- package/src/widgets/numeric-input.tsx +11 -11
- package/src/widgets/orderer.tsx +39 -38
- package/src/widgets/passage/__tests__/passage-markdown.test.ts +1 -1
- package/src/widgets/passage/passage-markdown.tsx +4 -4
- package/src/widgets/passage-ref-target.tsx +2 -1
- package/src/widgets/passage-ref.tsx +4 -6
- package/src/widgets/passage.tsx +11 -11
- package/src/widgets/plotter.tsx +117 -107
- package/src/widgets/radio/base-radio.tsx +12 -11
- package/src/widgets/radio/choice-icon/choice-icon.tsx +3 -2
- package/src/widgets/radio/choice.tsx +1 -1
- package/src/widgets/radio/option-status.tsx +1 -1
- package/src/widgets/radio/widget.tsx +6 -6
- package/src/widgets/radio.ts +1 -1
- package/src/widgets/reaction-diagram.tsx +8 -8
- package/src/widgets/sequence.tsx +2 -2
- package/src/widgets/simulator.tsx +14 -14
- package/src/widgets/sorter.tsx +5 -4
- package/src/widgets/table.tsx +8 -8
- package/src/widgets/transformer.tsx +93 -92
- package/src/widgets/unit.tsx +17 -17
- package/src/widgets/video-transcript-link.test.tsx +3 -3
- package/src/widgets/video-transcript-link.tsx +1 -1
- package/src/widgets/video.tsx +1 -1
- package/src/widgets.ts +5 -5
- package/src/zoom.ts +22 -22
- package/tsconfig-build.tsbuildinfo +1 -1
- package/dist/a11y.js.flow +0 -11
- package/dist/all-widgets.js.flow +0 -33
- package/dist/article-renderer.js.flow +0 -73
- package/dist/asset-context.js.flow +0 -15
- package/dist/basic-widgets.js.flow +0 -33
- package/dist/components/button-group.js.flow +0 -33
- package/dist/components/constants.js.flow +0 -13
- package/dist/components/fixed-to-responsive.js.flow +0 -34
- package/dist/components/graph.js.flow +0 -66
- package/dist/components/graphie-classes.js.flow +0 -19
- package/dist/components/graphie-movables.js.flow +0 -22
- package/dist/components/graphie.js.flow +0 -69
- package/dist/components/highlighting/highlightable-content.js.flow +0 -56
- package/dist/components/highlighting/highlights.js.flow +0 -54
- package/dist/components/highlighting/ranges.js.flow +0 -60
- package/dist/components/highlighting/types.js.flow +0 -70
- package/dist/components/highlighting/ui/highlight-renderer.js.flow +0 -43
- package/dist/components/highlighting/ui/highlight-set-renderer.js.flow +0 -41
- package/dist/components/highlighting/ui/highlight-tooltip.js.flow +0 -22
- package/dist/components/highlighting/ui/highlighting-ui.js.flow +0 -30
- package/dist/components/highlighting/ui/selection-tracker.js.flow +0 -54
- package/dist/components/highlighting/ui/types.js.flow +0 -22
- package/dist/components/highlighting/ui/util.js.flow +0 -42
- package/dist/components/highlighting/word-indexer.js.flow +0 -21
- package/dist/components/hud.js.flow +0 -14
- package/dist/components/icon.js.flow +0 -31
- package/dist/components/image-loader.js.flow +0 -49
- package/dist/components/info-tip/info-tip.js.flow +0 -20
- package/dist/components/info-tip.js.flow +0 -18
- package/dist/components/inline-icon.js.flow +0 -39
- package/dist/components/input-with-examples.js.flow +0 -58
- package/dist/components/lint.js.flow +0 -58
- package/dist/components/math-input.js.flow +0 -49
- package/dist/components/math-output.js.flow +0 -33
- package/dist/components/multi-button-group.js.flow +0 -35
- package/dist/components/number-input.js.flow +0 -42
- package/dist/components/prop-check-box.js.flow +0 -8
- package/dist/components/range-input.js.flow +0 -20
- package/dist/components/simple-keypad-input.js.flow +0 -16
- package/dist/components/sortable.js.flow +0 -91
- package/dist/components/stub-tag-editor.js.flow +0 -18
- package/dist/components/svg-image.js.flow +0 -85
- package/dist/components/tex-buttons.js.flow +0 -26
- package/dist/components/tex.js.flow +0 -25
- package/dist/components/text-input.js.flow +0 -39
- package/dist/components/text-list-editor.js.flow +0 -22
- package/dist/components/tooltip.js.flow +0 -51
- package/dist/components/visibility-observer/create-visibility-observer.js.flow +0 -23
- package/dist/components/visibility-observer/get-scroll-parent.js.flow +0 -7
- package/dist/components/visibility-observer/visibility-observer.js.flow +0 -36
- package/dist/components/zoomable-tex.js.flow +0 -18
- package/dist/components/zoomable.js.flow +0 -70
- package/dist/components.js.flow +0 -22
- package/dist/definition-context.js.flow +0 -25
- package/dist/dependencies.js.flow +0 -9
- package/dist/error-boundary.js.flow +0 -19
- package/dist/extra-widgets.js.flow +0 -33
- package/dist/hint-renderer.js.flow +0 -32
- package/dist/hints-renderer.js.flow +0 -41
- package/dist/icon-paths.js.flow +0 -123
- package/dist/index.js.flow +0 -134
- package/dist/init.js.flow +0 -20
- package/dist/interaction-tracker.js.flow +0 -35
- package/dist/interactive2/interactive-util.js.flow +0 -50
- package/dist/interactive2/movable-helper-methods.js.flow +0 -15
- package/dist/interactive2/movable-line-options.js.flow +0 -44
- package/dist/interactive2/movable-line.js.flow +0 -8
- package/dist/interactive2/movable-point-options.js.flow +0 -44
- package/dist/interactive2/movable-point.js.flow +0 -8
- package/dist/interactive2/movable-polygon-options.js.flow +0 -47
- package/dist/interactive2/movable-polygon.js.flow +0 -8
- package/dist/interactive2/movable.js.flow +0 -8
- package/dist/interactive2/objective_.js.flow +0 -25
- package/dist/interactive2/types.js.flow +0 -8
- package/dist/interactive2/wrapped-defaults.js.flow +0 -11
- package/dist/interactive2/wrapped-ellipse.js.flow +0 -14
- package/dist/interactive2/wrapped-line.js.flow +0 -14
- package/dist/interactive2/wrapped-path.js.flow +0 -13
- package/dist/interactive2.js.flow +0 -16
- package/dist/item-renderer.js.flow +0 -132
- package/dist/item-version.js.flow +0 -11
- package/dist/jipt-paragraphs.js.flow +0 -14
- package/dist/loading-context.js.flow +0 -12
- package/dist/logging/log.js.flow +0 -62
- package/dist/mixins/changeable.js.flow +0 -33
- package/dist/mixins/editor-jsonify.js.flow +0 -10
- package/dist/mixins/provide-keypad.js.flow +0 -33
- package/dist/mixins/widget-jsonify-deprecated.js.flow +0 -11
- package/dist/mixins/widget-prop-denylist.js.flow +0 -20
- package/dist/multi-items/item-types.js.flow +0 -55
- package/dist/multi-items/items.js.flow +0 -66
- package/dist/multi-items/multi-renderer.js.flow +0 -213
- package/dist/multi-items/prop-type-builders.js.flow +0 -22
- package/dist/multi-items/shape-types.js.flow +0 -60
- package/dist/multi-items/shapes.js.flow +0 -25
- package/dist/multi-items/tree-types.js.flow +0 -45
- package/dist/multi-items/trees.js.flow +0 -147
- package/dist/multi-items.js.flow +0 -36
- package/dist/perseus-api.js.flow +0 -151
- package/dist/perseus-env.js.flow +0 -6
- package/dist/perseus-error.js.flow +0 -16
- package/dist/perseus-markdown.js.flow +0 -20
- package/dist/perseus-types.js.flow +0 -1041
- package/dist/question-paragraph.js.flow +0 -17
- package/dist/renderability.js.flow +0 -19
- package/dist/renderer.js.flow +0 -325
- package/dist/server-item-renderer.js.flow +0 -132
- package/dist/sigfigs.js.flow +0 -41
- package/dist/styles/constants.js.flow +0 -62
- package/dist/styles/global-constants.js.flow +0 -348
- package/dist/styles/global-styles.js.flow +0 -53
- package/dist/styles/media-queries.js.flow +0 -35
- package/dist/styles/shared.js.flow +0 -8
- package/dist/tex-wrangler.js.flow +0 -13
- package/dist/translation-linter.js.flow +0 -32
- package/dist/traversal.js.flow +0 -26
- package/dist/types.js.flow +0 -318
- package/dist/util/a11y.js.flow +0 -8
- package/dist/util/answer-types.js.flow +0 -49
- package/dist/util/colors.js.flow +0 -95
- package/dist/util/fix-passage-refs.js.flow +0 -8
- package/dist/util/geometry.js.flow +0 -37
- package/dist/util/graph-utils.js.flow +0 -9
- package/dist/util/graphie.js.flow +0 -8
- package/dist/util/interactive.js.flow +0 -11
- package/dist/util/katex-preprocess.js.flow +0 -12
- package/dist/util/math.js.flow +0 -62
- package/dist/util/mobile-native-utils.js.flow +0 -12
- package/dist/util/react-render.js.flow +0 -12
- package/dist/util/register-all-widgets-for-testing.js.flow +0 -7
- package/dist/util/scroll-utils.js.flow +0 -19
- package/dist/util/sizing-utils.js.flow +0 -20
- package/dist/util/tex.js.flow +0 -17
- package/dist/util/url-utils.js.flow +0 -11
- package/dist/util.graphie.js.flow +0 -14
- package/dist/util.js.flow +0 -319
- package/dist/version.js.flow +0 -17
- package/dist/widget-container.js.flow +0 -33
- package/dist/widgets/categorizer.js.flow +0 -70
- package/dist/widgets/cs-program.js.flow +0 -54
- package/dist/widgets/definition.js.flow +0 -57
- package/dist/widgets/dropdown.js.flow +0 -63
- package/dist/widgets/explanation.js.flow +0 -58
- package/dist/widgets/expression.js.flow +0 -116
- package/dist/widgets/graded-group-answer-bar.js.flow +0 -24
- package/dist/widgets/graded-group-set.js.flow +0 -65
- package/dist/widgets/graded-group.js.flow +0 -78
- package/dist/widgets/grapher/util.js.flow +0 -38
- package/dist/widgets/grapher.js.flow +0 -102
- package/dist/widgets/group.js.flow +0 -60
- package/dist/widgets/iframe.js.flow +0 -53
- package/dist/widgets/image.js.flow +0 -73
- package/dist/widgets/input-number.js.flow +0 -94
- package/dist/widgets/interaction/arrow-picker.js.flow +0 -21
- package/dist/widgets/interaction/color-picker.js.flow +0 -23
- package/dist/widgets/interaction/dash-picker.js.flow +0 -21
- package/dist/widgets/interaction/element-container.js.flow +0 -28
- package/dist/widgets/interaction.js.flow +0 -60
- package/dist/widgets/interactive-graph.js.flow +0 -239
- package/dist/widgets/label-image/answer-choices.js.flow +0 -55
- package/dist/widgets/label-image/marker.js.flow +0 -31
- package/dist/widgets/label-image/types.js.flow +0 -23
- package/dist/widgets/label-image.js.flow +0 -142
- package/dist/widgets/lights-puzzle.js.flow +0 -58
- package/dist/widgets/matcher.js.flow +0 -106
- package/dist/widgets/matrix.js.flow +0 -80
- package/dist/widgets/measurer.js.flow +0 -30
- package/dist/widgets/molecule/molecule-drawing.js.flow +0 -11
- package/dist/widgets/molecule/molecule-layout.js.flow +0 -96
- package/dist/widgets/molecule/smiles-parser.js.flow +0 -26
- package/dist/widgets/molecule.js.flow +0 -60
- package/dist/widgets/number-line.js.flow +0 -102
- package/dist/widgets/numeric-input.js.flow +0 -105
- package/dist/widgets/orderer.js.flow +0 -81
- package/dist/widgets/passage/passage-markdown.js.flow +0 -33
- package/dist/widgets/passage-ref-target.js.flow +0 -52
- package/dist/widgets/passage-ref.js.flow +0 -85
- package/dist/widgets/passage.js.flow +0 -157
- package/dist/widgets/plotter.js.flow +0 -78
- package/dist/widgets/radio/base-radio.js.flow +0 -50
- package/dist/widgets/radio/choice-a11y-text.js.flow +0 -14
- package/dist/widgets/radio/choice-icon/choice-icon.js.flow +0 -22
- package/dist/widgets/radio/choice-icon/cross-out-line.js.flow +0 -16
- package/dist/widgets/radio/choice-icon/shared-styles.js.flow +0 -11
- package/dist/widgets/radio/choice-none-above.js.flow +0 -16
- package/dist/widgets/radio/choice.js.flow +0 -29
- package/dist/widgets/radio/choice.jsx.fixture.js.flow +0 -7
- package/dist/widgets/radio/focus-ring.js.flow +0 -22
- package/dist/widgets/radio/option-status.js.flow +0 -16
- package/dist/widgets/radio/util.js.flow +0 -12
- package/dist/widgets/radio/widget.js.flow +0 -80
- package/dist/widgets/radio.js.flow +0 -31
- package/dist/widgets/reaction-diagram.js.flow +0 -46
- package/dist/widgets/sequence.js.flow +0 -53
- package/dist/widgets/simulator.js.flow +0 -107
- package/dist/widgets/sorter.js.flow +0 -102
- package/dist/widgets/table.js.flow +0 -67
- package/dist/widgets/transformer.js.flow +0 -127
- package/dist/widgets/unit.js.flow +0 -93
- package/dist/widgets/video-transcript-link.js.flow +0 -15
- package/dist/widgets/video.js.flow +0 -57
- package/dist/widgets.js.flow +0 -108
- package/dist/zoom.js.flow +0 -7
- package/src/multi-items/item-types.js.flow +0 -55
package/src/widgets/plotter.tsx
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
/* eslint-disable
|
|
1
|
+
/* eslint-disable react/no-unsafe */
|
|
2
2
|
import * as i18n from "@khanacademy/wonder-blocks-i18n";
|
|
3
3
|
import $ from "jquery";
|
|
4
|
-
import PropTypes from "prop-types";
|
|
5
4
|
import * as React from "react";
|
|
6
5
|
import ReactDOM from "react-dom";
|
|
7
6
|
import _ from "underscore";
|
|
@@ -14,53 +13,68 @@ import KhanColors from "../util/colors";
|
|
|
14
13
|
import GraphUtils from "../util/graph-utils";
|
|
15
14
|
import KhanMath from "../util/math";
|
|
16
15
|
|
|
17
|
-
import type {WidgetExports} from "../types";
|
|
16
|
+
import type {APIOptions, WidgetExports} from "../types";
|
|
18
17
|
|
|
19
18
|
const {deepEq} = Util;
|
|
20
19
|
|
|
21
|
-
const BAR = "bar"
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
scaleY:
|
|
35
|
-
maxY:
|
|
36
|
-
snapsPerLine:
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
20
|
+
const BAR = "bar";
|
|
21
|
+
const LINE = "line";
|
|
22
|
+
const PIC = "pic";
|
|
23
|
+
const HISTOGRAM = "histogram";
|
|
24
|
+
const DOTPLOT = "dotplot";
|
|
25
|
+
|
|
26
|
+
const plotTypes = [BAR, LINE, PIC, HISTOGRAM, DOTPLOT];
|
|
27
|
+
type PlotType = typeof plotTypes[number];
|
|
28
|
+
|
|
29
|
+
type Props = {
|
|
30
|
+
type: PlotType;
|
|
31
|
+
labels: ReadonlyArray<string>;
|
|
32
|
+
categories: ReadonlyArray<string | number>;
|
|
33
|
+
scaleY: number;
|
|
34
|
+
maxY: number;
|
|
35
|
+
snapsPerLine: number;
|
|
36
|
+
picSize: number;
|
|
37
|
+
picBoxHeight: number;
|
|
38
|
+
picUrl: string;
|
|
39
|
+
plotDimensions: ReadonlyArray<number>;
|
|
40
|
+
labelInterval: number;
|
|
41
|
+
|
|
42
|
+
starting: Array<number>;
|
|
43
|
+
static: boolean;
|
|
44
|
+
markings: any;
|
|
45
|
+
onChange: any;
|
|
46
|
+
trackInteraction: () => void;
|
|
47
|
+
apiOptions: APIOptions;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
type DefaultProps = {
|
|
51
|
+
type: Props["type"];
|
|
52
|
+
labels: Props["labels"];
|
|
53
|
+
categories: Props["categories"];
|
|
54
|
+
scaleY: Props["scaleY"];
|
|
55
|
+
maxY: Props["maxY"];
|
|
56
|
+
snapsPerLine: Props["snapsPerLine"];
|
|
57
|
+
picSize: Props["picSize"];
|
|
58
|
+
picBoxHeight: Props["picBoxHeight"];
|
|
59
|
+
picUrl: Props["picUrl"];
|
|
60
|
+
plotDimensions: Props["plotDimensions"];
|
|
61
|
+
labelInterval: Props["labelInterval"];
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
type State = {
|
|
65
|
+
values: Array<number>;
|
|
66
|
+
categoryHeights: Record<string, number>;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export class Plotter extends React.Component<Props, State> {
|
|
70
|
+
// @ts-expect-error - TS2564 - Property 'shouldSetupGraphie' has no initializer and is not definitely assigned in the constructor.
|
|
50
71
|
shouldSetupGraphie: boolean;
|
|
51
72
|
_isMounted = false;
|
|
52
73
|
horizHairline: any;
|
|
53
74
|
hairlineRange: any;
|
|
54
75
|
graphie: any;
|
|
55
76
|
|
|
56
|
-
static
|
|
57
|
-
onChange: PropTypes.func.isRequired,
|
|
58
|
-
trackInteraction: PropTypes.func.isRequired,
|
|
59
|
-
// TODO(alex): Figure out why lint chokes on this line
|
|
60
|
-
// ...widgetPropTypes,
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
static defaultProps: any = {
|
|
77
|
+
static defaultProps: DefaultProps = {
|
|
64
78
|
type: BAR,
|
|
65
79
|
labels: ["", ""],
|
|
66
80
|
categories: [""],
|
|
@@ -77,7 +91,7 @@ class Plotter extends React.Component<any, any> {
|
|
|
77
91
|
labelInterval: 1,
|
|
78
92
|
};
|
|
79
93
|
|
|
80
|
-
state:
|
|
94
|
+
state: State = {
|
|
81
95
|
values: this.props.starting || [1],
|
|
82
96
|
|
|
83
97
|
// The measured rendered height of category strings. Used to calculate
|
|
@@ -86,57 +100,13 @@ class Plotter extends React.Component<any, any> {
|
|
|
86
100
|
categoryHeights: {},
|
|
87
101
|
};
|
|
88
102
|
|
|
89
|
-
DOT_PLOT_POINT_SIZE: () => number = () => {
|
|
90
|
-
return this.props.apiOptions.isMobile ? 6 : 4;
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
DOT_PLOT_POINT_PADDING: () => number = () => {
|
|
94
|
-
return 8;
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
DOT_TICK_POINT_SIZE: () => number = () => {
|
|
98
|
-
return 2;
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
render(): React.ReactNode {
|
|
102
|
-
// TODO(kevinb) actually compute the size of the graphie correctly and
|
|
103
|
-
// make it that size so we don't have to add extra padding. The value
|
|
104
|
-
// was determined by eye-balling the layout. :(
|
|
105
|
-
const paddingForBottomLabel = 75;
|
|
106
|
-
const style = {
|
|
107
|
-
marginBottom: this.props.labels[0] ? paddingForBottomLabel : 0,
|
|
108
|
-
} as const;
|
|
109
|
-
|
|
110
|
-
return (
|
|
111
|
-
<div
|
|
112
|
-
className={
|
|
113
|
-
"perseus-widget-plotter graphie " +
|
|
114
|
-
ApiClassNames.INTERACTIVE
|
|
115
|
-
}
|
|
116
|
-
// eslint-disable-next-line react/no-string-refs
|
|
117
|
-
ref="graphieDiv"
|
|
118
|
-
style={style}
|
|
119
|
-
/>
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
componentDidUpdate(prevProps: any, prevState: any) {
|
|
124
|
-
this.shouldSetupGraphie =
|
|
125
|
-
this.shouldSetupGraphie ||
|
|
126
|
-
!_.isEqual(this.state.categoryHeights, prevState.categoryHeights);
|
|
127
|
-
|
|
128
|
-
if (this.shouldSetupGraphie) {
|
|
129
|
-
this.setupGraphie(prevState);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
103
|
componentDidMount() {
|
|
134
104
|
this._isMounted = true;
|
|
135
105
|
|
|
136
106
|
this.setupGraphie(this.state);
|
|
137
107
|
}
|
|
138
108
|
|
|
139
|
-
UNSAFE_componentWillReceiveProps(nextProps:
|
|
109
|
+
UNSAFE_componentWillReceiveProps(nextProps: Props) {
|
|
140
110
|
const props = [
|
|
141
111
|
"type",
|
|
142
112
|
"labels",
|
|
@@ -151,10 +121,7 @@ class Plotter extends React.Component<any, any> {
|
|
|
151
121
|
|
|
152
122
|
this.shouldSetupGraphie = _.any(
|
|
153
123
|
props,
|
|
154
|
-
|
|
155
|
-
// @ts-expect-error [FEI-5003] - TS2683 - 'this' implicitly has type 'any' because it does not have a type annotation.
|
|
156
|
-
return !_.isEqual(this.props[prop], nextProps[prop]);
|
|
157
|
-
},
|
|
124
|
+
(prop) => !_.isEqual(this.props[prop], nextProps[prop]),
|
|
158
125
|
this,
|
|
159
126
|
);
|
|
160
127
|
|
|
@@ -167,15 +134,37 @@ class Plotter extends React.Component<any, any> {
|
|
|
167
134
|
}
|
|
168
135
|
}
|
|
169
136
|
|
|
137
|
+
componentDidUpdate(prevProps: Props, prevState: State) {
|
|
138
|
+
this.shouldSetupGraphie =
|
|
139
|
+
this.shouldSetupGraphie ||
|
|
140
|
+
!_.isEqual(this.state.categoryHeights, prevState.categoryHeights);
|
|
141
|
+
|
|
142
|
+
if (this.shouldSetupGraphie) {
|
|
143
|
+
this.setupGraphie(prevState);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
170
147
|
componentWillUnmount() {
|
|
171
148
|
this._isMounted = false;
|
|
172
149
|
}
|
|
173
150
|
|
|
151
|
+
DOT_PLOT_POINT_SIZE: () => number = () => {
|
|
152
|
+
return this.props.apiOptions.isMobile ? 6 : 4;
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
DOT_PLOT_POINT_PADDING: () => number = () => {
|
|
156
|
+
return 8;
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
DOT_TICK_POINT_SIZE: () => number = () => {
|
|
160
|
+
return 2;
|
|
161
|
+
};
|
|
162
|
+
|
|
174
163
|
setupGraphie: (arg1: any) => void = (prevState) => {
|
|
175
164
|
const self = this;
|
|
176
165
|
self.shouldSetupGraphie = false;
|
|
177
166
|
const graphieDiv = ReactDOM.findDOMNode(self.refs.graphieDiv);
|
|
178
|
-
// @ts-expect-error
|
|
167
|
+
// @ts-expect-error - TS2769 - No overload matches this call. | TS2339 - Property 'empty' does not exist on type 'JQueryStatic'.
|
|
179
168
|
$(graphieDiv).empty();
|
|
180
169
|
const graphie = GraphUtils.createGraphie(graphieDiv);
|
|
181
170
|
|
|
@@ -186,11 +175,11 @@ class Plotter extends React.Component<any, any> {
|
|
|
186
175
|
self.graphie.pics = [];
|
|
187
176
|
self.graphie.dotTicks = [];
|
|
188
177
|
|
|
189
|
-
const isBar = self.props.type === BAR
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
178
|
+
const isBar = self.props.type === BAR;
|
|
179
|
+
const isLine = self.props.type === LINE;
|
|
180
|
+
const isPic = self.props.type === PIC;
|
|
181
|
+
const isHistogram = self.props.type === HISTOGRAM;
|
|
182
|
+
const isDotplot = self.props.type === DOTPLOT;
|
|
194
183
|
|
|
195
184
|
const isTiledPlot = isPic || isDotplot;
|
|
196
185
|
|
|
@@ -264,7 +253,6 @@ class Plotter extends React.Component<any, any> {
|
|
|
264
253
|
if (isMobile && (isBar || isTiledPlot)) {
|
|
265
254
|
const maxCategoryHeight = Math.max(
|
|
266
255
|
0,
|
|
267
|
-
// @ts-expect-error [FEI-5003] - TS2345 - Argument of type 'unknown' is not assignable to parameter of type 'number'.
|
|
268
256
|
...Object.values(self.state.categoryHeights),
|
|
269
257
|
);
|
|
270
258
|
|
|
@@ -340,7 +328,7 @@ class Plotter extends React.Component<any, any> {
|
|
|
340
328
|
}
|
|
341
329
|
}
|
|
342
330
|
|
|
343
|
-
if ((isBar || isLine) && isMobile) {
|
|
331
|
+
if ((isBar || isLine) && isMobile && !this.props.static) {
|
|
344
332
|
self.graphie.dragPrompt = graphie
|
|
345
333
|
.label(
|
|
346
334
|
[c.dimX / 2, c.dimY / 2],
|
|
@@ -573,7 +561,7 @@ class Plotter extends React.Component<any, any> {
|
|
|
573
561
|
_.each(self.props.categories, function (category, i) {
|
|
574
562
|
const x = 0.5 + i * c.barWidth;
|
|
575
563
|
|
|
576
|
-
// @ts-expect-error
|
|
564
|
+
// @ts-expect-error - TS2345 - Argument of type 'Promise<any>' is not assignable to parameter of type 'never'.
|
|
577
565
|
categoryHeightPromises.push(self.labelCategory(x, category));
|
|
578
566
|
const tickHeight = 6 / c.scale[1];
|
|
579
567
|
graphie.style(
|
|
@@ -623,7 +611,7 @@ class Plotter extends React.Component<any, any> {
|
|
|
623
611
|
i === self.props.categories.length - 1
|
|
624
612
|
) {
|
|
625
613
|
categoryHeightPromises.push(
|
|
626
|
-
// @ts-expect-error
|
|
614
|
+
// @ts-expect-error - TS2345 - Argument of type 'Promise<any>' is not assignable to parameter of type 'never'.
|
|
627
615
|
self.labelCategory(x, category),
|
|
628
616
|
);
|
|
629
617
|
tickStart *= 1.5;
|
|
@@ -631,7 +619,7 @@ class Plotter extends React.Component<any, any> {
|
|
|
631
619
|
}
|
|
632
620
|
} else {
|
|
633
621
|
categoryHeightPromises.push(
|
|
634
|
-
// @ts-expect-error
|
|
622
|
+
// @ts-expect-error - TS2345 - Argument of type 'Promise<any>' is not assignable to parameter of type 'never'.
|
|
635
623
|
self.labelCategory(x, category),
|
|
636
624
|
);
|
|
637
625
|
}
|
|
@@ -721,8 +709,8 @@ class Plotter extends React.Component<any, any> {
|
|
|
721
709
|
|
|
722
710
|
if (isHistogram) {
|
|
723
711
|
// Scale dividers between buckets
|
|
724
|
-
const leftDivider = config.graph.dividers[i - 1]
|
|
725
|
-
|
|
712
|
+
const leftDivider = config.graph.dividers[i - 1];
|
|
713
|
+
const rightDivider = config.graph.dividers[i];
|
|
726
714
|
|
|
727
715
|
if (leftDivider) {
|
|
728
716
|
const divHeight = Math.min(
|
|
@@ -927,7 +915,7 @@ class Plotter extends React.Component<any, any> {
|
|
|
927
915
|
if (i > 0) {
|
|
928
916
|
c.graph.lines[i] = Interactive2.addMovableLine(graphie, {
|
|
929
917
|
points: [c.graph.points[i - 1], c.graph.points[i]],
|
|
930
|
-
// @ts-expect-error
|
|
918
|
+
// @ts-expect-error - TS2339 - Property 'constraints' does not exist on type '(graphie: any, movable: any, options: any) => void'.
|
|
931
919
|
constraints: Interactive2.MovablePoint.constraints.fixed(),
|
|
932
920
|
normalStyle: {
|
|
933
921
|
stroke: KhanColors.BLUE_C,
|
|
@@ -1051,7 +1039,7 @@ class Plotter extends React.Component<any, any> {
|
|
|
1051
1039
|
.css({fill: "#000", opacity: 0.0, cursor: "pointer"})
|
|
1052
1040
|
.on("vmousedown", function (e) {
|
|
1053
1041
|
e.preventDefault();
|
|
1054
|
-
// @ts-expect-error
|
|
1042
|
+
// @ts-expect-error - TS2339 - Property 'whichPicClicked' does not exist on type 'Plotter'.
|
|
1055
1043
|
self.whichPicClicked = i;
|
|
1056
1044
|
self.setPicHeight(i, topY);
|
|
1057
1045
|
|
|
@@ -1081,7 +1069,7 @@ class Plotter extends React.Component<any, any> {
|
|
|
1081
1069
|
newMidY + 0.5 * c.scaleY,
|
|
1082
1070
|
c.dimY,
|
|
1083
1071
|
);
|
|
1084
|
-
// @ts-expect-error
|
|
1072
|
+
// @ts-expect-error - TS2339 - Property 'whichPicClicked' does not exist on type 'Plotter'.
|
|
1085
1073
|
self.setPicHeight(self.whichPicClicked, newTopY);
|
|
1086
1074
|
});
|
|
1087
1075
|
});
|
|
@@ -1170,9 +1158,31 @@ class Plotter extends React.Component<any, any> {
|
|
|
1170
1158
|
};
|
|
1171
1159
|
|
|
1172
1160
|
simpleValidate: (arg1: any) => any = (rubric) => {
|
|
1173
|
-
// @ts-expect-error
|
|
1161
|
+
// @ts-expect-error - TS2339 - Property 'validate' does not exist on type 'typeof Plotter'.
|
|
1174
1162
|
return Plotter.validate(this.getUserInput(), rubric);
|
|
1175
1163
|
};
|
|
1164
|
+
|
|
1165
|
+
render(): React.ReactNode {
|
|
1166
|
+
// TODO(kevinb) actually compute the size of the graphie correctly and
|
|
1167
|
+
// make it that size so we don't have to add extra padding. The value
|
|
1168
|
+
// was determined by eye-balling the layout. :(
|
|
1169
|
+
const paddingForBottomLabel = 75;
|
|
1170
|
+
const style = {
|
|
1171
|
+
marginBottom: this.props.labels[0] ? paddingForBottomLabel : 0,
|
|
1172
|
+
} as const;
|
|
1173
|
+
|
|
1174
|
+
return (
|
|
1175
|
+
<div
|
|
1176
|
+
className={
|
|
1177
|
+
"perseus-widget-plotter graphie " +
|
|
1178
|
+
ApiClassNames.INTERACTIVE
|
|
1179
|
+
}
|
|
1180
|
+
// eslint-disable-next-line react/no-string-refs
|
|
1181
|
+
ref="graphieDiv"
|
|
1182
|
+
style={style}
|
|
1183
|
+
/>
|
|
1184
|
+
);
|
|
1185
|
+
}
|
|
1176
1186
|
}
|
|
1177
1187
|
|
|
1178
1188
|
_.extend(Plotter, {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable @khanacademy/ts-no-error-suppressions */
|
|
1
2
|
import * as i18n from "@khanacademy/wonder-blocks-i18n";
|
|
2
3
|
import {StyleSheet, css} from "aphrodite";
|
|
3
4
|
import classNames from "classnames";
|
|
@@ -130,7 +131,7 @@ const BaseRadio = function (props: Props): React.ReactElement {
|
|
|
130
131
|
// note(matthew): we know this is only getting passed
|
|
131
132
|
// to a WB Clickable button, so we force it to be of
|
|
132
133
|
// type HTMLButtonElement
|
|
133
|
-
// @ts-expect-error
|
|
134
|
+
// @ts-expect-error - TS2339 - Property 'current' does not exist on type 'never'.
|
|
134
135
|
const anyNode = ReactDOM.findDOMNode(ref.current) as any;
|
|
135
136
|
const buttonNode = anyNode as
|
|
136
137
|
| HTMLButtonElement
|
|
@@ -142,7 +143,7 @@ const BaseRadio = function (props: Props): React.ReactElement {
|
|
|
142
143
|
}
|
|
143
144
|
}
|
|
144
145
|
|
|
145
|
-
// @ts-expect-error
|
|
146
|
+
// @ts-expect-error - TS2322 - Type 'PerseusRadioWidgetOptions | undefined' is not assignable to type 'undefined'.
|
|
146
147
|
prevReviewModeRubric.current = reviewModeRubric;
|
|
147
148
|
}, [apiOptions, choices, isLastUsedWidget, reviewModeRubric]);
|
|
148
149
|
|
|
@@ -199,7 +200,7 @@ const BaseRadio = function (props: Props): React.ReactElement {
|
|
|
199
200
|
// note(matthew): we know this is only getting passed
|
|
200
201
|
// to a WB Clickable button, so we force it to be of
|
|
201
202
|
// type HTMLButtonElement
|
|
202
|
-
// @ts-expect-error
|
|
203
|
+
// @ts-expect-error - TS2339 - Property 'current' does not exist on type 'never'.
|
|
203
204
|
const anyNode = ReactDOM.findDOMNode(ref.current) as any;
|
|
204
205
|
const buttonNode = anyNode as HTMLButtonElement | null | undefined;
|
|
205
206
|
|
|
@@ -249,16 +250,16 @@ const BaseRadio = function (props: Props): React.ReactElement {
|
|
|
249
250
|
className={`perseus-widget-radio-fieldset ${responsiveClassName}`}
|
|
250
251
|
>
|
|
251
252
|
<legend className="perseus-sr-only">{instructions}</legend>
|
|
252
|
-
{/* @ts-expect-error
|
|
253
|
+
{/* @ts-expect-error - TS2322 - Type 'readonly string[]' is not assignable to type 'string'. */}
|
|
253
254
|
<div className={instructionsClassName} aria-hidden="true">
|
|
254
255
|
{instructions}
|
|
255
256
|
</div>
|
|
256
|
-
{/* @ts-expect-error
|
|
257
|
+
{/* @ts-expect-error - TS2322 - Type 'readonly string[]' is not assignable to type 'string'. */}
|
|
257
258
|
<ul className={className} style={{listStyle: "none"}}>
|
|
258
259
|
{choices.map((choice, i) => {
|
|
259
260
|
let Element = Choice;
|
|
260
261
|
const ref = React.createRef<any>();
|
|
261
|
-
// @ts-expect-error
|
|
262
|
+
// @ts-expect-error - TS2322 - Type 'RefObject<unknown>' is not assignable to type 'never'.
|
|
262
263
|
choiceRefs.current[i] = ref;
|
|
263
264
|
const elementProps = {
|
|
264
265
|
apiOptions: apiOptions,
|
|
@@ -348,7 +349,7 @@ const BaseRadio = function (props: Props): React.ReactElement {
|
|
|
348
349
|
let listElem = null;
|
|
349
350
|
let clickHandler = null;
|
|
350
351
|
if (editMode) {
|
|
351
|
-
// @ts-expect-error
|
|
352
|
+
// @ts-expect-error - TS2322 - Type '(e: any) => void' is not assignable to type 'null'.
|
|
352
353
|
clickHandler = (e: any) => {
|
|
353
354
|
// Traverse the parent nodes of the clicked
|
|
354
355
|
// element.
|
|
@@ -377,13 +378,13 @@ const BaseRadio = function (props: Props): React.ReactElement {
|
|
|
377
378
|
return (
|
|
378
379
|
<li
|
|
379
380
|
key={i}
|
|
380
|
-
// @ts-expect-error
|
|
381
|
+
// @ts-expect-error - TS2322 - Type 'HTMLLIElement | null' is not assignable to type 'null'.
|
|
381
382
|
ref={(e) => (listElem = e)}
|
|
382
|
-
// @ts-expect-error
|
|
383
|
+
// @ts-expect-error - TS2322 - Type 'readonly string[]' is not assignable to type 'string'.
|
|
383
384
|
className={className}
|
|
384
|
-
// @ts-expect-error
|
|
385
|
+
// @ts-expect-error - TS2322 - Type 'null' is not assignable to type 'MouseEventHandler<HTMLLIElement> | undefined'.
|
|
385
386
|
onClick={clickHandler}
|
|
386
|
-
// @ts-expect-error
|
|
387
|
+
// @ts-expect-error - TS2322 - Type '((e: TouchEvent) => void) | null' is not assignable to type 'TouchEventHandler<HTMLLIElement> | undefined'.
|
|
387
388
|
onTouchStart={
|
|
388
389
|
!labelWrap ? null : captureScratchpadTouchStart
|
|
389
390
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable @khanacademy/ts-no-error-suppressions */
|
|
1
2
|
/* Component for rendering a letter icon in a library radio choice */
|
|
2
3
|
|
|
3
4
|
import Color from "@khanacademy/wonder-blocks-color";
|
|
@@ -128,7 +129,7 @@ const ChoiceIcon = function (props: ChoiceIconProps): React.ReactElement {
|
|
|
128
129
|
multipleSelect={multipleSelect}
|
|
129
130
|
>
|
|
130
131
|
<div
|
|
131
|
-
// @ts-expect-error
|
|
132
|
+
// @ts-expect-error - TS2322 - Type '{ backgroundColor: string | null | undefined; borderColor: string; color: string; borderRadius: number; }' is not assignable to type 'Properties<string | number, string & {}>'.
|
|
132
133
|
style={dynamicStyles}
|
|
133
134
|
data-test-id="choice-icon__library-choice-icon"
|
|
134
135
|
className={css(
|
|
@@ -145,7 +146,7 @@ const ChoiceIcon = function (props: ChoiceIconProps): React.ReactElement {
|
|
|
145
146
|
data-is-radio-icon={true}
|
|
146
147
|
>
|
|
147
148
|
<div className={css(styles.innerWrapper)}>
|
|
148
|
-
{/* @ts-expect-error
|
|
149
|
+
{/* @ts-expect-error - TS2786 - 'ChoiceInner' cannot be used as a JSX component. */}
|
|
149
150
|
<ChoiceInner
|
|
150
151
|
pos={pos}
|
|
151
152
|
showCorrectness={showCorrectness}
|
|
@@ -148,7 +148,7 @@ const Choice = function (props: ChoicePropsWithForwardRef): React.ReactElement {
|
|
|
148
148
|
return (
|
|
149
149
|
<div
|
|
150
150
|
style={{
|
|
151
|
-
// @ts-expect-error
|
|
151
|
+
// @ts-expect-error - TS2322 - Type '{ dispay: string; flexDirection: "column"; color: string; }' is not assignable to type 'Properties<string | number, string & {}>'.
|
|
152
152
|
dispay: "flex",
|
|
153
153
|
flexDirection: "column",
|
|
154
154
|
color: Color.offBlack,
|
|
@@ -54,7 +54,7 @@ const OptionStatus = function (props: Props): React.ReactElement {
|
|
|
54
54
|
// Option status is shown only in review mode, or for incorrectly
|
|
55
55
|
// answered items.
|
|
56
56
|
if (!reviewMode && !previouslyAnswered) {
|
|
57
|
-
// @ts-expect-error
|
|
57
|
+
// @ts-expect-error - TS2322 - Type 'null' is not assignable to type 'ReactElement<any, string | JSXElementConstructor<any>>'.
|
|
58
58
|
return null;
|
|
59
59
|
}
|
|
60
60
|
|
|
@@ -54,7 +54,7 @@ export type RadioChoiceWithMetadata = PerseusRadioChoice & {
|
|
|
54
54
|
};
|
|
55
55
|
|
|
56
56
|
class Radio extends React.Component<Props> {
|
|
57
|
-
// @ts-expect-error
|
|
57
|
+
// @ts-expect-error - TS2564 - Property 'focusFunction' has no initializer and is not definitely assigned in the constructor.
|
|
58
58
|
focusFunction: FocusFunction;
|
|
59
59
|
|
|
60
60
|
static defaultProps: DefaultProps = {
|
|
@@ -140,7 +140,7 @@ class Radio extends React.Component<Props> {
|
|
|
140
140
|
choicesSelected[index] = choiceStates[i].selected;
|
|
141
141
|
|
|
142
142
|
if (props.choices[i].isNoneOfTheAbove) {
|
|
143
|
-
// @ts-expect-error
|
|
143
|
+
// @ts-expect-error - TS2322 - Type 'number' is not assignable to type 'null'.
|
|
144
144
|
noneOfTheAboveIndex = index;
|
|
145
145
|
|
|
146
146
|
if (choicesSelected[i]) {
|
|
@@ -174,7 +174,7 @@ class Radio extends React.Component<Props> {
|
|
|
174
174
|
choicesSelected[index] = values[i];
|
|
175
175
|
|
|
176
176
|
if (props.choices[i].isNoneOfTheAbove) {
|
|
177
|
-
// @ts-expect-error
|
|
177
|
+
// @ts-expect-error - TS2322 - Type 'number' is not assignable to type 'null'.
|
|
178
178
|
noneOfTheAboveIndex = index;
|
|
179
179
|
if (choicesSelected[i]) {
|
|
180
180
|
noneOfTheAboveSelected = true;
|
|
@@ -246,7 +246,7 @@ class Radio extends React.Component<Props> {
|
|
|
246
246
|
alwaysUpdate={true}
|
|
247
247
|
linterContext={{
|
|
248
248
|
...this.props.linterContext,
|
|
249
|
-
// @ts-expect-error
|
|
249
|
+
// @ts-expect-error - TS2322 - Type '{ blockHighlight: true; contentType: string; highlightLint: boolean; paths: readonly string[]; stack: readonly string[]; }' is not assignable to type 'LinterContextProps'.
|
|
250
250
|
blockHighlight: true,
|
|
251
251
|
}}
|
|
252
252
|
/>
|
|
@@ -370,7 +370,7 @@ class Radio extends React.Component<Props> {
|
|
|
370
370
|
{
|
|
371
371
|
choiceStates: newStates,
|
|
372
372
|
},
|
|
373
|
-
// @ts-expect-error
|
|
373
|
+
// @ts-expect-error - TS2345 - Argument of type 'null' is not assignable to parameter of type '(() => unknown) | undefined'.
|
|
374
374
|
null, // cb
|
|
375
375
|
true, // silent
|
|
376
376
|
);
|
|
@@ -396,7 +396,7 @@ class Radio extends React.Component<Props> {
|
|
|
396
396
|
{
|
|
397
397
|
choiceStates: newStates,
|
|
398
398
|
},
|
|
399
|
-
// @ts-expect-error
|
|
399
|
+
// @ts-expect-error - TS2345 - Argument of type 'null' is not assignable to parameter of type '(() => unknown) | undefined'.
|
|
400
400
|
null, // cb
|
|
401
401
|
false, // silent
|
|
402
402
|
);
|
package/src/widgets/radio.ts
CHANGED
|
@@ -47,7 +47,7 @@ const _choiceTransform = (
|
|
|
47
47
|
|
|
48
48
|
const newChoices = choices.filter((choice, index) => {
|
|
49
49
|
if (choice.isNoneOfTheAbove) {
|
|
50
|
-
// @ts-expect-error
|
|
50
|
+
// @ts-expect-error - TS2322 - Type 'RadioChoiceWithMetadata' is not assignable to type 'null'.
|
|
51
51
|
noneOfTheAbove = choice;
|
|
52
52
|
return false;
|
|
53
53
|
}
|
|
@@ -26,26 +26,26 @@ class Separator extends React.Component<any> {
|
|
|
26
26
|
drawArrow = () => {
|
|
27
27
|
// eslint-disable-next-line react/no-string-refs
|
|
28
28
|
const canvas = this.refs["arrowCanvas" + this.props.index];
|
|
29
|
-
// @ts-expect-error
|
|
29
|
+
// @ts-expect-error - TS2339 - Property 'getContext' does not exist on type 'ReactInstance'.
|
|
30
30
|
const ctx = canvas.getContext("2d");
|
|
31
|
-
// @ts-expect-error
|
|
31
|
+
// @ts-expect-error - TS2339 - Property 'width' does not exist on type 'ReactInstance'. | TS2339 - Property 'height' does not exist on type 'ReactInstance'.
|
|
32
32
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
33
33
|
const path = new Path2D();
|
|
34
34
|
ctx.strokeStyle = "rgb(0,0,0)";
|
|
35
35
|
ctx.lineWidth = 1.2;
|
|
36
36
|
ctx.lineCap = "round";
|
|
37
37
|
const offset = 5;
|
|
38
|
-
// @ts-expect-error
|
|
38
|
+
// @ts-expect-error - TS2339 - Property 'height' does not exist on type 'ReactInstance'.
|
|
39
39
|
path.moveTo(offset, canvas.height / 2);
|
|
40
|
-
// @ts-expect-error
|
|
40
|
+
// @ts-expect-error - TS2339 - Property 'width' does not exist on type 'ReactInstance'. | TS2339 - Property 'height' does not exist on type 'ReactInstance'.
|
|
41
41
|
path.lineTo(canvas.width - offset, canvas.height / 2);
|
|
42
|
-
// @ts-expect-error
|
|
42
|
+
// @ts-expect-error - TS2339 - Property 'width' does not exist on type 'ReactInstance'. | TS2339 - Property 'height' does not exist on type 'ReactInstance'.
|
|
43
43
|
path.moveTo(canvas.width - 2 * offset, canvas.height / 2 - offset);
|
|
44
|
-
// @ts-expect-error
|
|
44
|
+
// @ts-expect-error - TS2339 - Property 'width' does not exist on type 'ReactInstance'. | TS2339 - Property 'height' does not exist on type 'ReactInstance'.
|
|
45
45
|
path.lineTo(canvas.width - offset, canvas.height / 2);
|
|
46
|
-
// @ts-expect-error
|
|
46
|
+
// @ts-expect-error - TS2339 - Property 'width' does not exist on type 'ReactInstance'. | TS2339 - Property 'height' does not exist on type 'ReactInstance'.
|
|
47
47
|
path.moveTo(canvas.width - 2 * offset, canvas.height / 2 + offset);
|
|
48
|
-
// @ts-expect-error
|
|
48
|
+
// @ts-expect-error - TS2339 - Property 'width' does not exist on type 'ReactInstance'. | TS2339 - Property 'height' does not exist on type 'ReactInstance'.
|
|
49
49
|
path.lineTo(canvas.width - offset, canvas.height / 2);
|
|
50
50
|
ctx.stroke(path);
|
|
51
51
|
};
|
package/src/widgets/sequence.tsx
CHANGED
|
@@ -5,10 +5,10 @@ import _ from "underscore";
|
|
|
5
5
|
import InlineIcon from "../components/inline-icon";
|
|
6
6
|
import {iconOk} from "../icon-paths";
|
|
7
7
|
import * as Changeable from "../mixins/changeable";
|
|
8
|
-
import {PerseusSequenceWidgetOptions} from "../perseus-types";
|
|
9
8
|
import Renderer from "../renderer";
|
|
10
9
|
import Util from "../util";
|
|
11
10
|
|
|
11
|
+
import type {PerseusSequenceWidgetOptions} from "../perseus-types";
|
|
12
12
|
import type {WidgetExports, WidgetProps} from "../types";
|
|
13
13
|
|
|
14
14
|
type Rubric = PerseusSequenceWidgetOptions;
|
|
@@ -54,7 +54,7 @@ class Sequence extends React.Component<Props, State> {
|
|
|
54
54
|
const step = parseInt(groupWidgetId.split(" ")[1]);
|
|
55
55
|
if (step === this.state.visible - 1) {
|
|
56
56
|
// eslint-disable-next-line react/no-string-refs
|
|
57
|
-
// @ts-expect-error
|
|
57
|
+
// @ts-expect-error - TS2339 - Property 'getWidgetInstance' does not exist on type 'ReactInstance'.
|
|
58
58
|
const widget = this.refs.renderer.getWidgetInstance(
|
|
59
59
|
"group " + step,
|
|
60
60
|
);
|