@pie-element/multiple-choice 6.2.5 → 6.3.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 +43 -0
- package/configure/CHANGELOG.md +35 -0
- package/configure/lib/defaults.js +2 -2
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/index.js +2 -2
- package/configure/lib/main.js +88 -57
- package/configure/lib/main.js.map +1 -1
- package/configure/lib/utils.js +18 -0
- package/configure/lib/utils.js.map +1 -0
- package/configure/package.json +4 -4
- package/controller/CHANGELOG.md +24 -0
- package/controller/lib/index.js +61 -3
- package/controller/lib/index.js.map +1 -1
- package/controller/package.json +1 -1
- package/docs/pie-schema.json +1 -1
- package/docs/pie-schema.json.md +1 -1
- package/lib/choice-input.js +3 -3
- package/lib/choice.js +2 -2
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/module/configure.js +127 -66
- package/module/controller.js +46 -1
- package/module/element.js +3 -4
- package/module/index.html +1 -1
- package/module/manifest.json +3 -3
- package/module/print.html +1 -1
- package/module/print.js +3 -4
- package/package.json +6 -6
package/controller/lib/index.js
CHANGED
|
@@ -5,13 +5,18 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
+
exports.createCorrectResponseSession = void 0;
|
|
8
9
|
exports.createDefaultModel = createDefaultModel;
|
|
10
|
+
exports.getScore = void 0;
|
|
9
11
|
exports.model = model;
|
|
12
|
+
exports.normalize = void 0;
|
|
10
13
|
exports.outcome = outcome;
|
|
11
|
-
exports.
|
|
14
|
+
exports.validate = void 0;
|
|
12
15
|
|
|
13
16
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
14
17
|
|
|
18
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
19
|
+
|
|
15
20
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
16
21
|
|
|
17
22
|
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
@@ -28,9 +33,9 @@ var _controllerUtils = require("@pie-lib/controller-utils");
|
|
|
28
33
|
|
|
29
34
|
var _excluded = ["verticalMode", "choicesLayout"];
|
|
30
35
|
|
|
31
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object);
|
|
36
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
32
37
|
|
|
33
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]
|
|
38
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
34
39
|
|
|
35
40
|
var prepareChoice = function prepareChoice(model, env, defaultFeedback) {
|
|
36
41
|
return function (choice) {
|
|
@@ -244,4 +249,57 @@ var createCorrectResponseSession = function createCorrectResponseSession(questio
|
|
|
244
249
|
};
|
|
245
250
|
|
|
246
251
|
exports.createCorrectResponseSession = createCorrectResponseSession;
|
|
252
|
+
|
|
253
|
+
var validate = function validate() {
|
|
254
|
+
var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
255
|
+
var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
256
|
+
var choices = model.choices;
|
|
257
|
+
var _config$minAnswerChoi = config.minAnswerChoices,
|
|
258
|
+
minAnswerChoices = _config$minAnswerChoi === void 0 ? 2 : _config$minAnswerChoi,
|
|
259
|
+
maxAnswerChoices = config.maxAnswerChoices;
|
|
260
|
+
var reversedChoices = (0, _toConsumableArray2["default"])(choices || []).reverse();
|
|
261
|
+
var choicesErrors = {};
|
|
262
|
+
var hasCorrectResponse = false;
|
|
263
|
+
reversedChoices.forEach(function (choice, index) {
|
|
264
|
+
var correct = choice.correct,
|
|
265
|
+
value = choice.value,
|
|
266
|
+
label = choice.label;
|
|
267
|
+
|
|
268
|
+
if (correct) {
|
|
269
|
+
hasCorrectResponse = true;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
if (label === '' || label === '<div></div>') {
|
|
273
|
+
choicesErrors[value] = 'Content should not be empty.';
|
|
274
|
+
} else {
|
|
275
|
+
var identicalAnswer = reversedChoices.slice(index + 1).some(function (c) {
|
|
276
|
+
return c.label === label;
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
if (identicalAnswer) {
|
|
280
|
+
choicesErrors[value] = 'Content should be unique.';
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
var errors = {};
|
|
285
|
+
var nbOfChoices = (choices || []).length;
|
|
286
|
+
|
|
287
|
+
if (nbOfChoices < minAnswerChoices) {
|
|
288
|
+
errors.answerChoicesError = "There should be at least ".concat(minAnswerChoices, " choices defined.");
|
|
289
|
+
} else if (nbOfChoices > maxAnswerChoices) {
|
|
290
|
+
errors.answerChoicesError = "No more than ".concat(maxAnswerChoices, " choices should be defined.");
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
if (!hasCorrectResponse) {
|
|
294
|
+
errors.correctResponseError = 'No correct response defined.';
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
if (!(0, _isEmpty["default"])(choicesErrors)) {
|
|
298
|
+
errors.choicesErrors = choicesErrors;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
return errors;
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
exports.validate = validate;
|
|
247
305
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["prepareChoice","model","env","defaultFeedback","choice","role","mode","out","label","value","accessibilityLabelsEnabled","accessibility","textContent","rationale","rationaleEnabled","correct","feedbackEnabled","feedbackType","feedback","type","createDefaultModel","Promise","resolve","defaults","normalize","question","verticalMode","choicesLayout","questionProps","session","updateSession","normalizedQuestion","Object","assign","incorrect","choices","map","lockChoiceOrder","disabled","prompt","promptEnabled","gridColumns","choiceMode","keyMode","choicePrefix","responseCorrect","undefined","teacherInstructions","teacherInstructionsEnabled","getScore","config","selectedChoices","correctChoices","filter","ch","score","reduce","acc","selectedChoice","find","length","str","parseFloat","toFixed","outcome","empty","partialScoringEnabled","partialScoring","enabled","createCorrectResponseSession","id","c"],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport isEmpty from 'lodash/isEmpty';\nimport { isResponseCorrect, parseHTML } from './utils';\nimport defaults from './defaults';\nimport { lockChoices, partialScoring, getShuffledChoices } from '@pie-lib/controller-utils';\n\nconst prepareChoice = (model, env, defaultFeedback) => choice => {\n const { role, mode } = env || {};\n const out = {\n label: choice.label,\n value: choice.value,\n };\n\n if (model.accessibilityLabelsEnabled) {\n out.accessibility = parseHTML(choice.accessibility).textContent || choice.value;\n }\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.rationale = model.rationaleEnabled ? choice.rationale : null;\n } else {\n out.rationale = null;\n }\n\n if (mode === 'evaluate') {\n out.correct = !!choice.correct;\n\n if (model.feedbackEnabled) {\n const feedbackType = (choice.feedback && choice.feedback.type) || 'none';\n\n if (feedbackType === 'default') {\n out.feedback = defaultFeedback[choice.correct ? 'correct' : 'incorrect'];\n } else if (feedbackType === 'custom') {\n out.feedback = choice.feedback.value;\n }\n }\n }\n\n return out;\n};\n\nexport function createDefaultModel(model = {}) {\n return new Promise(resolve => resolve({ ...defaults, ...model }));\n}\n\nexport const normalize = question => {\n const { verticalMode, choicesLayout, ...questionProps } = question || {};\n\n return {\n ...defaults,\n ...questionProps,\n // This is used for offering support for old models which have the property verticalMode\n // Same thing is set in authoring : packages/multiple-choice/configure/src/index.jsx - createDefaultModel\n choicesLayout: choicesLayout || (verticalMode === false && 'horizontal') || defaults.choicesLayout\n };\n};\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport async function model(question, session, env, updateSession) {\n const normalizedQuestion = normalize(question);\n\n const defaultFeedback = Object.assign(\n { correct: 'Correct', incorrect: 'Incorrect' },\n normalizedQuestion.defaultFeedback\n );\n\n let choices = normalizedQuestion.choices.map(\n prepareChoice(normalizedQuestion, env, defaultFeedback)\n );\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(\n choices,\n session,\n updateSession,\n 'value'\n );\n }\n\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n choicesLayout: normalizedQuestion.choicesLayout,\n gridColumns: normalizedQuestion.gridColumns,\n choiceMode: normalizedQuestion.choiceMode,\n keyMode: normalizedQuestion.choicePrefix,\n choices,\n responseCorrect:\n env.mode === 'evaluate' ? isResponseCorrect(normalizedQuestion, session) : undefined\n };\n\n const { role, mode } = env || {};\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.teacherInstructions = null;\n }\n\n return out;\n}\n\n\nexport const getScore = (config, session) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n const selectedChoices = session.value || [];\n const correctChoices = (config.choices || []).filter(ch => ch.correct);\n\n let score = selectedChoices.reduce((acc, selectedChoice) =>\n acc + (correctChoices.find(ch => ch.value === selectedChoice) ? 1 : 0), 0);\n\n if (correctChoices.length < selectedChoices.length) {\n score -= selectedChoices.length - correctChoices.length;\n\n if (score < 0) {\n score = 0;\n }\n }\n\n const str = correctChoices.length ? score / correctChoices.length : 0;\n\n return parseFloat(str.toFixed(2));\n};\n\n/**\n *\n * The score is partial by default for checkbox mode, allOrNothing for radio mode.\n * To disable partial scoring for checkbox mode you either set model.partialScoring = false or env.partialScoring = false. the value in `env` will\n * override the value in `model`.\n * @param {Object} model - the main model\n * @param {*} session\n * @param {Object} env\n */\nexport function outcome(model, session, env) {\n return new Promise(resolve => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n } else {\n const partialScoringEnabled =\n partialScoring.enabled(model, env) && model.choiceMode !== 'radio';\n const score = getScore(model, session);\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0, empty: false });\n }\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise(resolve => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { choices } = question || { choices: [] };\n\n resolve({\n id: '1',\n value: choices.filter(c => c.correct).map(c => c.value)\n });\n } else {\n resolve(null);\n }\n });\n};\n"],"file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"names":["prepareChoice","model","env","defaultFeedback","choice","role","mode","out","label","value","accessibilityLabelsEnabled","accessibility","textContent","rationale","rationaleEnabled","correct","feedbackEnabled","feedbackType","feedback","type","createDefaultModel","Promise","resolve","defaults","normalize","question","verticalMode","choicesLayout","questionProps","session","updateSession","normalizedQuestion","Object","assign","incorrect","choices","map","lockChoiceOrder","disabled","prompt","promptEnabled","gridColumns","choiceMode","keyMode","choicePrefix","responseCorrect","undefined","teacherInstructions","teacherInstructionsEnabled","getScore","config","selectedChoices","correctChoices","filter","ch","score","reduce","acc","selectedChoice","find","length","str","parseFloat","toFixed","outcome","empty","partialScoringEnabled","partialScoring","enabled","createCorrectResponseSession","id","c","validate","minAnswerChoices","maxAnswerChoices","reversedChoices","reverse","choicesErrors","hasCorrectResponse","forEach","index","identicalAnswer","slice","some","errors","nbOfChoices","answerChoicesError","correctResponseError"],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport isEmpty from 'lodash/isEmpty';\nimport { isResponseCorrect, parseHTML } from './utils';\nimport defaults from './defaults';\nimport { lockChoices, partialScoring, getShuffledChoices } from '@pie-lib/controller-utils';\n\nconst prepareChoice = (model, env, defaultFeedback) => choice => {\n const { role, mode } = env || {};\n const out = {\n label: choice.label,\n value: choice.value,\n };\n\n if (model.accessibilityLabelsEnabled) {\n out.accessibility = parseHTML(choice.accessibility).textContent || choice.value;\n }\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.rationale = model.rationaleEnabled ? choice.rationale : null;\n } else {\n out.rationale = null;\n }\n\n if (mode === 'evaluate') {\n out.correct = !!choice.correct;\n\n if (model.feedbackEnabled) {\n const feedbackType = (choice.feedback && choice.feedback.type) || 'none';\n\n if (feedbackType === 'default') {\n out.feedback = defaultFeedback[choice.correct ? 'correct' : 'incorrect'];\n } else if (feedbackType === 'custom') {\n out.feedback = choice.feedback.value;\n }\n }\n }\n\n return out;\n};\n\nexport function createDefaultModel(model = {}) {\n return new Promise(resolve => resolve({ ...defaults, ...model }));\n}\n\nexport const normalize = question => {\n const { verticalMode, choicesLayout, ...questionProps } = question || {};\n\n return {\n ...defaults,\n ...questionProps,\n // This is used for offering support for old models which have the property verticalMode\n // Same thing is set in authoring : packages/multiple-choice/configure/src/index.jsx - createDefaultModel\n choicesLayout: choicesLayout || (verticalMode === false && 'horizontal') || defaults.choicesLayout\n };\n};\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport async function model(question, session, env, updateSession) {\n const normalizedQuestion = normalize(question);\n\n const defaultFeedback = Object.assign(\n { correct: 'Correct', incorrect: 'Incorrect' },\n normalizedQuestion.defaultFeedback\n );\n\n let choices = normalizedQuestion.choices.map(\n prepareChoice(normalizedQuestion, env, defaultFeedback)\n );\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(\n choices,\n session,\n updateSession,\n 'value'\n );\n }\n\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n choicesLayout: normalizedQuestion.choicesLayout,\n gridColumns: normalizedQuestion.gridColumns,\n choiceMode: normalizedQuestion.choiceMode,\n keyMode: normalizedQuestion.choicePrefix,\n choices,\n responseCorrect:\n env.mode === 'evaluate' ? isResponseCorrect(normalizedQuestion, session) : undefined\n };\n\n const { role, mode } = env || {};\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.teacherInstructions = null;\n }\n\n return out;\n}\n\n\nexport const getScore = (config, session) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n const selectedChoices = session.value || [];\n const correctChoices = (config.choices || []).filter(ch => ch.correct);\n\n let score = selectedChoices.reduce((acc, selectedChoice) =>\n acc + (correctChoices.find(ch => ch.value === selectedChoice) ? 1 : 0), 0);\n\n if (correctChoices.length < selectedChoices.length) {\n score -= selectedChoices.length - correctChoices.length;\n\n if (score < 0) {\n score = 0;\n }\n }\n\n const str = correctChoices.length ? score / correctChoices.length : 0;\n\n return parseFloat(str.toFixed(2));\n};\n\n/**\n *\n * The score is partial by default for checkbox mode, allOrNothing for radio mode.\n * To disable partial scoring for checkbox mode you either set model.partialScoring = false or env.partialScoring = false. the value in `env` will\n * override the value in `model`.\n * @param {Object} model - the main model\n * @param {*} session\n * @param {Object} env\n */\nexport function outcome(model, session, env) {\n return new Promise(resolve => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n } else {\n const partialScoringEnabled =\n partialScoring.enabled(model, env) && model.choiceMode !== 'radio';\n const score = getScore(model, session);\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0, empty: false });\n }\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise(resolve => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { choices } = question || { choices: [] };\n\n resolve({\n id: '1',\n value: choices.filter(c => c.correct).map(c => c.value)\n });\n } else {\n resolve(null);\n }\n });\n};\n\nexport const validate = (model = {}, config = {}) => {\n const { choices } = model;\n const { minAnswerChoices = 2, maxAnswerChoices } = config;\n const reversedChoices = [...choices || []].reverse();\n const choicesErrors = {};\n let hasCorrectResponse = false;\n\n reversedChoices.forEach((choice, index) => {\n const { correct, value, label } = choice;\n\n if (correct) {\n hasCorrectResponse = true;\n }\n\n if (label === '' || label === '<div></div>') {\n choicesErrors[value] = 'Content should not be empty.';\n } else {\n const identicalAnswer = reversedChoices.slice(index + 1).some(c => c.label === label);\n\n if (identicalAnswer) {\n choicesErrors[value] = 'Content should be unique.';\n }\n }\n });\n\n const errors = {};\n const nbOfChoices = (choices || []).length;\n\n if (nbOfChoices < minAnswerChoices) {\n errors.answerChoicesError = `There should be at least ${minAnswerChoices} choices defined.`;\n } else if (nbOfChoices > maxAnswerChoices) {\n errors.answerChoicesError = `No more than ${maxAnswerChoices} choices should be defined.`;\n }\n\n if (!hasCorrectResponse) {\n errors.correctResponseError = 'No correct response defined.';\n }\n\n if (!isEmpty(choicesErrors)) {\n errors.choicesErrors = choicesErrors;\n }\n\n return errors;\n};\n"],"file":"index.js"}
|
package/controller/package.json
CHANGED
package/docs/pie-schema.json
CHANGED
|
@@ -164,7 +164,7 @@
|
|
|
164
164
|
"title": "rationaleEnabled"
|
|
165
165
|
},
|
|
166
166
|
"spellCheckEnabled": {
|
|
167
|
-
"description": "Indicates if spellcheck is enabled",
|
|
167
|
+
"description": "Indicates if spellcheck is enabled for the author. Default value is true",
|
|
168
168
|
"type": "boolean",
|
|
169
169
|
"title": "spellCheckEnabled"
|
|
170
170
|
},
|
package/docs/pie-schema.json.md
CHANGED
|
@@ -144,7 +144,7 @@ Indicates if Rationale are enabled
|
|
|
144
144
|
|
|
145
145
|
# `spellCheckEnabled` (boolean, required)
|
|
146
146
|
|
|
147
|
-
Indicates if spellcheck is enabled
|
|
147
|
+
Indicates if spellcheck is enabled for the author. Default value is true
|
|
148
148
|
|
|
149
149
|
# `studentInstructionsEnabled` (boolean, required)
|
|
150
150
|
|
package/lib/choice-input.js
CHANGED
|
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports["default"] = exports.
|
|
8
|
+
exports["default"] = exports.StyledRadio = exports.StyledFormControlLabel = exports.StyledCheckbox = exports.ChoiceInput = void 0;
|
|
9
9
|
|
|
10
10
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
11
11
|
|
|
@@ -45,9 +45,9 @@ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflec
|
|
|
45
45
|
|
|
46
46
|
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
47
47
|
|
|
48
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object);
|
|
48
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
49
49
|
|
|
50
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]
|
|
50
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
51
51
|
|
|
52
52
|
var styleSheet = function styleSheet() {
|
|
53
53
|
return {
|
package/lib/choice.js
CHANGED
|
@@ -33,9 +33,9 @@ var _classnames = _interopRequireDefault(require("classnames"));
|
|
|
33
33
|
|
|
34
34
|
var _choiceInput = _interopRequireDefault(require("./choice-input"));
|
|
35
35
|
|
|
36
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object);
|
|
36
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
37
37
|
|
|
38
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]
|
|
38
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
39
39
|
|
|
40
40
|
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
|
|
41
41
|
|
package/lib/index.js
CHANGED
|
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports["default"] =
|
|
8
|
+
exports.isComplete = exports["default"] = void 0;
|
|
9
9
|
|
|
10
10
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
11
11
|
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["log","isComplete","session","value","length","MultipleChoice","_model","_session","_rerender","element","React","createElement","Main","model","onChoiceChanged","_onChange","bind","ReactDOM","render","leading","trailing","_dispatchResponseChanged","event","CustomEvent","bubbles","composed","detail","complete","component","tagName","toLowerCase","dispatchEvent","_dispatchModelSet","hasModel","undefined","s","data","choiceMode","HTMLElement"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;AAEA,IAAMA,GAAG,GAAG,uBAAM,wBAAN,CAAZ;;AAEO,IAAMC,UAAU,GAAG,SAAbA,UAAa,CAAAC,OAAO;AAAA,SAAI,CAAC,EAAEA,OAAO,IAAIA,OAAO,CAACC,KAAnB,IAA4BD,OAAO,CAACC,KAAR,CAAcC,MAA5C,CAAL;AAAA,CAA1B;;;;IAEcC,c;;;;;AACnB,4BAAc;AAAA;;AAAA;AACZ;AACA,UAAKC,MAAL,GAAc,IAAd;AACA,UAAKC,QAAL,GAAgB,IAAhB;AAEA,UAAKC,SAAL,GAAiB,0BACf,YAAM;AACJ,UAAI,MAAKF,MAAL,IAAe,MAAKC,QAAxB,EAAkC;AAChC,YAAIE,OAAO,gBAAGC,kBAAMC,aAAN,CAAoBC,gBAApB,EAA0B;AACtCC,UAAAA,KAAK,EAAE,MAAKP,MAD0B;AAEtCJ,UAAAA,OAAO,EAAE,MAAKK,QAFwB;AAGtCO,UAAAA,eAAe,EAAE,MAAKC,SAAL,CAAeC,IAAf;AAHqB,SAA1B,CAAd;;
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"names":["log","isComplete","session","value","length","MultipleChoice","_model","_session","_rerender","element","React","createElement","Main","model","onChoiceChanged","_onChange","bind","ReactDOM","render","leading","trailing","_dispatchResponseChanged","event","CustomEvent","bubbles","composed","detail","complete","component","tagName","toLowerCase","dispatchEvent","_dispatchModelSet","hasModel","undefined","s","data","choiceMode","HTMLElement"],"mappings":"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","sourcesContent":["import Main from './main';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport debounce from 'lodash/debounce';\nimport debug from 'debug';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport { updateSessionValue } from './session-updater';\n\nconst log = debug('pie-ui:multiple-choice');\n\nexport const isComplete = session => !!(session && session.value && session.value.length);\n\nexport default class MultipleChoice extends HTMLElement {\n constructor() {\n super();\n this._model = null;\n this._session = null;\n\n this._rerender = debounce(\n () => {\n if (this._model && this._session) {\n var element = React.createElement(Main, {\n model: this._model,\n session: this._session,\n onChoiceChanged: this._onChange.bind(this)\n });\n\n ReactDOM.render(element, this, () => {\n log('render complete - render math');\n renderMath(this);\n });\n } else {\n log('skip');\n }\n },\n 50,\n { leading: false, trailing: true }\n );\n\n this._dispatchResponseChanged = debounce(() => {\n var event = new CustomEvent('session-changed', {\n bubbles: true,\n composed: true,\n detail: {\n complete: isComplete(this._session),\n component: this.tagName.toLowerCase()\n }\n });\n\n this.dispatchEvent(event);\n });\n\n this._dispatchModelSet = debounce(\n () => {\n this.dispatchEvent(\n new CustomEvent('model-set', {\n bubbles: true,\n composed: true,\n detail: {\n complete: isComplete(this._session),\n component: this.tagName.toLowerCase(),\n hasModel: this._model !== undefined\n }\n })\n );\n },\n 50,\n { leading: false, trailing: true }\n );\n }\n\n set model(s) {\n this._model = s;\n this._rerender();\n this._dispatchModelSet();\n }\n\n get session() {\n return this._session;\n }\n\n set session(s) {\n this._session = s;\n this._rerender();\n //TODO: remove this session-changed should only be emit on user change\n this._dispatchResponseChanged();\n }\n\n _onChange(data) {\n updateSessionValue(this._session, this._model.choiceMode, data);\n this._dispatchResponseChanged();\n this._rerender();\n }\n\n connectedCallback() {\n this._rerender();\n }\n}\n"],"file":"index.js"}
|