@khanacademy/perseus-editor 0.0.1 → 0.1.2

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.
Files changed (127) hide show
  1. package/.babelrc.js +1 -1
  2. package/CHANGELOG.md +26 -0
  3. package/dist/es/index.css +1020 -0
  4. package/dist/es/index.js +9 -1
  5. package/dist/es/index.js.map +1 -1
  6. package/dist/index.css +1020 -0
  7. package/dist/index.js +9 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/strings.js +6 -1
  10. package/package.json +16 -4
  11. package/src/README.md +7 -0
  12. package/src/__stories__/editor.stories.js +33 -0
  13. package/src/__stories__/section-control-button.stories.jsx +27 -0
  14. package/src/__testdata__/input-number_testdata.js +28 -0
  15. package/src/__tests__/editor_test.jsx +123 -0
  16. package/src/__tests__/i18n_test.jsx +585 -0
  17. package/src/__tests__/traversal_test.jsx +378 -0
  18. package/src/all-editors.js +85 -0
  19. package/src/all-editors_test.js +17 -0
  20. package/src/all-widgets.js +10 -0
  21. package/src/article-editor.jsx +437 -0
  22. package/src/components/__stories__/blur-input.stories.jsx +24 -0
  23. package/src/components/blur-input.jsx +62 -0
  24. package/src/components/checkbox.jsx +194 -0
  25. package/src/components/device-framer.jsx +91 -0
  26. package/src/components/drag-target.jsx +88 -0
  27. package/src/components/dropdown-option.jsx +318 -0
  28. package/src/components/form-wrapped-text-field.jsx +248 -0
  29. package/src/components/graph-settings.jsx +631 -0
  30. package/src/components/hover-behavior.jsx +178 -0
  31. package/src/components/json-editor.jsx +121 -0
  32. package/src/components/link.jsx +173 -0
  33. package/src/components/simple-button.jsx +86 -0
  34. package/src/components/sortable.jsx +186 -0
  35. package/src/components/util.js +39 -0
  36. package/src/components/viewport-resizer.jsx +73 -0
  37. package/src/diffs/__stories__/perseus-diff-wrapper.jsx +8 -0
  38. package/src/diffs/__stories__/structured-item-diff.stories.jsx +855 -0
  39. package/src/diffs/__stories__/tags-diff.stories.jsx +38 -0
  40. package/src/diffs/__stories__/text-diff.stories.jsx +37 -0
  41. package/src/diffs/__tests__/split-diff_test.js +34 -0
  42. package/src/diffs/__tests__/string-array-diff_test.js +74 -0
  43. package/src/diffs/__tests__/structured-item-diff_test.js +432 -0
  44. package/src/diffs/__tests__/widget-diff-performer_test.js +44 -0
  45. package/src/diffs/article-diff.jsx +70 -0
  46. package/src/diffs/item-diff.jsx +77 -0
  47. package/src/diffs/renderer-diff.jsx +143 -0
  48. package/src/diffs/split-diff.jsx +30 -0
  49. package/src/diffs/string-array-diff.jsx +75 -0
  50. package/src/diffs/structured-item-diff.jsx +269 -0
  51. package/src/diffs/tags-diff.jsx +50 -0
  52. package/src/diffs/text-diff.jsx +194 -0
  53. package/src/diffs/widget-diff-performer.jsx +74 -0
  54. package/src/diffs/widget-diff.jsx +291 -0
  55. package/src/editor-page.jsx +351 -0
  56. package/src/editor.jsx +1364 -0
  57. package/src/hint-editor.jsx +447 -0
  58. package/src/i18n.jsx +139 -0
  59. package/src/iframe-content-renderer.jsx +201 -0
  60. package/src/index.js +27 -8
  61. package/src/item-editor.jsx +159 -0
  62. package/src/item-extras-editor.jsx +150 -0
  63. package/src/katex-error-view.jsx +87 -0
  64. package/src/multirenderer-editor.jsx +1074 -0
  65. package/src/section-control-button.jsx +53 -0
  66. package/src/stateful-article-editor.jsx +176 -0
  67. package/src/stateful-editor-page.jsx +90 -0
  68. package/src/styles/perseus-editor.less +1339 -0
  69. package/src/testing-widgets.js +12 -0
  70. package/src/util/register-all-widgets-and-editors-for-testing.js +15 -0
  71. package/src/util/register-all-widgets-and-editors-for-testing_test.js +18 -0
  72. package/src/widgets/__stories__/label-image-editor.stories.jsx +97 -0
  73. package/src/widgets/categorizer-editor.jsx +103 -0
  74. package/src/widgets/cs-program-editor.jsx +258 -0
  75. package/src/widgets/definition-editor.jsx +75 -0
  76. package/src/widgets/dropdown-editor.jsx +201 -0
  77. package/src/widgets/example-graphie-widget-editor.jsx +70 -0
  78. package/src/widgets/example-graphie-widget.jsx +175 -0
  79. package/src/widgets/example-widget-editor.jsx +60 -0
  80. package/src/widgets/example-widget.jsx +153 -0
  81. package/src/widgets/explanation-editor.jsx +89 -0
  82. package/src/widgets/expression-editor.jsx +560 -0
  83. package/src/widgets/graded-group-editor.jsx +162 -0
  84. package/src/widgets/graded-group-set-editor.jsx +101 -0
  85. package/src/widgets/grapher-editor.jsx +154 -0
  86. package/src/widgets/group-editor.jsx +83 -0
  87. package/src/widgets/iframe-editor.jsx +200 -0
  88. package/src/widgets/image-editor.jsx +326 -0
  89. package/src/widgets/input-number-editor.jsx +269 -0
  90. package/src/widgets/interaction/constraint-editor.jsx +147 -0
  91. package/src/widgets/interaction-editor.jsx +1389 -0
  92. package/src/widgets/interactive-graph-editor.jsx +322 -0
  93. package/src/widgets/label-image/__stories__/answer-choices.stories.jsx +81 -0
  94. package/src/widgets/label-image/__stories__/behavior.stories.jsx +32 -0
  95. package/src/widgets/label-image/__stories__/marker.stories.jsx +76 -0
  96. package/src/widgets/label-image/__stories__/question-markers.stories.jsx +106 -0
  97. package/src/widgets/label-image/__stories__/select-image.stories.jsx +60 -0
  98. package/src/widgets/label-image/answer-choices.jsx +231 -0
  99. package/src/widgets/label-image/behavior.jsx +92 -0
  100. package/src/widgets/label-image/marker.jsx +292 -0
  101. package/src/widgets/label-image/question-markers.jsx +181 -0
  102. package/src/widgets/label-image/select-image.jsx +86 -0
  103. package/src/widgets/label-image-editor.jsx +257 -0
  104. package/src/widgets/lights-puzzle-editor.jsx +267 -0
  105. package/src/widgets/matcher-editor.jsx +147 -0
  106. package/src/widgets/matrix-editor.jsx +155 -0
  107. package/src/widgets/measurer-editor.jsx +245 -0
  108. package/src/widgets/molecule-editor.jsx +63 -0
  109. package/src/widgets/number-line-editor.jsx +498 -0
  110. package/src/widgets/numeric-input-editor.jsx +554 -0
  111. package/src/widgets/orderer-editor.jsx +166 -0
  112. package/src/widgets/passage-editor.jsx +115 -0
  113. package/src/widgets/passage-ref-editor.jsx +77 -0
  114. package/src/widgets/passage-ref-target-editor.jsx +47 -0
  115. package/src/widgets/plotter-editor.jsx +537 -0
  116. package/src/widgets/radio/editor.jsx +398 -0
  117. package/src/widgets/reaction-diagram-editor.jsx +127 -0
  118. package/src/widgets/sequence-editor.jsx +205 -0
  119. package/src/widgets/simple-markdown-tester-editor.jsx +84 -0
  120. package/src/widgets/simple-markdown-tester.jsx +91 -0
  121. package/src/widgets/simulator-editor.jsx +144 -0
  122. package/src/widgets/sorter-editor.jsx +100 -0
  123. package/src/widgets/table-editor.jsx +164 -0
  124. package/src/widgets/transformer-editor.jsx +1006 -0
  125. package/src/widgets/unit-editor.jsx +293 -0
  126. package/src/widgets/video-editor.jsx +74 -0
  127. package/src/__tests__/index.test.js +0 -15
package/dist/strings.js CHANGED
@@ -5,5 +5,10 @@
5
5
  */
6
6
 
7
7
  module.exports = [
8
- i18n._("foo() = %(foo)s", {}),
8
+ i18n._("\"True Proportion\" Label", {}),
9
+ i18n._("Number of trials", {}),
10
+ i18n._("Proportion or Percentage", {}),
11
+ i18n._("Why is this choice %(correctOrIncorrect)s?", {}),
12
+ i18n._("X-Axis Label", {}),
13
+ i18n._("Y-Axis Label", {}),
9
14
  ];
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "access": "public"
4
4
  },
5
5
  "name": "@khanacademy/perseus-editor",
6
- "version": "0.0.1",
6
+ "version": "0.1.2",
7
7
  "description": "Perseus editors",
8
8
  "module": "dist/es/index.js",
9
9
  "main": "dist/index.js",
@@ -12,18 +12,30 @@
12
12
  "test": "bash -c 'yarn --silent --cwd \"../..\" test ${@:0} $($([[ ${@: -1} = -* ]] || [[ ${@: -1} = bash ]]) && echo $PWD)'"
13
13
  },
14
14
  "dependencies": {
15
- "@khanacademy/perseus": "^0.0.1"
15
+ "@khanacademy/perseus": "^0.2.1"
16
16
  },
17
17
  "devDependencies": {
18
18
  "@khanacademy/wonder-blocks-i18n": "^1.2.3",
19
+ "aphrodite": "^1.2.5",
20
+ "classnames": "^1.1.4",
21
+ "create-react-class": "^15.6.3",
22
+ "jquery": "^2.1.1",
19
23
  "perseus-build-settings": "^0.0.1",
24
+ "prop-types": "^15.6.1",
20
25
  "react": "16.14.0",
21
- "react-dom": "16.14.0"
26
+ "react-dom": "16.14.0",
27
+ "underscore": "^1.4.4"
22
28
  },
23
29
  "peerDependencies": {
24
30
  "@khanacademy/wonder-blocks-i18n": "^1.2.3",
31
+ "aphrodite": "^1.2.5",
32
+ "classnames": "^1.1.4",
33
+ "create-react-class": "^15.6.3",
34
+ "jquery": "^2.1.1",
35
+ "prop-types": "^15.6.1",
25
36
  "react": "16.14.0",
26
- "react-dom": "16.14.0"
37
+ "react-dom": "16.14.0",
38
+ "underscore": "^1.4.4"
27
39
  },
28
40
  "author": "",
29
41
  "license": "MIT"
package/src/README.md ADDED
@@ -0,0 +1,7 @@
1
+ The Perseus editor, with all the widgets.
2
+
3
+ TODO(benkraft): Figure out and document how this relates to the other perseus
4
+ packages.
5
+
6
+ Code-Owner: Learning Platform
7
+ Crowdin-Category: content.chrome
@@ -0,0 +1,33 @@
1
+ // @flow
2
+ import {ApiOptions, Dependencies} from "@khanacademy/perseus";
3
+ import * as React from "react";
4
+
5
+ import {question1} from "../__testdata__/input-number_testdata.js";
6
+ import Editor from "../editor.jsx";
7
+ import {registerAllWidgetsAndEditorsForTesting} from "../util/register-all-widgets-and-editors-for-testing.js";
8
+
9
+ export default {
10
+ title: "Perseus/Editor",
11
+ };
12
+
13
+ export const Rational = (): React.Node => {
14
+ registerAllWidgetsAndEditorsForTesting();
15
+ Dependencies.getDependencies().shouldUseFutureKaTeX(false);
16
+
17
+ return (
18
+ <Editor
19
+ apiOptions={ApiOptions.defaults}
20
+ content={question1.content}
21
+ placeholder=""
22
+ widgets={question1.widgets}
23
+ images={question1.images}
24
+ disabled={false}
25
+ widgetEnabled={true}
26
+ immutableWidgets={false}
27
+ showWordCount={true}
28
+ warnNoPrompt={true}
29
+ warnNoWidgets={true}
30
+ onChange={(props) => {}}
31
+ />
32
+ );
33
+ };
@@ -0,0 +1,27 @@
1
+ // @flow
2
+ import {icons} from "@khanacademy/perseus";
3
+ import * as React from "react";
4
+
5
+ import SectionControlButton from "../section-control-button.jsx";
6
+
7
+ type StoryArgs = {||};
8
+
9
+ type Story = {|
10
+ title: string,
11
+ |};
12
+
13
+ export default ({
14
+ title: "Perseus Editor/Widgets/Section Control Button",
15
+ }: Story);
16
+
17
+ export const ButtonForEditingSectionsOfContentWithInArticleEditor = (
18
+ args: StoryArgs,
19
+ ): React.Node => {
20
+ return (
21
+ <SectionControlButton
22
+ icon={icons.iconTrash}
23
+ onClick={() => {}}
24
+ title="Remove image widget"
25
+ />
26
+ );
27
+ };
@@ -0,0 +1,28 @@
1
+ // @flow
2
+ import type {PerseusRenderer, InputNumberWidget} from "@khanacademy/perseus";
3
+
4
+ export const question1: PerseusRenderer = {
5
+ content:
6
+ "A sequence is defined recursively as follows:\n\n\n$\\qquad\\displaystyle{{a}_{n}}=-\\frac{1}{a_{n-1}-1} \n~~~~~~\\text{ with}\\qquad\\displaystyle{{a}_{0}}=\\frac{1}{2}\\,$\n\n\nFind the term $a_3$ in the sequence.\n\n[[\u2603 input-number 1]]",
7
+ images: {},
8
+ widgets: {
9
+ "input-number 1": ({
10
+ graded: true,
11
+ version: {
12
+ major: 0,
13
+ minor: 0,
14
+ },
15
+ static: false,
16
+ type: "input-number",
17
+ options: {
18
+ maxError: 0.1,
19
+ inexact: false,
20
+ value: 0.5,
21
+ simplify: "required",
22
+ answerType: "number",
23
+ size: "normal",
24
+ },
25
+ alignment: "default",
26
+ }: InputNumberWidget),
27
+ },
28
+ };
@@ -0,0 +1,123 @@
1
+ // @flow
2
+ import {ApiOptions, Dependencies, Widgets} from "@khanacademy/perseus";
3
+ import {render, screen} from "@testing-library/react";
4
+ import userEvent from "@testing-library/user-event";
5
+ import * as React from "react";
6
+ import "@testing-library/jest-dom"; // Imports custom mathers
7
+
8
+ import {testDependencies} from "../../../../testing/test-dependencies.js";
9
+ import {question1} from "../__testdata__/input-number_testdata.js";
10
+ import Editor from "../editor.jsx";
11
+
12
+ describe("Editor", () => {
13
+ beforeEach(() => {
14
+ jest.spyOn(Dependencies, "getDependencies").mockReturnValue(
15
+ testDependencies,
16
+ );
17
+ });
18
+
19
+ describe("input-number widget", () => {
20
+ beforeEach(async () => {
21
+ const [InputNumberWidget, InputNumberEditor] = await Promise.all([
22
+ import("@khanacademy/perseus").then((m) => m.InputNumber),
23
+ import("../widgets/input-number-editor.jsx").then(
24
+ (m) => m.default,
25
+ ),
26
+ ]);
27
+ Widgets.registerWidgets([InputNumberWidget]);
28
+ Widgets.registerEditors([InputNumberEditor]);
29
+ });
30
+
31
+ test("clicking on the widget editor should open it", async () => {
32
+ // Arrange
33
+ testDependencies.shouldUseFutureKaTeX(false);
34
+ render(
35
+ <Editor
36
+ apiOptions={ApiOptions.defaults}
37
+ content={question1.content}
38
+ placeholder=""
39
+ widgets={question1.widgets}
40
+ images={question1.images}
41
+ disabled={false}
42
+ widgetEnabled={true}
43
+ immutableWidgets={false}
44
+ showWordCount={true}
45
+ warnNoPrompt={true}
46
+ warnNoWidgets={true}
47
+ onChange={(props) => {}}
48
+ />,
49
+ );
50
+ await testDependencies.getKaTeX();
51
+
52
+ // Act
53
+ const widgetDisclosure = screen.getByRole("link", {
54
+ name: "input-number 1",
55
+ });
56
+ userEvent.click(widgetDisclosure);
57
+ const correctAnswerInput = screen.getByLabelText("Correct answer:");
58
+
59
+ // Assert
60
+ expect(correctAnswerInput).toHaveValue("0.5");
61
+ });
62
+
63
+ it("should update values", async () => {
64
+ // Arrange
65
+ const changeFn = jest.fn();
66
+ testDependencies.shouldUseFutureKaTeX(false);
67
+ render(
68
+ <Editor
69
+ apiOptions={ApiOptions.defaults}
70
+ content={question1.content}
71
+ placeholder=""
72
+ widgets={question1.widgets}
73
+ images={question1.images}
74
+ disabled={false}
75
+ widgetEnabled={true}
76
+ immutableWidgets={false}
77
+ showWordCount={true}
78
+ warnNoPrompt={true}
79
+ warnNoWidgets={true}
80
+ onChange={changeFn}
81
+ />,
82
+ );
83
+ await testDependencies.getKaTeX();
84
+
85
+ // Act
86
+ const widgetDisclosure = screen.getByRole("link", {
87
+ name: "input-number 1",
88
+ });
89
+ userEvent.click(widgetDisclosure);
90
+ const correctAnswerInput = screen.getByLabelText("Correct answer:");
91
+
92
+ userEvent.clear(correctAnswerInput);
93
+ userEvent.paste(correctAnswerInput, "0.75");
94
+ userEvent.tab(); // blurring the input triggers onChange to be called
95
+
96
+ // Assert
97
+ expect(changeFn).toHaveBeenCalledWith(
98
+ {
99
+ widgets: {
100
+ "input-number 1": {
101
+ graded: true,
102
+ version: {major: 0, minor: 0},
103
+ static: false,
104
+ type: "input-number",
105
+ options: {
106
+ value: 0.75,
107
+ simplify: "required",
108
+ size: "normal",
109
+ inexact: false,
110
+ maxError: 0.1,
111
+ answerType: "number",
112
+ rightAlign: false,
113
+ },
114
+ alignment: "default",
115
+ },
116
+ },
117
+ },
118
+ undefined,
119
+ undefined,
120
+ );
121
+ });
122
+ });
123
+ });