@pie-element/inline-dropdown 3.7.1-next.99 → 3.8.3-next.1008

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.
@@ -5,9 +5,11 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
+ exports.getScore = exports.createCorrectResponseSession = void 0;
8
9
  exports.model = model;
10
+ exports.normalize = void 0;
9
11
  exports.outcome = outcome;
10
- exports.createCorrectResponseSession = exports.getScore = exports.normalize = void 0;
12
+ exports.validate = void 0;
11
13
 
12
14
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
13
15
 
@@ -25,9 +27,9 @@ var _controllerUtils = require("@pie-lib/controller-utils");
25
27
 
26
28
  var _utils = require("./utils");
27
29
 
28
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
30
+ 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; }
29
31
 
30
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
32
+ 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; }
31
33
 
32
34
  var getFeedback = function getFeedback(correct) {
33
35
  if (correct) {
@@ -42,7 +44,8 @@ var normalize = function normalize(question) {
42
44
  promptEnabled: true,
43
45
  rationaleEnabled: true,
44
46
  teacherInstructionsEnabled: true,
45
- studentInstructionsEnabled: true
47
+ studentInstructionsEnabled: true,
48
+ choiceRationaleEnabled: true
46
49
  }, question);
47
50
  };
48
51
  /**
@@ -59,7 +62,7 @@ exports.normalize = normalize;
59
62
  function model(question, session, env, updateSession) {
60
63
  return new Promise( /*#__PURE__*/function () {
61
64
  var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(resolve) {
62
- var normalizedQuestion, _ref2, _ref2$value, value, choices, feedback, allCorrectResponses, respAreaLength, correctResponses, _loop, i, _ret, lockChoiceOrder, keys, _i, key, teacherInstructions, rationale, out;
65
+ var normalizedQuestion, _ref2, _ref2$value, value, choices, feedback, allCorrectResponses, respAreaLength, correctResponses, _loop, i, _ret, lockChoiceOrder, keys, _i, key, teacherInstructions, rationale, choicesWillNullRationales, out;
63
66
 
64
67
  return _regenerator["default"].wrap(function _callee$(_context) {
65
68
  while (1) {
@@ -165,19 +168,30 @@ function model(question, session, env, updateSession) {
165
168
  case 29:
166
169
  teacherInstructions = null;
167
170
  rationale = null;
171
+ choicesWillNullRationales = (Object.keys(choices) || []).reduce(function (acc, currentValue) {
172
+ acc[currentValue] = (choices[currentValue] || []).map(function (choice) {
173
+ return _objectSpread(_objectSpread({}, choice), {}, {
174
+ rationale: null
175
+ });
176
+ });
177
+ return acc;
178
+ }, {});
168
179
 
169
180
  if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
170
181
  rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;
171
182
  teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
183
+ choices = normalizedQuestion.choiceRationaleEnabled ? normalizedQuestion.choices : choicesWillNullRationales;
172
184
  } else {
173
185
  rationale = null;
174
186
  teacherInstructions = null;
187
+ choices = choicesWillNullRationales;
175
188
  }
176
189
 
177
190
  out = {
178
191
  disabled: env.mode !== 'gather',
179
192
  mode: env.mode,
180
193
  prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
194
+ displayType: normalizedQuestion.displayType,
181
195
  markup: normalizedQuestion.markup,
182
196
  choices: choices,
183
197
  feedback: feedback,
@@ -187,7 +201,7 @@ function model(question, session, env, updateSession) {
187
201
  };
188
202
  resolve(out);
189
203
 
190
- case 34:
204
+ case 35:
191
205
  case "end":
192
206
  return _context.stop();
193
207
  }
@@ -302,4 +316,23 @@ var createCorrectResponseSession = function createCorrectResponseSession(questio
302
316
  };
303
317
 
304
318
  exports.createCorrectResponseSession = createCorrectResponseSession;
319
+
320
+ var validate = function validate() {
321
+ var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
322
+ var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
323
+ var markup = model.markup;
324
+ var maxResponseAreas = config.maxResponseAreas;
325
+ var errors = {};
326
+ var nbOfResponseAreas = ((markup || '').match(/\{\{(\d+)\}\}/g) || []).length;
327
+
328
+ if (nbOfResponseAreas > maxResponseAreas) {
329
+ errors.responseAreasError = "No more than ".concat(maxResponseAreas, " response areas should be defined.");
330
+ } else if (nbOfResponseAreas < 1) {
331
+ errors.responseAreasError = 'There should be defined at least 1 response area.';
332
+ }
333
+
334
+ return errors;
335
+ };
336
+
337
+ exports.validate = validate;
305
338
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["getFeedback","correct","normalize","question","promptEnabled","rationaleEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","model","session","env","updateSession","Promise","resolve","normalizedQuestion","value","choices","obj","area","key","choice","feedback","mode","allCorrectResponses","respAreaLength","Object","keys","length","correctResponses","i","result","answer","correctChoice","isCorrect","lockChoiceOrder","teacherInstructions","rationale","role","out","disabled","prompt","markup","responseCorrect","getScore","undefined","config","maxScore","correctCount","total","str","toFixed","parseFloat","outcome","score","empty","partialScoringEnabled","partialScoring","enabled","Math","floor","createCorrectResponseSession","forEach","correctChoices","filter","c","id"],"mappings":"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","sourcesContent":["import map from 'lodash/map';\nimport reduce from 'lodash/reduce';\nimport isEmpty from 'lodash/isEmpty';\nimport {\n lockChoices,\n getShuffledChoices,\n partialScoring,\n} from '@pie-lib/controller-utils';\n\nimport { getAllCorrectResponses } from './utils';\n\nconst getFeedback = (correct) => {\n if (correct) {\n return 'correct';\n }\n\n return 'incorrect';\n};\n\nexport const normalize = (question) => ({\n promptEnabled: true,\n rationaleEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n ...question,\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 function model(question, session, env, updateSession) {\n return new Promise(async (resolve) => {\n const normalizedQuestion = normalize(question);\n const { value = {} } = session || {};\n let choices = reduce(\n normalizedQuestion.choices,\n (obj, area, key) => {\n obj[key] = map(area, (choice) => choice);\n\n return obj;\n },\n {}\n );\n\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n const allCorrectResponses = getAllCorrectResponses(normalizedQuestion);\n const respAreaLength = Object.keys(allCorrectResponses).length;\n let correctResponses = 0;\n\n for (let i = 0; i < respAreaLength; i++) {\n const result = reduce(\n allCorrectResponses,\n (obj, choices, key) => {\n const answer = (value && value[key]) || '';\n const correctChoice = choices[i] || '';\n const isCorrect =\n answer && correctChoice && correctChoice === answer;\n\n obj.feedback[key] = getFeedback(isCorrect);\n\n if (isCorrect) {\n obj.correctResponses += 1;\n }\n\n return obj;\n },\n { correctResponses: 0, feedback: {} }\n );\n\n if (result.correctResponses >= correctResponses) {\n correctResponses = result.correctResponses;\n feedback = result.feedback;\n }\n\n if (result.correctResponses === respAreaLength) {\n break;\n }\n }\n }\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (!lockChoiceOrder) {\n const keys = Object.keys(choices);\n let i;\n\n for (i = 0; i < keys.length; i++) {\n const key = keys[i];\n\n choices[key] = await getShuffledChoices(\n choices[key],\n session,\n updateSession,\n 'value'\n );\n }\n }\n\n let teacherInstructions = null;\n let rationale = null;\n\n if (\n env.role === 'instructor' &&\n (env.mode === 'view' || env.mode === 'evaluate')\n ) {\n rationale = normalizedQuestion.rationaleEnabled\n ? normalizedQuestion.rationale\n : null;\n teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n rationale = null;\n teacherInstructions = null;\n }\n\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n prompt: normalizedQuestion.promptEnabled\n ? normalizedQuestion.prompt\n : null,\n markup: normalizedQuestion.markup,\n choices,\n feedback,\n\n responseCorrect:\n env.mode === 'evaluate'\n ? getScore(normalizedQuestion, session) === 1\n : undefined,\n rationale,\n teacherInstructions,\n };\n\n resolve(out);\n });\n}\n\nexport const getScore = (config, session) => {\n const { value = {} } = session || {};\n const maxScore =\n config && config.choices ? Object.keys(config.choices).length : 0;\n const allCorrectResponses = getAllCorrectResponses(config);\n let correctCount = 0;\n\n for (let i = 0; i < maxScore; i++) {\n const result = reduce(\n allCorrectResponses,\n (total, choices, key) => {\n const answer = (value && value[key]) || '';\n const correctChoice = choices[i] || '';\n\n if (correctChoice && answer && correctChoice === answer) {\n return total;\n }\n\n return total - 1;\n },\n maxScore\n );\n\n if (result > correctCount) {\n correctCount = result;\n }\n\n if (result === maxScore) {\n break;\n }\n }\n\n const str = (correctCount / maxScore).toFixed(2);\n\n return parseFloat(str);\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 =\n * false. the value in `env` will override the value in `model`.\n * @param {Object} model - the main model\n * @param {boolean} model.partialScoring - is partial scoring enabled (if undefined set to to true)\n * @param {*} session\n * @param {Object} env\n * @param {boolean} env.partialScoring - is partial scoring enabled (if undefined default to true) This overrides\n * `model.partialScoring`.\n */\nexport function outcome(model, session, env = {}) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const score = getScore(model, session);\n\n resolve({\n score: partialScoringEnabled ? score : Math.floor(score),\n 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;\n const value = {};\n\n if (choices) {\n Object.keys(choices).forEach((key, i) => {\n const correctChoices =\n choices[key] && choices[key].filter((c) => c.correct);\n\n value[i] = correctChoices && correctChoices[0].value;\n });\n }\n\n resolve({\n id: '1',\n value,\n });\n } else {\n resolve(null);\n }\n });\n};\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../src/index.js"],"names":["getFeedback","correct","normalize","question","promptEnabled","rationaleEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","choiceRationaleEnabled","model","session","env","updateSession","Promise","resolve","normalizedQuestion","value","choices","obj","area","key","choice","feedback","mode","allCorrectResponses","respAreaLength","Object","keys","length","correctResponses","i","result","answer","correctChoice","isCorrect","lockChoiceOrder","teacherInstructions","rationale","choicesWillNullRationales","reduce","acc","currentValue","map","role","out","disabled","prompt","displayType","markup","responseCorrect","getScore","undefined","config","maxScore","correctCount","total","str","toFixed","parseFloat","outcome","score","empty","partialScoringEnabled","partialScoring","enabled","Math","floor","createCorrectResponseSession","forEach","correctChoices","filter","c","id","validate","maxResponseAreas","errors","nbOfResponseAreas","match","responseAreasError"],"mappings":"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","sourcesContent":["import map from 'lodash/map';\nimport reduce from 'lodash/reduce';\nimport isEmpty from 'lodash/isEmpty';\nimport {\n lockChoices,\n getShuffledChoices,\n partialScoring,\n} from '@pie-lib/controller-utils';\n\nimport { getAllCorrectResponses } from './utils';\n\nconst getFeedback = (correct) => {\n if (correct) {\n return 'correct';\n }\n\n return 'incorrect';\n};\n\nexport const normalize = (question) => ({\n promptEnabled: true,\n rationaleEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n choiceRationaleEnabled: true,\n ...question,\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 function model(question, session, env, updateSession) {\n return new Promise(async (resolve) => {\n const normalizedQuestion = normalize(question);\n const { value = {} } = session || {};\n let choices = reduce(\n normalizedQuestion.choices,\n (obj, area, key) => {\n obj[key] = map(area, (choice) => choice);\n\n return obj;\n },\n {}\n );\n\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n const allCorrectResponses = getAllCorrectResponses(normalizedQuestion);\n const respAreaLength = Object.keys(allCorrectResponses).length;\n let correctResponses = 0;\n\n for (let i = 0; i < respAreaLength; i++) {\n const result = reduce(\n allCorrectResponses,\n (obj, choices, key) => {\n const answer = (value && value[key]) || '';\n const correctChoice = choices[i] || '';\n const isCorrect =\n answer && correctChoice && correctChoice === answer;\n\n obj.feedback[key] = getFeedback(isCorrect);\n\n if (isCorrect) {\n obj.correctResponses += 1;\n }\n\n return obj;\n },\n { correctResponses: 0, feedback: {} }\n );\n\n if (result.correctResponses >= correctResponses) {\n correctResponses = result.correctResponses;\n feedback = result.feedback;\n }\n\n if (result.correctResponses === respAreaLength) {\n break;\n }\n }\n }\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (!lockChoiceOrder) {\n const keys = Object.keys(choices);\n let i;\n\n for (i = 0; i < keys.length; i++) {\n const key = keys[i];\n\n choices[key] = await getShuffledChoices(\n choices[key],\n session,\n updateSession,\n 'value'\n );\n }\n }\n\n let teacherInstructions = null;\n let rationale = null;\n\n const choicesWillNullRationales = (Object.keys(choices) || []).reduce(\n (acc, currentValue) => {\n acc[currentValue] = (choices[currentValue] || []).map((choice) => ({\n ...choice,\n rationale: null,\n }));\n\n return acc;\n },\n {}\n );\n\n if (\n env.role === 'instructor' &&\n (env.mode === 'view' || env.mode === 'evaluate')\n ) {\n rationale = normalizedQuestion.rationaleEnabled\n ? normalizedQuestion.rationale\n : null;\n teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n\n choices = normalizedQuestion.choiceRationaleEnabled\n ? normalizedQuestion.choices\n : choicesWillNullRationales;\n } else {\n rationale = null;\n teacherInstructions = null;\n choices = choicesWillNullRationales;\n }\n\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n prompt: normalizedQuestion.promptEnabled\n ? normalizedQuestion.prompt\n : null,\n displayType: normalizedQuestion.displayType,\n markup: normalizedQuestion.markup,\n choices,\n feedback,\n\n responseCorrect:\n env.mode === 'evaluate'\n ? getScore(normalizedQuestion, session) === 1\n : undefined,\n rationale,\n teacherInstructions,\n };\n\n resolve(out);\n });\n}\n\nexport const getScore = (config, session) => {\n const { value = {} } = session || {};\n const maxScore =\n config && config.choices ? Object.keys(config.choices).length : 0;\n const allCorrectResponses = getAllCorrectResponses(config);\n let correctCount = 0;\n\n for (let i = 0; i < maxScore; i++) {\n const result = reduce(\n allCorrectResponses,\n (total, choices, key) => {\n const answer = (value && value[key]) || '';\n const correctChoice = choices[i] || '';\n\n if (correctChoice && answer && correctChoice === answer) {\n return total;\n }\n\n return total - 1;\n },\n maxScore\n );\n\n if (result > correctCount) {\n correctCount = result;\n }\n\n if (result === maxScore) {\n break;\n }\n }\n\n const str = (correctCount / maxScore).toFixed(2);\n\n return parseFloat(str);\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 =\n * false. the value in `env` will override the value in `model`.\n * @param {Object} model - the main model\n * @param {boolean} model.partialScoring - is partial scoring enabled (if undefined set to to true)\n * @param {*} session\n * @param {Object} env\n * @param {boolean} env.partialScoring - is partial scoring enabled (if undefined default to true) This overrides\n * `model.partialScoring`.\n */\nexport function outcome(model, session, env = {}) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const score = getScore(model, session);\n\n resolve({\n score: partialScoringEnabled ? score : Math.floor(score),\n 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;\n const value = {};\n\n if (choices) {\n Object.keys(choices).forEach((key, i) => {\n const correctChoices =\n choices[key] && choices[key].filter((c) => c.correct);\n\n value[i] = correctChoices && correctChoices[0].value;\n });\n }\n\n resolve({\n id: '1',\n value,\n });\n } else {\n resolve(null);\n }\n });\n};\n\nexport const validate = (model = {}, config = {}) => {\n const { markup } = model;\n const { maxResponseAreas } = config;\n const errors = {};\n\n const nbOfResponseAreas = ((markup || '').match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreasError = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreasError = 'There should be defined at least 1 response area.';\n }\n\n return errors;\n};\n"],"file":"index.js"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pie-element/inline-dropdown-controller",
3
3
  "private": true,
4
- "version": "3.2.14",
4
+ "version": "3.3.5",
5
5
  "description": "",
6
6
  "main": "lib/index.js",
7
7
  "module": "src/index.js",
@@ -83,6 +83,38 @@
83
83
  }
84
84
  }
85
85
  },
86
+ "spellCheck": {
87
+ "title": "ConfigureProp",
88
+ "type": "object",
89
+ "properties": {
90
+ "settings": {
91
+ "description": "Indicates if the item has to be displayed in the Settings Panel",
92
+ "type": "boolean",
93
+ "title": "settings"
94
+ },
95
+ "label": {
96
+ "description": "Indicates the label for the item that has to be displayed in the Settings Panel",
97
+ "type": "string",
98
+ "title": "label"
99
+ }
100
+ }
101
+ },
102
+ "choiceRationale": {
103
+ "title": "ConfigureProp",
104
+ "type": "object",
105
+ "properties": {
106
+ "settings": {
107
+ "description": "Indicates if the item has to be displayed in the Settings Panel",
108
+ "type": "boolean",
109
+ "title": "settings"
110
+ },
111
+ "label": {
112
+ "description": "Indicates the label for the item that has to be displayed in the Settings Panel",
113
+ "type": "string",
114
+ "title": "label"
115
+ }
116
+ }
117
+ },
86
118
  "scoringType": {
87
119
  "title": "ConfigureProp",
88
120
  "type": "object",
@@ -131,6 +163,53 @@
131
163
  }
132
164
  }
133
165
  },
166
+ "maxResponseAreas": {
167
+ "description": "Maximum number of response areas",
168
+ "type": "number",
169
+ "title": "maxResponseAreas"
170
+ },
171
+ "maxImageWidth": {
172
+ "title": "ConfigureMaxImageDimensionsProp",
173
+ "type": "object",
174
+ "properties": {
175
+ "teacherInstructions": {
176
+ "description": "Indicates the max dimension for images in teacher instructions",
177
+ "type": "number",
178
+ "title": "teacherInstructions"
179
+ },
180
+ "prompt": {
181
+ "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",
182
+ "type": "number",
183
+ "title": "prompt"
184
+ },
185
+ "rationale": {
186
+ "description": "Indicates the max dimension for images in rationale",
187
+ "type": "number",
188
+ "title": "rationale"
189
+ }
190
+ }
191
+ },
192
+ "maxImageHeight": {
193
+ "title": "ConfigureMaxImageDimensionsProp",
194
+ "type": "object",
195
+ "properties": {
196
+ "teacherInstructions": {
197
+ "description": "Indicates the max dimension for images in teacher instructions",
198
+ "type": "number",
199
+ "title": "teacherInstructions"
200
+ },
201
+ "prompt": {
202
+ "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",
203
+ "type": "number",
204
+ "title": "prompt"
205
+ },
206
+ "rationale": {
207
+ "description": "Indicates the max dimension for images in rationale",
208
+ "type": "number",
209
+ "title": "rationale"
210
+ }
211
+ }
212
+ },
134
213
  "showPrompt": {
135
214
  "description": "Determines whether prompt field will be displayed or not",
136
215
  "default": true,
@@ -166,6 +245,27 @@
166
245
  "title": "label"
167
246
  }
168
247
  }
248
+ },
249
+ "ConfigureMaxImageDimensionsProp": {
250
+ "title": "ConfigureMaxImageDimensionsProp",
251
+ "type": "object",
252
+ "properties": {
253
+ "teacherInstructions": {
254
+ "description": "Indicates the max dimension for images in teacher instructions",
255
+ "type": "number",
256
+ "title": "teacherInstructions"
257
+ },
258
+ "prompt": {
259
+ "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",
260
+ "type": "number",
261
+ "title": "prompt"
262
+ },
263
+ "rationale": {
264
+ "description": "Indicates the max dimension for images in rationale",
265
+ "type": "number",
266
+ "title": "rationale"
267
+ }
268
+ }
169
269
  }
170
270
  },
171
271
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -62,6 +62,30 @@ Indicates if the item has to be displayed in the Settings Panel
62
62
 
63
63
  Indicates the label for the item that has to be displayed in the Settings Panel
64
64
 
65
+ # `spellCheck` (object)
66
+
67
+ Properties of the `spellCheck` object:
68
+
69
+ ## `settings` (boolean)
70
+
71
+ Indicates if the item has to be displayed in the Settings Panel
72
+
73
+ ## `label` (string)
74
+
75
+ Indicates the label for the item that has to be displayed in the Settings Panel
76
+
77
+ # `choiceRationale` (object)
78
+
79
+ Properties of the `choiceRationale` object:
80
+
81
+ ## `settings` (boolean)
82
+
83
+ Indicates if the item has to be displayed in the Settings Panel
84
+
85
+ ## `label` (string)
86
+
87
+ Indicates the label for the item that has to be displayed in the Settings Panel
88
+
65
89
  # `scoringType` (object)
66
90
 
67
91
  Properties of the `scoringType` object:
@@ -98,6 +122,42 @@ Indicates if the item has to be displayed in the Settings Panel
98
122
 
99
123
  Indicates the label for the item that has to be displayed in the Settings Panel
100
124
 
125
+ # `maxResponseAreas` (number)
126
+
127
+ Maximum number of response areas
128
+
129
+ # `maxImageWidth` (object)
130
+
131
+ Properties of the `maxImageWidth` object:
132
+
133
+ ## `teacherInstructions` (number)
134
+
135
+ Indicates the max dimension for images in teacher instructions
136
+
137
+ ## `prompt` (number)
138
+
139
+ Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified
140
+
141
+ ## `rationale` (number)
142
+
143
+ Indicates the max dimension for images in rationale
144
+
145
+ # `maxImageHeight` (object)
146
+
147
+ Properties of the `maxImageHeight` object:
148
+
149
+ ## `teacherInstructions` (number)
150
+
151
+ Indicates the max dimension for images in teacher instructions
152
+
153
+ ## `prompt` (number)
154
+
155
+ Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified
156
+
157
+ ## `rationale` (number)
158
+
159
+ Indicates the max dimension for images in rationale
160
+
101
161
  # `showPrompt` (boolean)
102
162
 
103
163
  Determines whether prompt field will be displayed or not
@@ -132,4 +192,20 @@ Indicates if the item has to be displayed in the Settings Panel
132
192
 
133
193
  ### `label` (string)
134
194
 
135
- Indicates the label for the item that has to be displayed in the Settings Panel
195
+ Indicates the label for the item that has to be displayed in the Settings Panel
196
+
197
+ ## `ConfigureMaxImageDimensionsProp` (object)
198
+
199
+ Properties of the `ConfigureMaxImageDimensionsProp` object:
200
+
201
+ ### `teacherInstructions` (number)
202
+
203
+ Indicates the max dimension for images in teacher instructions
204
+
205
+ ### `prompt` (number)
206
+
207
+ Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified
208
+
209
+ ### `rationale` (number)
210
+
211
+ Indicates the max dimension for images in rationale
@@ -13,55 +13,65 @@ exports.model = (id, element) => ({
13
13
  {
14
14
  label: 'cow ',
15
15
  value: '0',
16
- correct: true
16
+ correct: true,
17
+ rationale: 'rationale cow'
17
18
  },
18
19
  {
19
20
  label: 'dog ',
20
21
  value: '1',
21
- correct: false
22
+ correct: false,
23
+ rationale: 'rationale dog'
22
24
  },
23
25
  {
24
26
  label: 'cat ',
25
27
  value: '2',
26
- correct: false
28
+ correct: false,
29
+ rationale: 'rationale car'
27
30
  }
28
31
  ],
29
32
  '1': [
30
33
  {
31
34
  label: 'over ',
32
35
  value: '0',
33
- correct: true
36
+ correct: true,
37
+ rationale: 'rationale over'
34
38
  },
35
39
  {
36
40
  label: 'under ',
37
41
  value: '1',
38
- correct: false
42
+ correct: false,
43
+ rationale: 'rationale under'
39
44
  },
40
45
  {
41
46
  label: 'across ',
42
47
  value: '2',
43
- correct: false
48
+ correct: false,
49
+ rationale: 'rationale across'
44
50
  }
45
51
  ],
46
52
  '2': [
47
53
  {
48
54
  label: 'moon ',
49
55
  value: '0',
50
- correct: true
56
+ correct: true,
57
+ rationale: 'rationale moon'
51
58
  },
52
59
  {
53
60
  label: 'sun',
54
61
  value: '2',
55
- correct: false
62
+ correct: false,
63
+ rationale: 'rationale sun'
56
64
  },
57
65
  {
58
66
  label: 'house ',
59
67
  value: '3',
60
- correct: false
68
+ correct: false,
69
+ rationale: 'rationale house'
61
70
  }
62
71
  ]
63
72
  },
64
73
  alternateResponse: {
65
74
  '2': ['2']
66
- }
75
+ },
76
+ choiceRationaleEnabled: false
67
77
  });
@@ -28,6 +28,11 @@
28
28
  "description": "Indicates if choice is correct",
29
29
  "type": "boolean",
30
30
  "title": "correct"
31
+ },
32
+ "rationale": {
33
+ "description": "Rationale for the choice",
34
+ "type": "string",
35
+ "title": "rationale"
31
36
  }
32
37
  },
33
38
  "required": [
@@ -107,6 +112,16 @@
107
112
  "type": "boolean",
108
113
  "title": "rationaleEnabled"
109
114
  },
115
+ "spellCheckEnabled": {
116
+ "description": "Indicates if spellcheck is enabled for the author. Default value is true",
117
+ "type": "boolean",
118
+ "title": "spellCheckEnabled"
119
+ },
120
+ "choiceRationaleEnabled": {
121
+ "description": "Indicates if Choice Level Rationales are enabled",
122
+ "type": "boolean",
123
+ "title": "choiceRationaleEnabled"
124
+ },
110
125
  "studentInstructionsEnabled": {
111
126
  "description": "Indicates if Student Instructions are enabled",
112
127
  "type": "boolean",
@@ -117,6 +132,11 @@
117
132
  "type": "boolean",
118
133
  "title": "teacherInstructionsEnabled"
119
134
  },
135
+ "displayType": {
136
+ "description": "Indicates display type for the container of the pie-ui element",
137
+ "type": "string",
138
+ "title": "displayType"
139
+ },
120
140
  "toolbarEditorPosition": {
121
141
  "description": "Indicates the editor's toolbar position which can be 'bottom' or 'top'",
122
142
  "default": ": 'bottom'",
@@ -140,7 +160,9 @@
140
160
  },
141
161
  "required": [
142
162
  "alternateResponses",
163
+ "choiceRationaleEnabled",
143
164
  "choices",
165
+ "displayType",
144
166
  "element",
145
167
  "id",
146
168
  "lockChoiceOrder",
@@ -149,6 +171,7 @@
149
171
  "rationale",
150
172
  "rationaleEnabled",
151
173
  "scoringType",
174
+ "spellCheckEnabled",
152
175
  "studentInstructionsEnabled",
153
176
  "teacherInstructionsEnabled"
154
177
  ],
@@ -169,6 +192,27 @@
169
192
  }
170
193
  }
171
194
  },
195
+ "ConfigureMaxImageDimensionsProp": {
196
+ "title": "ConfigureMaxImageDimensionsProp",
197
+ "type": "object",
198
+ "properties": {
199
+ "teacherInstructions": {
200
+ "description": "Indicates the max dimension for images in teacher instructions",
201
+ "type": "number",
202
+ "title": "teacherInstructions"
203
+ },
204
+ "prompt": {
205
+ "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",
206
+ "type": "number",
207
+ "title": "prompt"
208
+ },
209
+ "rationale": {
210
+ "description": "Indicates the max dimension for images in rationale",
211
+ "type": "number",
212
+ "title": "rationale"
213
+ }
214
+ }
215
+ },
172
216
  "Choice": {
173
217
  "title": "Choice",
174
218
  "type": "object",
@@ -187,6 +231,11 @@
187
231
  "description": "Indicates if choice is correct",
188
232
  "type": "boolean",
189
233
  "title": "correct"
234
+ },
235
+ "rationale": {
236
+ "description": "Rationale for the choice",
237
+ "type": "string",
238
+ "title": "rationale"
190
239
  }
191
240
  },
192
241
  "required": [
@@ -56,6 +56,14 @@ Indicates teacher instructions
56
56
 
57
57
  Indicates if Rationale are enabled
58
58
 
59
+ # `spellCheckEnabled` (boolean, required)
60
+
61
+ Indicates if spellcheck is enabled for the author. Default value is true
62
+
63
+ # `choiceRationaleEnabled` (boolean, required)
64
+
65
+ Indicates if Choice Level Rationales are enabled
66
+
59
67
  # `studentInstructionsEnabled` (boolean, required)
60
68
 
61
69
  Indicates if Student Instructions are enabled
@@ -64,6 +72,10 @@ Indicates if Student Instructions are enabled
64
72
 
65
73
  Indicates if Teacher Instructions are enabled
66
74
 
75
+ # `displayType` (string, required)
76
+
77
+ Indicates display type for the container of the pie-ui element
78
+
67
79
  # `toolbarEditorPosition` (string, enum)
68
80
 
69
81
  Indicates the editor's toolbar position which can be 'bottom' or 'top'
@@ -101,6 +113,22 @@ Indicates if the item has to be displayed in the Settings Panel
101
113
 
102
114
  Indicates the label for the item that has to be displayed in the Settings Panel
103
115
 
116
+ ## `ConfigureMaxImageDimensionsProp` (object)
117
+
118
+ Properties of the `ConfigureMaxImageDimensionsProp` object:
119
+
120
+ ### `teacherInstructions` (number)
121
+
122
+ Indicates the max dimension for images in teacher instructions
123
+
124
+ ### `prompt` (number)
125
+
126
+ Indicates the max dimension for images in prompt - this is also the default dimension for all other input fields if it's not specified
127
+
128
+ ### `rationale` (number)
129
+
130
+ Indicates the max dimension for images in rationale
131
+
104
132
  ## `Choice` (object)
105
133
 
106
134
  Properties of the `Choice` object:
@@ -115,4 +143,8 @@ The label of the choice
115
143
 
116
144
  ### `correct` (boolean)
117
145
 
118
- Indicates if choice is correct
146
+ Indicates if choice is correct
147
+
148
+ ### `rationale` (string)
149
+
150
+ Rationale for the choice
package/lib/index.js CHANGED
@@ -35,7 +35,7 @@ var _inlineDropdown = _interopRequireDefault(require("./inline-dropdown"));
35
35
 
36
36
  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); }; }
37
37
 
38
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
38
+ 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; } }
39
39
 
40
40
  var RootInlineDropdown = /*#__PURE__*/function (_HTMLElement) {
41
41
  (0, _inherits2["default"])(RootInlineDropdown, _HTMLElement);
@@ -54,6 +54,7 @@ var RootInlineDropdown = /*#__PURE__*/function (_HTMLElement) {
54
54
  rationale: _this._model.rationale,
55
55
  teacherInstructions: _this._model.teacherInstructions,
56
56
  disabled: _this._model.disabled,
57
+ displayType: _this._model.displayType,
57
58
  markup: _this._model.markup,
58
59
  mode: _this._model.mode,
59
60
  choices: _this._model.choices,