@pie-element/explicit-constructed-response 11.1.1 → 11.1.2-next.1

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 (108) hide show
  1. package/configure.js +2 -0
  2. package/controller.js +1 -0
  3. package/dist/_virtual/_rolldown/runtime.js +4 -0
  4. package/dist/author/alternateResponses.d.ts +34 -0
  5. package/dist/author/alternateResponses.js +113 -0
  6. package/dist/author/alternateSection.d.ts +58 -0
  7. package/dist/author/alternateSection.js +213 -0
  8. package/dist/author/defaults.d.ts +186 -0
  9. package/dist/author/defaults.js +128 -0
  10. package/dist/author/ecr-toolbar.d.ts +41 -0
  11. package/dist/author/ecr-toolbar.js +100 -0
  12. package/dist/author/index.d.ts +42 -0
  13. package/dist/author/index.js +96 -0
  14. package/dist/author/main.d.ts +38 -0
  15. package/dist/author/main.js +291 -0
  16. package/dist/author/markupUtils.d.ts +14 -0
  17. package/dist/author/markupUtils.js +13 -0
  18. package/dist/author/utils.d.ts +9 -0
  19. package/dist/author/utils.js +7 -0
  20. package/dist/browser/author/index.js +3378 -0
  21. package/dist/browser/author/index.js.map +1 -0
  22. package/dist/browser/browser-BC3WygxE.js +360 -0
  23. package/dist/browser/browser-BC3WygxE.js.map +1 -0
  24. package/dist/browser/controller/index.js +4152 -0
  25. package/dist/browser/controller/index.js.map +1 -0
  26. package/dist/browser/delivery/index.js +96 -0
  27. package/dist/browser/delivery/index.js.map +1 -0
  28. package/dist/browser/dist-D5D48-XD.js +45656 -0
  29. package/dist/browser/dist-D5D48-XD.js.map +1 -0
  30. package/dist/browser/dist-D9ARZhQk.js +1426 -0
  31. package/dist/browser/dist-D9ARZhQk.js.map +1 -0
  32. package/dist/browser/explicit-constructed-response.css +2 -0
  33. package/dist/browser/main-B4lD1zyg.js +959 -0
  34. package/dist/browser/main-B4lD1zyg.js.map +1 -0
  35. package/dist/browser/print/index.js +40 -0
  36. package/dist/browser/print/index.js.map +1 -0
  37. package/dist/controller/defaults.d.ts +25 -0
  38. package/dist/controller/defaults.js +19 -0
  39. package/dist/controller/index.d.ts +64 -0
  40. package/dist/controller/index.js +139 -0
  41. package/dist/delivery/index.d.ts +20 -0
  42. package/dist/delivery/index.js +66 -0
  43. package/dist/delivery/main.d.ts +48 -0
  44. package/dist/delivery/main.js +115 -0
  45. package/dist/explicit-constructed-response.css +2 -0
  46. package/dist/index.d.ts +1 -0
  47. package/dist/index.iife.d.ts +8 -0
  48. package/dist/index.iife.js +393 -0
  49. package/dist/index.js +2 -0
  50. package/dist/node_modules/.bun/he@1.2.0/node_modules/he/he.js +3993 -0
  51. package/dist/print/index.d.ts +15 -0
  52. package/dist/print/index.js +40 -0
  53. package/dist/runtime-support.d.ts +12 -0
  54. package/dist/runtime-support.js +12 -0
  55. package/package.json +94 -26
  56. package/CHANGELOG.json +0 -1102
  57. package/CHANGELOG.md +0 -2187
  58. package/LICENSE.md +0 -5
  59. package/README.md +0 -1
  60. package/configure/CHANGELOG.json +0 -652
  61. package/configure/CHANGELOG.md +0 -1928
  62. package/configure/lib/alternateResponses.js +0 -199
  63. package/configure/lib/alternateResponses.js.map +0 -1
  64. package/configure/lib/alternateSection.js +0 -329
  65. package/configure/lib/alternateSection.js.map +0 -1
  66. package/configure/lib/defaults.js +0 -184
  67. package/configure/lib/defaults.js.map +0 -1
  68. package/configure/lib/ecr-toolbar.js +0 -181
  69. package/configure/lib/ecr-toolbar.js.map +0 -1
  70. package/configure/lib/index.js +0 -161
  71. package/configure/lib/index.js.map +0 -1
  72. package/configure/lib/main.js +0 -514
  73. package/configure/lib/main.js.map +0 -1
  74. package/configure/lib/markupUtils.js +0 -70
  75. package/configure/lib/markupUtils.js.map +0 -1
  76. package/configure/lib/utils.js +0 -15
  77. package/configure/lib/utils.js.map +0 -1
  78. package/configure/package.json +0 -22
  79. package/controller/CHANGELOG.json +0 -517
  80. package/controller/CHANGELOG.md +0 -1344
  81. package/controller/lib/defaults.js +0 -23
  82. package/controller/lib/defaults.js.map +0 -1
  83. package/controller/lib/index.js +0 -368
  84. package/controller/lib/index.js.map +0 -1
  85. package/controller/package.json +0 -18
  86. package/docs/config-schema.json +0 -2629
  87. package/docs/config-schema.json.md +0 -1941
  88. package/docs/demo/config.js +0 -8
  89. package/docs/demo/generate.js +0 -20
  90. package/docs/demo/index.html +0 -1
  91. package/docs/demo/session.js +0 -10
  92. package/docs/pie-schema.json +0 -1130
  93. package/docs/pie-schema.json.md +0 -814
  94. package/lib/index.js +0 -91
  95. package/lib/index.js.map +0 -1
  96. package/lib/main.js +0 -205
  97. package/lib/main.js.map +0 -1
  98. package/lib/print.js +0 -71
  99. package/lib/print.js.map +0 -1
  100. package/module/configure.js +0 -1
  101. package/module/controller.js +0 -6534
  102. package/module/demo.js +0 -45
  103. package/module/element.js +0 -1
  104. package/module/index.html +0 -21
  105. package/module/manifest.json +0 -18
  106. package/module/print-demo.js +0 -83
  107. package/module/print.html +0 -18
  108. package/module/print.js +0 -1
@@ -0,0 +1,291 @@
1
+ import { decodeHTML as e, getAdjustedLength as t } from "./markupUtils.js";
2
+ import n from "./ecr-toolbar.js";
3
+ import r from "./alternateResponses.js";
4
+ import { generateValidationMessage as i } from "./utils.js";
5
+ import a from "react";
6
+ import o from "prop-types";
7
+ import { cloneDeep as s, isEmpty as c, pick as l, throttle as u } from "@pie-element/shared-lodash";
8
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
9
+ import { styled as p } from "@mui/material/styles";
10
+ import m, { ALL_PLUGINS as ee } from "@pie-lib/editable-html-tip-tap";
11
+ import { InputContainer as h, layout as te, settings as g } from "@pie-lib/config-ui";
12
+ import _ from "@mui/material/Typography";
13
+ import ne from "@mui/icons-material/Info";
14
+ import v from "@mui/material/Tooltip";
15
+ //#region src/author/main.tsx
16
+ var { toggle: y, Panel: re, dropdown: ie } = g, b = p(h)(({ theme: e }) => ({
17
+ width: "100%",
18
+ paddingTop: e.spacing(1),
19
+ marginTop: e.spacing(2),
20
+ marginBottom: e.spacing(2)
21
+ })), ae = p(m)(({ theme: e }) => ({
22
+ minHeight: "100px",
23
+ paddingTop: e.spacing(1),
24
+ width: "100%",
25
+ "& [data-slate-editor=\"true\"]": { minHeight: "100px" }
26
+ })), oe = p(_)(({ theme: e }) => ({ fontSize: e.typography.fontSize + 2 })), x = p(v)(({ theme: e }) => ({ "& .MuiTooltip-tooltip": {
27
+ fontSize: e.typography.fontSize - 2,
28
+ whiteSpace: "pre",
29
+ maxWidth: "500px"
30
+ } })), S = p("div")(({ theme: e }) => ({
31
+ fontSize: e.typography.fontSize - 2,
32
+ color: e.palette.error.main,
33
+ paddingTop: e.spacing(1)
34
+ })), se = p("div")({
35
+ display: "flex",
36
+ alignItems: "center"
37
+ }), ce = p(_)(({ theme: e }) => ({
38
+ fontSize: e.typography.fontSize + 2,
39
+ marginTop: e.spacing(3),
40
+ marginBottom: e.spacing(1)
41
+ })), C = (e) => {
42
+ let t = document.createElement("div");
43
+ return t.innerHTML = e.trim(), t;
44
+ }, w = class extends a.Component {
45
+ static propTypes = {
46
+ configuration: o.object.isRequired,
47
+ model: o.object.isRequired,
48
+ disableSidePanel: o.bool,
49
+ onModelChanged: o.func.isRequired,
50
+ onConfigurationChanged: o.func.isRequired,
51
+ imageSupport: o.shape({
52
+ add: o.func.isRequired,
53
+ delete: o.func.isRequired
54
+ }),
55
+ uploadSoundSupport: o.object
56
+ };
57
+ state = {};
58
+ componentDidMount() {
59
+ let { model: { slateMarkup: n, choices: r, maxLengthPerChoice: i = [] }, onModelChanged: a } = this.props, o = !i.length;
60
+ this.setState({ markup: n }), Object.values(r).forEach((n, r) => {
61
+ let a = n.map((t) => e(t.label || "").length), s = Math.max(...a);
62
+ (o || !i[r] || i[r] < s || i[r] > s + 10) && (i[r] = t(s));
63
+ }), a({ maxLengthPerChoice: i });
64
+ }
65
+ onModelChange = (e) => {
66
+ this.props.onModelChanged({ ...e });
67
+ };
68
+ onPromptChanged = (e) => {
69
+ this.props.onModelChanged({ prompt: e });
70
+ };
71
+ onRationaleChanged = (e) => {
72
+ this.props.onModelChanged({ rationale: e });
73
+ };
74
+ onTeacherInstructionsChanged = (e) => {
75
+ let { onModelChanged: t } = this.props;
76
+ t({ teacherInstructions: e });
77
+ };
78
+ onMarkupChanged = (e) => {
79
+ this.props.onModelChanged({ slateMarkup: e });
80
+ };
81
+ onResponsesChanged = (e) => {
82
+ this.props.onModelChanged({ choices: e });
83
+ };
84
+ onLengthChanged = (e) => {
85
+ let { onModelChanged: t } = this.props;
86
+ t({ maxLengthPerChoice: e });
87
+ };
88
+ onChangeResponse = (n, r) => {
89
+ let { model: i, onModelChanged: a } = this.props, { choices: o } = i, { maxLengthPerChoice: s } = i, c = e(r || "").length;
90
+ if (!o[n] || !o[n].length) {
91
+ o[n] = [{
92
+ label: r || "",
93
+ value: "0"
94
+ }];
95
+ let e = n > s.length ? n - s.length : 0;
96
+ s = [...s, ...Array(e).fill(1)], s.splice(n, 0, t(c));
97
+ } else o[n][0].label = r || "", s && (s[n] < c || s[n] > c + 10) && (s[n] = t(c));
98
+ a({
99
+ choices: o,
100
+ maxLengthPerChoice: s
101
+ });
102
+ };
103
+ onChange = (e) => {
104
+ let { model: { choices: t, maxLengthPerChoice: n }, onModelChanged: r } = this.props, i = C(e), a = i.querySelectorAll("[data-type=\"explicit_constructed_response\"]"), o = {}, c = [];
105
+ a.forEach((e, r) => {
106
+ let i = s(t[e.dataset.index]);
107
+ i && (i[0] = {
108
+ label: e.dataset.value || "",
109
+ value: "0"
110
+ }, c[r] = n[e.dataset.index]), o[r] = i, e.dataset.index = r;
111
+ }), this.setState({ cachedChoices: void 0 }, () => r({
112
+ choices: o,
113
+ slateMarkup: i.innerHTML,
114
+ maxLengthPerChoice: c
115
+ }));
116
+ };
117
+ onHandleAreaChange = u((e) => {
118
+ let { model: { choices: t }, onModelChanged: n } = this.props, { cachedChoices: r } = this.state;
119
+ if (!e) return;
120
+ let i = t ? s(t) : {}, a = r ? s(r) : {};
121
+ e.forEach((e) => {
122
+ let t = e.index;
123
+ !i[t] && a[t] ? (Object.assign(i, l(a, t)), Object.prototype.hasOwnProperty.call(a, t) && delete a[t]) : (Object.assign(a, l(i, t)), Object.prototype.hasOwnProperty.call(i, t) && delete i[t]);
124
+ }), this.setState({ cachedChoices: a }, () => n({ choices: i }));
125
+ }, 500, {
126
+ trailing: !1,
127
+ leading: !0
128
+ });
129
+ render() {
130
+ let { model: e, configuration: t, onConfigurationChanged: a, imageSupport: o, uploadSoundSupport: s } = this.props, { baseInputConfiguration: l = {}, contentDimensions: u = {}, maxImageWidth: p = {}, maxImageHeight: h = {}, maxLengthPerChoice: g = {}, maxResponseAreas: _, partialScoring: v = {}, playerSpellCheck: C = {}, prompt: w = {}, rationale: T = {}, template: le = {}, settingsPanelDisabled: E, spellCheck: D = {}, editSource: O = {}, teacherInstructions: k = {}, withRubric: A = {}, mathMlOptions: j = {}, language: M = {}, languageChoices: N = {}, spanishButton: P = {}, responseAreaInputConfiguration: F = {} } = t || {}, { errors: I, extraCSSRules: L, maxLengthPerChoiceEnabled: R, promptEnabled: z, rationaleEnabled: B, spellCheckEnabled: V, teacherInstructionsEnabled: H, toolbarEditorPosition: U } = e || {}, { choices: W = {}, prompt: G, rationale: K, responseAreas: q, teacherInstructions: J } = I || {}, Y = i(t), X = p && p.prompt, Z = h && h.prompt, Q = { position: U === "top" ? "top" : "bottom" }, ue = {
131
+ partialScoring: v.settings && y(v.label),
132
+ maxLengthPerChoiceEnabled: g.settings && y(g.label),
133
+ "language.enabled": M.settings && y(M.label, !0),
134
+ language: M.settings && M.enabled && ie(N.label, N.options),
135
+ "responseAreaInputConfiguration.inputConfiguration.characters.disabled": P.settings && y(P.label, !0)
136
+ }, de = {
137
+ teacherInstructionsEnabled: k.settings && y(k.label),
138
+ rationaleEnabled: T.settings && y(T.label),
139
+ promptEnabled: w.settings && y(w.label),
140
+ spellCheckEnabled: D.settings && y(D.label),
141
+ playerSpellCheckEnabled: C.settings && y(C.label),
142
+ rubricEnabled: A?.settings && y(A?.label),
143
+ "editSource.enabled": O?.settings && y(O.label, !0)
144
+ }, $ = (e = {}) => ({
145
+ ...l,
146
+ ...e
147
+ });
148
+ return /* @__PURE__ */ f(te.ConfigLayout, {
149
+ extraCSSRules: L,
150
+ dimensions: u,
151
+ hideSettings: E,
152
+ settings: /* @__PURE__ */ d(re, {
153
+ model: e,
154
+ configuration: t,
155
+ onChangeModel: (e) => this.onModelChange(e),
156
+ onChangeConfiguration: (e) => a(e, !0),
157
+ groups: {
158
+ Settings: ue,
159
+ Properties: de
160
+ }
161
+ }),
162
+ children: [
163
+ H && /* @__PURE__ */ f(b, {
164
+ label: k.label,
165
+ children: [/* @__PURE__ */ d(m, {
166
+ className: "prompt",
167
+ markup: e.teacherInstructions || "",
168
+ onChange: this.onTeacherInstructionsChanged,
169
+ imageSupport: o,
170
+ nonEmpty: !1,
171
+ error: J,
172
+ toolbarOpts: Q,
173
+ pluginProps: $(k?.inputConfiguration),
174
+ spellCheck: V,
175
+ maxImageWidth: p && p.teacherInstructions || X,
176
+ maxImageHeight: h && h.teacherInstructions || Z,
177
+ uploadSoundSupport: s,
178
+ languageCharactersProps: [{ language: "spanish" }, { language: "special" }],
179
+ mathMlOptions: j,
180
+ autoWidthToolbar: !0
181
+ }), J && /* @__PURE__ */ d(S, { children: J })]
182
+ }),
183
+ z && /* @__PURE__ */ f(b, {
184
+ label: w.label,
185
+ children: [/* @__PURE__ */ d(m, {
186
+ className: "prompt",
187
+ markup: e.prompt,
188
+ onChange: this.onPromptChanged,
189
+ imageSupport: o,
190
+ nonEmpty: !1,
191
+ disableUnderline: !0,
192
+ error: G,
193
+ toolbarOpts: Q,
194
+ pluginProps: $(w?.inputConfiguration),
195
+ spellCheck: V,
196
+ maxImageWidth: X,
197
+ maxImageHeight: Z,
198
+ uploadSoundSupport: s,
199
+ languageCharactersProps: [{ language: "spanish" }, { language: "special" }],
200
+ mathMlOptions: j,
201
+ autoWidthToolbar: !0
202
+ }), G && /* @__PURE__ */ d(S, { children: G })]
203
+ }),
204
+ /* @__PURE__ */ f(se, { children: [/* @__PURE__ */ d(oe, {
205
+ component: "div",
206
+ children: "Define Template, Choices, and Correct Responses"
207
+ }), /* @__PURE__ */ d(x, {
208
+ disableFocusListener: !0,
209
+ disableTouchListener: !0,
210
+ placement: "right",
211
+ title: Y,
212
+ children: /* @__PURE__ */ d(ne, {
213
+ fontSize: "small",
214
+ color: "primary",
215
+ style: { marginLeft: "8px" }
216
+ })
217
+ })] }),
218
+ /* @__PURE__ */ d(ae, {
219
+ activePlugins: ee,
220
+ toolbarOpts: { position: "top" },
221
+ spellCheck: V,
222
+ pluginProps: $(le?.inputConfiguration),
223
+ responseAreaProps: {
224
+ type: "explicit-constructed-response",
225
+ options: { duplicates: !0 },
226
+ maxResponseAreas: _,
227
+ respAreaToolbar: (e, t, r) => {
228
+ let [i, a] = e, { model: o } = this.props, s = (o.choices[i.attrs.index] || [])[0];
229
+ return () => /* @__PURE__ */ d(n, {
230
+ onChangeResponse: (e) => this.onChangeResponse(i.attrs.index, e),
231
+ node: i,
232
+ pos: a,
233
+ editor: t,
234
+ onToolbarDone: r,
235
+ correctChoice: s,
236
+ maxLengthPerChoiceEnabled: R,
237
+ pluginProps: $(F?.inputConfiguration)
238
+ });
239
+ },
240
+ error: () => W,
241
+ onHandleAreaChange: this.onHandleAreaChange
242
+ },
243
+ markup: e.slateMarkup,
244
+ onChange: this.onChange,
245
+ imageSupport: o,
246
+ disableImageAlignmentButtons: !0,
247
+ onBlur: this.onBlur,
248
+ disabled: !1,
249
+ highlightShape: !1,
250
+ error: q,
251
+ uploadSoundSupport: s,
252
+ languageCharactersProps: [{ language: "spanish" }, { language: "special" }],
253
+ mathMlOptions: j,
254
+ autoWidthToolbar: !0
255
+ }),
256
+ q && /* @__PURE__ */ d(S, { children: q }),
257
+ !c(e.choices) && /* @__PURE__ */ d(ce, { children: `Define Alternates ${R ? "and Character Limits" : ""}` }),
258
+ /* @__PURE__ */ d(r, {
259
+ model: e,
260
+ onChange: this.onResponsesChanged,
261
+ onLengthChange: this.onLengthChanged,
262
+ maxLengthPerChoiceEnabled: R,
263
+ spellCheck: V,
264
+ choicesErrors: W,
265
+ pluginProps: $(F?.inputConfiguration)
266
+ }),
267
+ B && /* @__PURE__ */ f(b, {
268
+ label: T.label,
269
+ children: [/* @__PURE__ */ d(m, {
270
+ className: "prompt",
271
+ markup: e.rationale || "",
272
+ onChange: this.onRationaleChanged,
273
+ imageSupport: o,
274
+ error: K,
275
+ toolbarOpts: Q,
276
+ pluginProps: $(T?.inputConfiguration),
277
+ spellCheck: V,
278
+ maxImageWidth: p && p.rationale || X,
279
+ maxImageHeight: h && h.rationale || Z,
280
+ uploadSoundSupport: s,
281
+ languageCharactersProps: [{ language: "spanish" }, { language: "special" }],
282
+ mathMlOptions: j,
283
+ autoWidthToolbar: !0
284
+ }), K && /* @__PURE__ */ d(S, { children: K })]
285
+ })
286
+ ]
287
+ });
288
+ }
289
+ };
290
+ //#endregion
291
+ export { w as default };
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @synced-from pie-elements/packages/explicit-constructed-response/configure/src/markupUtils.js
3
+ * @auto-generated
4
+ *
5
+ * This file is automatically synced from pie-elements and converted to TypeScript.
6
+ * Manual edits will be overwritten on next sync.
7
+ * To make changes, edit the upstream JavaScript file and run sync again.
8
+ */
9
+ export declare const removeUnwantedCharacters: (markup: any) => any;
10
+ export declare const processMarkup: (markup: any) => string;
11
+ export declare const createSlateMarkup: (markup: any, choices: any) => any;
12
+ export declare const getAdjustedLength: (length: any) => any;
13
+ export declare const stripHtmlTags: (markup: any) => string;
14
+ export declare const decodeHTML: (html: any) => string;
@@ -0,0 +1,13 @@
1
+ import { escape as e } from "@pie-element/shared-lodash";
2
+ //#region src/author/markupUtils.tsx
3
+ var t = "imes|riangle|an|heta|herefore", n = "throot|parallel|cong|approx|eq|e|sim", r = RegExp(`(\\t(?!${t}))|(\\n(?!${n}))|(\\\\t(?!${t}))|(\\\\n(?!${n}))`, "g"), i = (e) => e.replace(r, "").replace(/\\"/g, "\"").replace(/\\\//g, "/"), a = (e = "") => {
4
+ let t = document.createElement("div");
5
+ return t.innerHTML = e.trim(), t;
6
+ }, o = (e) => {
7
+ let t = a(i(e || "") || ""), n = 0;
8
+ return t.querySelectorAll("[data-type=\"explicit_constructed_response\"]").forEach((e) => {
9
+ e.replaceWith(`{{${n++}}}`);
10
+ }), t.innerHTML;
11
+ }, s = /\{\{(\d+)\}\}/g, c = (t, n) => t ? i(t).replace(s, (t, r) => `<span data-type="explicit_constructed_response" data-index="${r}" data-value="${e(n[r][0].label || "")}"></span>`) : "", l = (e) => e <= 2 ? e + 2 : e <= 4 ? e + 3 : e <= 6 ? e + 4 : e + 5, u = (e) => typeof e == "string" ? e.replace(/<\/?[^>]+(>|$)/g, "") : "", d = (e) => new DOMParser().parseFromString(e, "text/html").body.textContent || "";
12
+ //#endregion
13
+ export { c as createSlateMarkup, d as decodeHTML, l as getAdjustedLength, o as processMarkup, u as stripHtmlTags };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @synced-from pie-elements/packages/explicit-constructed-response/configure/src/utils.js
3
+ * @auto-generated
4
+ *
5
+ * This file is automatically synced from pie-elements and converted to TypeScript.
6
+ * Manual edits will be overwritten on next sync.
7
+ * To make changes, edit the upstream JavaScript file and run sync again.
8
+ */
9
+ export declare const generateValidationMessage: (config: any) => string;
@@ -0,0 +1,7 @@
1
+ //#region src/author/utils.ts
2
+ var e = (e) => {
3
+ let { maxResponseAreas: t } = e;
4
+ return "Validation requirements:" + ("\nCorrect answers should not be blank.\nEach answer defined for a response area should be unique.\nThere should be at least 1 " + (t ? `and at most ${t} ` : "") + "response area" + (t ? "s" : "") + " defined.");
5
+ };
6
+ //#endregion
7
+ export { e as generateValidationMessage };