@pie-element/select-text 6.5.0 → 6.5.3-next.1014
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 +205 -0
- package/configure/CHANGELOG.md +160 -0
- package/configure/lib/defaultConfiguration.js +18 -1
- package/configure/lib/defaultConfiguration.js.map +1 -1
- package/configure/lib/design.js +92 -12
- package/configure/lib/design.js.map +1 -1
- package/configure/lib/index.js +4 -8
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/utils.js +77 -26
- package/configure/lib/utils.js.map +1 -1
- package/configure/package.json +5 -5
- package/controller/CHANGELOG.md +111 -0
- package/controller/lib/index.js +37 -4
- package/controller/lib/index.js.map +1 -1
- package/controller/package.json +2 -1
- package/docs/config-schema.json +94 -0
- package/docs/config-schema.json.md +73 -1
- package/docs/demo/generate.js +116 -22
- package/docs/demo/session.js +18 -5
- package/docs/pie-schema.json +37 -0
- package/docs/pie-schema.json.md +31 -0
- package/lib/index.js +51 -3
- package/lib/index.js.map +1 -1
- package/lib/main.js +50 -30
- package/lib/main.js.map +1 -1
- package/lib/print.js +124 -0
- package/lib/print.js.map +1 -0
- package/lib/utils.js +106 -0
- package/lib/utils.js.map +1 -0
- package/package.json +11 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["log","buildTokens","tokens","evaluateMode","map","t","Object","assign","correct","undefined","getCorrectness","selected","filter","length","correctSelected","getCorrectSelected","s","index","findIndex","c","start","end","getCorrectCount","getPartialScore","question","session","totalCorrect","correctCount","selectedTokens","correctTokens","extraSelected","incorrectCount","count","positiveCount","parseFloat","toFixed","outcome","env","Promise","resolve","score","empty","normalizeSession","mode","completed","enabled","partialScoring","createDefaultModel","model","defaults","normalize","feedbackEnabled","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","selectedToken","normalizedQuestion","correctness","fb","feedback","then","out","highlightChoices","prompt","text","disabled","maxSelections","incorrect","role","rationale","teacherInstructions","createCorrectResponseSession","id"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport { partialScoring } from '@pie-lib/controller-utils';\nimport defaults from './defaults';\n\nconst log = debug('@pie-element:select-text:controller');\n\nconst buildTokens = (tokens, evaluateMode) => {\n tokens = tokens || [];\n\n return tokens.map((t) =>\n Object.assign(\n {},\n t,\n evaluateMode ? { correct: !!t.correct } : { correct: undefined }\n )\n );\n};\n\nexport const getCorrectness = (tokens, selected) => {\n const correct = tokens.filter((t) => t.correct === true);\n\n if (correct.length === 0) {\n return 'unknown';\n }\n\n const correctSelected = getCorrectSelected(tokens, selected);\n\n if (correctSelected.length === selected.length) {\n if (correctSelected.length === correct.length) {\n return 'correct';\n } else if (correctSelected.length > 0) {\n return 'partially-correct';\n }\n }\n\n if (correctSelected.length > 0) {\n return 'partially-correct';\n }\n\n return 'incorrect';\n};\n\nconst getCorrectSelected = (tokens, selected) => {\n return (selected || []).filter((s) => {\n const index = tokens.findIndex((c) => {\n return c.correct && c.start === s.start && c.end === s.end;\n });\n return index !== -1;\n });\n};\n\nconst getCorrectCount = (tokens, selected) =>\n getCorrectSelected(tokens, selected).length;\n\nexport const getPartialScore = (question, session, totalCorrect) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n const correctCount = getCorrectCount(question.tokens, session.selectedTokens);\n const correctTokens = (question.tokens || []).filter((t) => t.correct === true);\n const extraSelected = session.selectedTokens ? session.selectedTokens.length > correctTokens.length : 0;\n const incorrectCount = extraSelected ? session.selectedTokens && session.selectedTokens.length - correctCount : 0;\n const count = correctCount - incorrectCount;\n const positiveCount = count < 0 ? 0 : count;\n\n return totalCorrect.length\n ? parseFloat((positiveCount / totalCorrect.length).toFixed(2))\n : 0;\n};\n\nexport const outcome = (question, session, env) =>\n new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n session = normalizeSession(session);\n\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n const enabled = partialScoring.enabled(question, env, true);\n const totalCorrect = question.tokens.filter((t) => t.correct);\n const score = getPartialScore(question, session, totalCorrect);\n resolve({\n score: enabled ? score : score === 1 ? 1 : 0,\n });\n }\n });\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n}\n\nexport const normalizeSession = (s) => ({\n selectedTokens: [],\n ...s,\n});\n\nexport const normalize = (question) => ({\n feedbackEnabled: true,\n rationaleEnabled: true,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n ...question,\n});\n\nexport const model = (question, session, env) => {\n session = session || { selectedToken: [] };\n session.selectedTokens = session.selectedTokens || [];\n const normalizedQuestion = normalize(question);\n return new Promise((resolve) => {\n log('[model]', 'normalizedQuestion: ', normalizedQuestion);\n log('[model]', 'session: ', session);\n const tokens = buildTokens(\n normalizedQuestion.tokens,\n env.mode === 'evaluate'\n );\n log('tokens:', tokens);\n const correctness =\n env.mode === 'evaluate'\n ? getCorrectness(normalizedQuestion.tokens, session.selectedTokens)\n : undefined;\n\n const fb =\n env.mode === 'evaluate' && normalizedQuestion.feedbackEnabled\n ? getFeedbackForCorrectness(correctness, normalizedQuestion.feedback)\n : Promise.resolve(undefined);\n\n fb.then((feedback) => {\n const out = {\n tokens,\n highlightChoices: normalizedQuestion.highlightChoices,\n prompt: normalizedQuestion.promptEnabled\n ? normalizedQuestion.prompt\n : null,\n text: normalizedQuestion.text,\n disabled: env.mode !== 'gather',\n maxSelections: normalizedQuestion.maxSelections,\n correctness,\n feedback,\n incorrect:\n env.mode === 'evaluate' ? correctness !== 'correct' : undefined,\n };\n\n if (\n env.role === 'instructor' &&\n (env.mode === 'view' || env.mode === 'evaluate')\n ) {\n out.rationale = normalizedQuestion.rationaleEnabled\n ? normalizedQuestion.rationale\n : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n });\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { tokens } = question;\n const selectedTokens = tokens.filter((t) => t.correct);\n\n resolve({\n id: '1',\n selectedTokens,\n });\n } else {\n resolve(null);\n }\n });\n};\n"],"file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"names":["log","buildTokens","tokens","evaluateMode","map","t","Object","assign","correct","undefined","getCorrectness","selected","filter","length","correctSelected","getCorrectSelected","s","index","findIndex","c","start","end","oldStart","oldEnd","getCorrectCount","getPartialScore","question","session","totalCorrect","correctCount","selectedTokens","correctTokens","extraSelected","incorrectCount","count","positiveCount","parseFloat","toFixed","outcome","env","Promise","resolve","score","empty","normalizeSession","mode","completed","enabled","partialScoring","createDefaultModel","model","defaults","normalize","feedbackEnabled","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","selectedToken","normalizedQuestion","correctness","fb","feedback","then","out","highlightChoices","prompt","text","disabled","maxSelections","incorrect","role","rationale","teacherInstructions","createCorrectResponseSession","id","validate","config","minTokens","maxTokens","errors","nbOfTokens","nbOfSelections","reduce","acc","token","tokensError","selectionsError"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport { partialScoring } from '@pie-lib/controller-utils';\nimport defaults from './defaults';\n\nconst log = debug('@pie-element:select-text:controller');\n\nconst buildTokens = (tokens, evaluateMode) => {\n tokens = tokens || [];\n\n return tokens.map((t) =>\n Object.assign(\n {},\n t,\n evaluateMode ? { correct: !!t.correct } : { correct: undefined }\n )\n );\n};\n\nexport const getCorrectness = (tokens, selected) => {\n const correct = tokens.filter((t) => t.correct === true);\n\n if (correct.length === 0) {\n return 'unknown';\n }\n\n const correctSelected = getCorrectSelected(tokens, selected);\n\n if (correctSelected.length === selected.length) {\n if (correctSelected.length === correct.length) {\n return 'correct';\n } else if (correctSelected.length > 0) {\n return 'partially-correct';\n }\n }\n\n if (correctSelected.length > 0) {\n return 'partially-correct';\n }\n\n return 'incorrect';\n};\n\nconst getCorrectSelected = (tokens, selected) => {\n return (selected || []).filter((s) => {\n const index = tokens.findIndex((c) => {\n return c.correct &&\n (\n (c.start === s.start && c.end === s.end) ||\n // this case is used for the cases when the token's start & end were recalculated\n (c.start === s.oldStart && c.end === s.oldEnd)\n );\n });\n return index !== -1;\n });\n};\n\nconst getCorrectCount = (tokens, selected) =>\n getCorrectSelected(tokens, selected).length;\n\nexport const getPartialScore = (question, session, totalCorrect) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n const correctCount = getCorrectCount(question.tokens, session.selectedTokens);\n const correctTokens = (question.tokens || []).filter((t) => t.correct === true);\n const extraSelected = session.selectedTokens ? session.selectedTokens.length > correctTokens.length : 0;\n const incorrectCount = extraSelected ? session.selectedTokens && session.selectedTokens.length - correctCount : 0;\n const count = correctCount - incorrectCount;\n const positiveCount = count < 0 ? 0 : count;\n\n return totalCorrect.length\n ? parseFloat((positiveCount / totalCorrect.length).toFixed(2))\n : 0;\n};\n\nexport const outcome = (question, session, env) =>\n new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n session = normalizeSession(session);\n\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n const enabled = partialScoring.enabled(question, env, true);\n const totalCorrect = question.tokens.filter((t) => t.correct);\n const score = getPartialScore(question, session, totalCorrect);\n resolve({\n score: enabled ? score : score === 1 ? 1 : 0,\n });\n }\n });\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n}\n\nexport const normalizeSession = (s) => ({\n selectedTokens: [],\n ...s,\n});\n\nexport const normalize = (question) => ({\n feedbackEnabled: true,\n rationaleEnabled: true,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n ...question,\n});\n\nexport const model = (question, session, env) => {\n session = session || { selectedToken: [] };\n session.selectedTokens = session.selectedTokens || [];\n const normalizedQuestion = normalize(question);\n\n return new Promise((resolve) => {\n log('[model]', 'normalizedQuestion: ', normalizedQuestion);\n log('[model]', 'session: ', session);\n const tokens = buildTokens(\n normalizedQuestion.tokens,\n env.mode === 'evaluate'\n );\n log('tokens:', tokens);\n const correctness =\n env.mode === 'evaluate'\n ? getCorrectness(normalizedQuestion.tokens, session.selectedTokens)\n : undefined;\n\n const fb =\n env.mode === 'evaluate' && normalizedQuestion.feedbackEnabled\n ? getFeedbackForCorrectness(correctness, normalizedQuestion.feedback)\n : Promise.resolve(undefined);\n\n fb.then((feedback) => {\n const out = {\n tokens,\n highlightChoices: normalizedQuestion.highlightChoices,\n prompt: normalizedQuestion.promptEnabled\n ? normalizedQuestion.prompt\n : null,\n text: normalizedQuestion.text,\n disabled: env.mode !== 'gather',\n maxSelections: normalizedQuestion.maxSelections,\n correctness,\n feedback,\n incorrect:\n env.mode === 'evaluate' ? correctness !== 'correct' : undefined,\n };\n\n if (\n env.role === 'instructor' &&\n (env.mode === 'view' || env.mode === 'evaluate')\n ) {\n out.rationale = normalizedQuestion.rationaleEnabled\n ? normalizedQuestion.rationale\n : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n });\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { tokens } = question;\n const selectedTokens = tokens.filter((t) => t.correct);\n\n resolve({\n id: '1',\n selectedTokens,\n });\n } else {\n resolve(null);\n }\n });\n};\n\nexport const validate = (model = {}, config = {}) => {\n const { tokens } = model;\n const { minTokens = 2, maxTokens, maxSelections } = config;\n const errors = {};\n const nbOfTokens = (tokens || []).length;\n\n const nbOfSelections = (tokens || []).reduce((acc, token) => token.correct ? acc + 1 : acc, 0);\n\n if (nbOfTokens < minTokens) {\n errors.tokensError = `There should be at least ${minTokens} tokens defined.`;\n } else if (nbOfTokens > maxTokens) {\n errors.tokensError = `No more than ${maxTokens} tokens should be defined.`;\n }\n\n if (nbOfSelections < 1) {\n errors.selectionsError = 'There should be at least 1 token selected.';\n } else if (nbOfSelections > maxSelections) {\n errors.selectionsError = `No more than ${maxSelections} tokens should be selected.`;\n }\n\n return errors;\n};\n"],"file":"index.js"}
|
package/controller/package.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/select-text-controller",
|
|
3
3
|
"private": true,
|
|
4
|
-
"version": "4.1.
|
|
4
|
+
"version": "4.1.31",
|
|
5
5
|
"description": "",
|
|
6
6
|
"main": "lib/index.js",
|
|
7
7
|
"module": "src/index.js",
|
|
8
8
|
"dependencies": {
|
|
9
9
|
"@pie-lib/controller-utils": "^0.2.26",
|
|
10
10
|
"@pie-lib/feedback": "^0.4.27",
|
|
11
|
+
"@pie-lib/text-select": "^1.8.18",
|
|
11
12
|
"debug": "^3.1.0",
|
|
12
13
|
"lodash": "^4.17.15"
|
|
13
14
|
},
|
package/docs/config-schema.json
CHANGED
|
@@ -163,6 +163,22 @@
|
|
|
163
163
|
}
|
|
164
164
|
}
|
|
165
165
|
},
|
|
166
|
+
"spellCheck": {
|
|
167
|
+
"title": "ConfigureProp",
|
|
168
|
+
"type": "object",
|
|
169
|
+
"properties": {
|
|
170
|
+
"settings": {
|
|
171
|
+
"description": "Indicates if the item has to be displayed in the Settings Panel",
|
|
172
|
+
"type": "boolean",
|
|
173
|
+
"title": "settings"
|
|
174
|
+
},
|
|
175
|
+
"label": {
|
|
176
|
+
"description": "Indicates the label for the item that has to be displayed in the Settings Panel",
|
|
177
|
+
"type": "string",
|
|
178
|
+
"title": "label"
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
},
|
|
166
182
|
"scoringType": {
|
|
167
183
|
"title": "ConfigureProp",
|
|
168
184
|
"type": "object",
|
|
@@ -211,6 +227,63 @@
|
|
|
211
227
|
}
|
|
212
228
|
}
|
|
213
229
|
},
|
|
230
|
+
"maxSelections": {
|
|
231
|
+
"description": "Maximum number of selected tokens in correct answer",
|
|
232
|
+
"type": "number",
|
|
233
|
+
"title": "maxSelections"
|
|
234
|
+
},
|
|
235
|
+
"minTokens": {
|
|
236
|
+
"description": "Minimum number of tokens",
|
|
237
|
+
"type": "number",
|
|
238
|
+
"title": "minTokens"
|
|
239
|
+
},
|
|
240
|
+
"maxTokens": {
|
|
241
|
+
"description": "Maximum number of tokens",
|
|
242
|
+
"type": "number",
|
|
243
|
+
"title": "maxTokens"
|
|
244
|
+
},
|
|
245
|
+
"maxImageWidth": {
|
|
246
|
+
"title": "ConfigureMaxImageDimensionsProp",
|
|
247
|
+
"type": "object",
|
|
248
|
+
"properties": {
|
|
249
|
+
"teacherInstructions": {
|
|
250
|
+
"description": "Indicates the max dimension for images in teacher instructions",
|
|
251
|
+
"type": "number",
|
|
252
|
+
"title": "teacherInstructions"
|
|
253
|
+
},
|
|
254
|
+
"prompt": {
|
|
255
|
+
"description": "Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified",
|
|
256
|
+
"type": "number",
|
|
257
|
+
"title": "prompt"
|
|
258
|
+
},
|
|
259
|
+
"rationale": {
|
|
260
|
+
"description": "Indicates the max dimension for images in rationale",
|
|
261
|
+
"type": "number",
|
|
262
|
+
"title": "rationale"
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
"maxImageHeight": {
|
|
267
|
+
"title": "ConfigureMaxImageDimensionsProp",
|
|
268
|
+
"type": "object",
|
|
269
|
+
"properties": {
|
|
270
|
+
"teacherInstructions": {
|
|
271
|
+
"description": "Indicates the max dimension for images in teacher instructions",
|
|
272
|
+
"type": "number",
|
|
273
|
+
"title": "teacherInstructions"
|
|
274
|
+
},
|
|
275
|
+
"prompt": {
|
|
276
|
+
"description": "Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified",
|
|
277
|
+
"type": "number",
|
|
278
|
+
"title": "prompt"
|
|
279
|
+
},
|
|
280
|
+
"rationale": {
|
|
281
|
+
"description": "Indicates the max dimension for images in rationale",
|
|
282
|
+
"type": "number",
|
|
283
|
+
"title": "rationale"
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
},
|
|
214
287
|
"showPrompt": {
|
|
215
288
|
"description": "Determines whether prompt field will be displayed or not",
|
|
216
289
|
"default": true,
|
|
@@ -246,6 +319,27 @@
|
|
|
246
319
|
"title": "label"
|
|
247
320
|
}
|
|
248
321
|
}
|
|
322
|
+
},
|
|
323
|
+
"ConfigureMaxImageDimensionsProp": {
|
|
324
|
+
"title": "ConfigureMaxImageDimensionsProp",
|
|
325
|
+
"type": "object",
|
|
326
|
+
"properties": {
|
|
327
|
+
"teacherInstructions": {
|
|
328
|
+
"description": "Indicates the max dimension for images in teacher instructions",
|
|
329
|
+
"type": "number",
|
|
330
|
+
"title": "teacherInstructions"
|
|
331
|
+
},
|
|
332
|
+
"prompt": {
|
|
333
|
+
"description": "Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified",
|
|
334
|
+
"type": "number",
|
|
335
|
+
"title": "prompt"
|
|
336
|
+
},
|
|
337
|
+
"rationale": {
|
|
338
|
+
"description": "Indicates the max dimension for images in rationale",
|
|
339
|
+
"type": "number",
|
|
340
|
+
"title": "rationale"
|
|
341
|
+
}
|
|
342
|
+
}
|
|
249
343
|
}
|
|
250
344
|
},
|
|
251
345
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
|
@@ -122,6 +122,18 @@ Indicates if the item has to be displayed in the Settings Panel
|
|
|
122
122
|
|
|
123
123
|
Indicates the label for the item that has to be displayed in the Settings Panel
|
|
124
124
|
|
|
125
|
+
# `spellCheck` (object)
|
|
126
|
+
|
|
127
|
+
Properties of the `spellCheck` object:
|
|
128
|
+
|
|
129
|
+
## `settings` (boolean)
|
|
130
|
+
|
|
131
|
+
Indicates if the item has to be displayed in the Settings Panel
|
|
132
|
+
|
|
133
|
+
## `label` (string)
|
|
134
|
+
|
|
135
|
+
Indicates the label for the item that has to be displayed in the Settings Panel
|
|
136
|
+
|
|
125
137
|
# `scoringType` (object)
|
|
126
138
|
|
|
127
139
|
Properties of the `scoringType` object:
|
|
@@ -158,6 +170,50 @@ Indicates if the item has to be displayed in the Settings Panel
|
|
|
158
170
|
|
|
159
171
|
Indicates the label for the item that has to be displayed in the Settings Panel
|
|
160
172
|
|
|
173
|
+
# `maxSelections` (number)
|
|
174
|
+
|
|
175
|
+
Maximum number of selected tokens in correct answer
|
|
176
|
+
|
|
177
|
+
# `minTokens` (number)
|
|
178
|
+
|
|
179
|
+
Minimum number of tokens
|
|
180
|
+
|
|
181
|
+
# `maxTokens` (number)
|
|
182
|
+
|
|
183
|
+
Maximum number of tokens
|
|
184
|
+
|
|
185
|
+
# `maxImageWidth` (object)
|
|
186
|
+
|
|
187
|
+
Properties of the `maxImageWidth` object:
|
|
188
|
+
|
|
189
|
+
## `teacherInstructions` (number)
|
|
190
|
+
|
|
191
|
+
Indicates the max dimension for images in teacher instructions
|
|
192
|
+
|
|
193
|
+
## `prompt` (number)
|
|
194
|
+
|
|
195
|
+
Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified
|
|
196
|
+
|
|
197
|
+
## `rationale` (number)
|
|
198
|
+
|
|
199
|
+
Indicates the max dimension for images in rationale
|
|
200
|
+
|
|
201
|
+
# `maxImageHeight` (object)
|
|
202
|
+
|
|
203
|
+
Properties of the `maxImageHeight` object:
|
|
204
|
+
|
|
205
|
+
## `teacherInstructions` (number)
|
|
206
|
+
|
|
207
|
+
Indicates the max dimension for images in teacher instructions
|
|
208
|
+
|
|
209
|
+
## `prompt` (number)
|
|
210
|
+
|
|
211
|
+
Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified
|
|
212
|
+
|
|
213
|
+
## `rationale` (number)
|
|
214
|
+
|
|
215
|
+
Indicates the max dimension for images in rationale
|
|
216
|
+
|
|
161
217
|
# `showPrompt` (boolean)
|
|
162
218
|
|
|
163
219
|
Determines whether prompt field will be displayed or not
|
|
@@ -192,4 +248,20 @@ Indicates if the item has to be displayed in the Settings Panel
|
|
|
192
248
|
|
|
193
249
|
### `label` (string)
|
|
194
250
|
|
|
195
|
-
Indicates the label for the item that has to be displayed in the Settings Panel
|
|
251
|
+
Indicates the label for the item that has to be displayed in the Settings Panel
|
|
252
|
+
|
|
253
|
+
## `ConfigureMaxImageDimensionsProp` (object)
|
|
254
|
+
|
|
255
|
+
Properties of the `ConfigureMaxImageDimensionsProp` object:
|
|
256
|
+
|
|
257
|
+
### `teacherInstructions` (number)
|
|
258
|
+
|
|
259
|
+
Indicates the max dimension for images in teacher instructions
|
|
260
|
+
|
|
261
|
+
### `prompt` (number)
|
|
262
|
+
|
|
263
|
+
Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified
|
|
264
|
+
|
|
265
|
+
### `rationale` (number)
|
|
266
|
+
|
|
267
|
+
Indicates the max dimension for images in rationale
|
package/docs/demo/generate.js
CHANGED
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
const tokens = () =>
|
|
1
|
+
const tokens = () => [
|
|
2
2
|
{
|
|
3
3
|
text: 'If \'tweren\'t for sight and sound and smell,',
|
|
4
|
-
start:
|
|
5
|
-
end:
|
|
4
|
+
start: 0,
|
|
5
|
+
end: 43
|
|
6
6
|
},
|
|
7
7
|
{
|
|
8
8
|
text: 'I\'d like the city pretty well,',
|
|
9
|
-
start:
|
|
10
|
-
end:
|
|
9
|
+
start: 44,
|
|
10
|
+
end: 74
|
|
11
11
|
},
|
|
12
12
|
{
|
|
13
13
|
text: 'But when it comes to getting rest,',
|
|
14
|
-
start:
|
|
15
|
-
end:
|
|
14
|
+
start: 75,
|
|
15
|
+
end: 109
|
|
16
16
|
},
|
|
17
17
|
{
|
|
18
18
|
text: 'I like the country lots the best.',
|
|
19
|
-
start:
|
|
20
|
-
end:
|
|
19
|
+
start: 110,
|
|
20
|
+
end: 143
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
text: 'Sometimes it seems to me I must',
|
|
24
|
-
start:
|
|
25
|
-
end:
|
|
24
|
+
start: 145,
|
|
25
|
+
end: 176
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
text: 'Just quit the city\'s din and dust,',
|
|
29
|
-
start:
|
|
30
|
-
end:
|
|
29
|
+
start: 177,
|
|
30
|
+
end: 211
|
|
31
31
|
},
|
|
32
32
|
{
|
|
33
33
|
text: 'And get out where the sky is blue,',
|
|
34
|
-
start:
|
|
35
|
-
end:
|
|
34
|
+
start: 212,
|
|
35
|
+
end: 246
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
38
|
text: 'And say, now, how does it seem to you?',
|
|
39
|
-
start:
|
|
40
|
-
end:
|
|
39
|
+
start: 247,
|
|
40
|
+
end: 285
|
|
41
41
|
}
|
|
42
42
|
];
|
|
43
43
|
|
|
@@ -58,7 +58,7 @@ const base = extras =>
|
|
|
58
58
|
Object.assign(
|
|
59
59
|
{},
|
|
60
60
|
{
|
|
61
|
-
highlightChoices: true,
|
|
61
|
+
// highlightChoices: true,
|
|
62
62
|
feedback: {
|
|
63
63
|
correct: {
|
|
64
64
|
type: 'default',
|
|
@@ -79,6 +79,7 @@ const base = extras =>
|
|
|
79
79
|
rationale: 'Rationale goes here.',
|
|
80
80
|
prompt: 'What sentences contain the character 6 in them?',
|
|
81
81
|
promptEnabled: true,
|
|
82
|
+
toolbarEditorPosition: 'bottom',
|
|
82
83
|
// text: `<p>Warhol was born in 1928 in Pittsburgh, Pennsylvania. When he was eight years old, he became very sick and had to stay in bed for months. To help him pass the time his mother, who was an artist, taught him how to draw. He took to it like a fish to water. Art became the center of Andy's world. A year later he added picture-taking to his interests when his mother gave him a camera. He also became fascinated with movies.</p><p>Andy studied art in school and learned many ways to make art. He learned how to use different art materials, such as oil paints, metal, clay, and wood. In 1949 he moved to New York City, where he got a job drawing and painting pictures for magazines.</p>`,
|
|
83
84
|
text: `<p>If 'tweren't for sight and sound and smell,<br />
|
|
84
85
|
I'd like the city pretty well,<br />
|
|
@@ -131,10 +132,6 @@ And say, now, how does it seem to you?</p>`,
|
|
|
131
132
|
);
|
|
132
133
|
};
|
|
133
134
|
|
|
134
|
-
exports.model = (id, element) => {
|
|
135
|
-
return Object.assign({}, { id, element }, base({}));
|
|
136
|
-
};
|
|
137
|
-
|
|
138
135
|
exports.mathSample = (id, element) => {
|
|
139
136
|
return Object.assign({}, { id, element }, mathSample({}));
|
|
140
137
|
};
|
|
@@ -208,3 +205,100 @@ exports.htmlAscii = (id, element) => ({
|
|
|
208
205
|
}]
|
|
209
206
|
}
|
|
210
207
|
);
|
|
208
|
+
|
|
209
|
+
const simpleItem = {
|
|
210
|
+
'text': 'A. Almost never\n\nB. Once in a while\n\nC. Sometimes\n\nD. Often\n\nE. Almost all the time',
|
|
211
|
+
'tokens': [
|
|
212
|
+
{
|
|
213
|
+
'text': 'A. Almost never',
|
|
214
|
+
'end': 15,
|
|
215
|
+
'start': 0,
|
|
216
|
+
'correct': true
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
'start': 17,
|
|
220
|
+
'end': 35,
|
|
221
|
+
'correct': false,
|
|
222
|
+
'text': 'B. Once in a while'
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
'correct': false,
|
|
226
|
+
'end': 49,
|
|
227
|
+
'start': 37,
|
|
228
|
+
'text': 'C. Sometimes'
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
'text': 'D. Often',
|
|
232
|
+
'correct': false,
|
|
233
|
+
'end': 59,
|
|
234
|
+
'start': 51
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
'start': 61,
|
|
238
|
+
'correct': false,
|
|
239
|
+
'end': 83,
|
|
240
|
+
'text': 'E. Almost all the time'
|
|
241
|
+
}
|
|
242
|
+
],
|
|
243
|
+
'rationale': '<p>answers vary</p>',
|
|
244
|
+
'partialScoring': true,
|
|
245
|
+
'teacherInstructions': '',
|
|
246
|
+
'prompt': '<p>I got my work done right away instead of waiting until the last minute.</p>',
|
|
247
|
+
'maxSelections': 1,
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
exports.model = (id, element) => {
|
|
251
|
+
return Object.assign({}, { id, element }, base( {
|
|
252
|
+
// "id": "8a808081701d693801703174fb900421",
|
|
253
|
+
'teacherInstructions': '',
|
|
254
|
+
'partialScoring': true,
|
|
255
|
+
'prompt': '<p>Select the sentence from "The Gymnast" that <span class="relative-emphasis">best</span> represents the theme.</p>',
|
|
256
|
+
'rationale': '<p>The final sentence of the passage best exemplifies the theme of the short story because Natasha's practice and determination finally pays off.</p>',
|
|
257
|
+
'tokens': [
|
|
258
|
+
{
|
|
259
|
+
'text': 'She thought about what she had to do, struggling to rein in her wild, fearful thoughts.',
|
|
260
|
+
'end': 90,
|
|
261
|
+
'start': 3,
|
|
262
|
+
'correct': false
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
'start': 449,
|
|
266
|
+
'end': 585,
|
|
267
|
+
'text': 'Just for a hair of a moment, Natasha wondered if she really wanted a perfect 10, so weary was she of trying for but never achieving one.',
|
|
268
|
+
'correct': false
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
'end': 627,
|
|
272
|
+
'correct': false,
|
|
273
|
+
'text': 'At last Natasha\'s moment arrived.',
|
|
274
|
+
'start': 594
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
'end': 743,
|
|
278
|
+
'text': 'The faces of past giants of gymnastics swam before her mind\'s eye, now razor–sharp with fierce determination.',
|
|
279
|
+
'correct': false,
|
|
280
|
+
'start': 628
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
'text': 'Suddenly, the din of the gymnasium was silent to her.',
|
|
284
|
+
'end': 997,
|
|
285
|
+
'correct': false,
|
|
286
|
+
'start': 944
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
'end': 1087,
|
|
290
|
+
'start': 998,
|
|
291
|
+
'correct': false,
|
|
292
|
+
'text': 'Forcing all sound out of her mind, she focused on the gleaming balance beam ahead of her.'
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
'correct': true,
|
|
296
|
+
'start': 1088,
|
|
297
|
+
'end': 1225,
|
|
298
|
+
'text': 'Taking a deep breath, Natasha made her graceful, yet powerful approach, mounted the beam flawlessly, and...executed her first perfect 10.'
|
|
299
|
+
}
|
|
300
|
+
],
|
|
301
|
+
// "element": "select-text",
|
|
302
|
+
'text': '<p>She thought about what she had to do, struggling to rein in her wild, fearful thoughts. Coach Cummings always said that an undisciplined mind never scored a perfect 10. Natasha wanted to please her Coach, yet sometimes his approval wasn\'t as exciting as his anger. The gymnasts were unanimous about one thing: Coach Cummings\'s fits of disapproving rage were much more humorous to witness than his infrequent, backslapping moments of high praise. Just for a hair of a moment, Natasha wondered if she really wanted a perfect 10, so weary was she of trying for but never achieving one.</p>\n\n<p>At last Natasha\'s moment arrived. The faces of past giants of gymnastics swam before her mind\'s eye, now razor–sharp with fierce determination. "I am talented. I am not afraid. I will make a perfect 10," she spoke aloud to herself, as she approached the mat, dusted her hands with chalk to prevent slippage, and returned to her starting point. Suddenly, the din of the gymnasium was silent to her. Forcing all sound out of her mind, she focused on the gleaming balance beam ahead of her. Taking a deep breath, Natasha made her graceful, yet powerful approach, mounted the beam flawlessly, and...executed her first perfect 10.</p>\n'
|
|
303
|
+
} ));
|
|
304
|
+
};
|
package/docs/demo/session.js
CHANGED
|
@@ -2,10 +2,23 @@ module.exports = [
|
|
|
2
2
|
{
|
|
3
3
|
id: '1',
|
|
4
4
|
element: 'select-text',
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
selectedTokens: [
|
|
6
|
+
// { start: 0, end: 36 },
|
|
7
|
+
// { start: 37, end: 74 },
|
|
8
|
+
// { start: 117, end: 177 }
|
|
9
|
+
// {
|
|
10
|
+
// // "correct": true,
|
|
11
|
+
// "start": 1088,
|
|
12
|
+
// "end": 1225,
|
|
13
|
+
// "text": "Taking a deep breath, Natasha made her graceful, yet powerful approach, mounted the beam flawlessly, and...executed her first perfect 10."
|
|
14
|
+
// },
|
|
15
|
+
// {
|
|
16
|
+
// "start": 1082,
|
|
17
|
+
// "end": 1219,
|
|
18
|
+
// "text": "Taking a deep breath, Natasha made her graceful, yet powerful approach, mounted the beam flawlessly, and...executed her first perfect 10.",
|
|
19
|
+
// "oldStart": 1088,
|
|
20
|
+
// "oldEnd": 1225
|
|
21
|
+
// }
|
|
22
|
+
]
|
|
10
23
|
}
|
|
11
24
|
];
|
package/docs/pie-schema.json
CHANGED
|
@@ -289,6 +289,21 @@
|
|
|
289
289
|
"type": "boolean",
|
|
290
290
|
"title": "teacherInstructionsEnabled"
|
|
291
291
|
},
|
|
292
|
+
"spellCheckEnabled": {
|
|
293
|
+
"description": "Indicates if spellcheck is enabled",
|
|
294
|
+
"type": "boolean",
|
|
295
|
+
"title": "spellCheckEnabled"
|
|
296
|
+
},
|
|
297
|
+
"toolbarEditorPosition": {
|
|
298
|
+
"description": "Indicates the editor's toolbar position which can be 'bottom' or 'top'",
|
|
299
|
+
"default": ": 'bottom'",
|
|
300
|
+
"enum": [
|
|
301
|
+
"bottom",
|
|
302
|
+
"top"
|
|
303
|
+
],
|
|
304
|
+
"type": "string",
|
|
305
|
+
"title": "toolbarEditorPosition"
|
|
306
|
+
},
|
|
292
307
|
"id": {
|
|
293
308
|
"description": "Identifier to identify the Pie Element in html markup, Must be unique within a pie item config.",
|
|
294
309
|
"type": "string",
|
|
@@ -306,6 +321,7 @@
|
|
|
306
321
|
"id",
|
|
307
322
|
"prompt",
|
|
308
323
|
"rationaleEnabled",
|
|
324
|
+
"spellCheckEnabled",
|
|
309
325
|
"studentInstructionsEnabled",
|
|
310
326
|
"teacherInstructionsEnabled",
|
|
311
327
|
"text",
|
|
@@ -328,6 +344,27 @@
|
|
|
328
344
|
}
|
|
329
345
|
}
|
|
330
346
|
},
|
|
347
|
+
"ConfigureMaxImageDimensionsProp": {
|
|
348
|
+
"title": "ConfigureMaxImageDimensionsProp",
|
|
349
|
+
"type": "object",
|
|
350
|
+
"properties": {
|
|
351
|
+
"teacherInstructions": {
|
|
352
|
+
"description": "Indicates the max dimension for images in teacher instructions",
|
|
353
|
+
"type": "number",
|
|
354
|
+
"title": "teacherInstructions"
|
|
355
|
+
},
|
|
356
|
+
"prompt": {
|
|
357
|
+
"description": "Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified",
|
|
358
|
+
"type": "number",
|
|
359
|
+
"title": "prompt"
|
|
360
|
+
},
|
|
361
|
+
"rationale": {
|
|
362
|
+
"description": "Indicates the max dimension for images in rationale",
|
|
363
|
+
"type": "number",
|
|
364
|
+
"title": "rationale"
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
},
|
|
331
368
|
"ComplexFeedbackType": {
|
|
332
369
|
"title": "ComplexFeedbackType",
|
|
333
370
|
"type": "object",
|
package/docs/pie-schema.json.md
CHANGED
|
@@ -117,6 +117,21 @@ Indicates if Student Instructions are enabled
|
|
|
117
117
|
|
|
118
118
|
Indicates if Teacher Instructions are enabled
|
|
119
119
|
|
|
120
|
+
# `spellCheckEnabled` (boolean, required)
|
|
121
|
+
|
|
122
|
+
Indicates if spellcheck is enabled
|
|
123
|
+
|
|
124
|
+
# `toolbarEditorPosition` (string, enum)
|
|
125
|
+
|
|
126
|
+
Indicates the editor's toolbar position which can be 'bottom' or 'top'
|
|
127
|
+
|
|
128
|
+
This element must be one of the following enum values:
|
|
129
|
+
|
|
130
|
+
* `bottom`
|
|
131
|
+
* `top`
|
|
132
|
+
|
|
133
|
+
Default: `": 'bottom'"`
|
|
134
|
+
|
|
120
135
|
# `id` (string, required)
|
|
121
136
|
|
|
122
137
|
Identifier to identify the Pie Element in html markup, Must be unique within a pie item config.
|
|
@@ -143,6 +158,22 @@ Indicates if the item has to be displayed in the Settings Panel
|
|
|
143
158
|
|
|
144
159
|
Indicates the label for the item that has to be displayed in the Settings Panel
|
|
145
160
|
|
|
161
|
+
## `ConfigureMaxImageDimensionsProp` (object)
|
|
162
|
+
|
|
163
|
+
Properties of the `ConfigureMaxImageDimensionsProp` object:
|
|
164
|
+
|
|
165
|
+
### `teacherInstructions` (number)
|
|
166
|
+
|
|
167
|
+
Indicates the max dimension for images in teacher instructions
|
|
168
|
+
|
|
169
|
+
### `prompt` (number)
|
|
170
|
+
|
|
171
|
+
Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified
|
|
172
|
+
|
|
173
|
+
### `rationale` (number)
|
|
174
|
+
|
|
175
|
+
Indicates the max dimension for images in rationale
|
|
176
|
+
|
|
146
177
|
## `ComplexFeedbackType` (object)
|
|
147
178
|
|
|
148
179
|
Properties of the `ComplexFeedbackType` object:
|