@pie-element/explicit-constructed-response 3.10.1 → 3.10.5
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 +37 -0
- package/configure/CHANGELOG.md +29 -0
- package/configure/lib/alternateResponses.js +38 -5
- package/configure/lib/alternateResponses.js.map +1 -1
- package/configure/lib/alternateSection.js +76 -7
- package/configure/lib/alternateSection.js.map +1 -1
- package/configure/lib/defaults.js +5 -0
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/ecr-toolbar.js +5 -2
- package/configure/lib/ecr-toolbar.js.map +1 -1
- package/configure/lib/index.js +2 -2
- package/configure/lib/main.js +80 -29
- package/configure/lib/main.js.map +1 -1
- package/configure/package.json +3 -3
- package/controller/CHANGELOG.md +8 -0
- package/controller/lib/index.js +14 -3
- package/controller/lib/index.js.map +1 -1
- package/controller/package.json +1 -1
- package/docs/config-schema.json +16 -0
- package/docs/config-schema.json.md +12 -0
- package/docs/demo/generate.js +1 -0
- package/docs/pie-schema.json +8 -0
- package/docs/pie-schema.json.md +6 -0
- package/lib/index.js +2 -1
- package/lib/index.js.map +1 -1
- package/lib/main.js +48 -19
- package/lib/main.js.map +1 -1
- package/lib/print.js +114 -0
- package/lib/print.js.map +1 -0
- package/package.json +11 -7
package/configure/lib/main.js
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
|
|
4
|
-
|
|
5
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
6
4
|
|
|
5
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
+
|
|
7
7
|
Object.defineProperty(exports, "__esModule", {
|
|
8
8
|
value: true
|
|
9
9
|
});
|
|
10
10
|
exports["default"] = exports.Main = void 0;
|
|
11
11
|
|
|
12
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
13
|
+
|
|
12
14
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
13
15
|
|
|
14
16
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
@@ -43,13 +45,17 @@ var _ecrToolbar = _interopRequireDefault(require("./ecr-toolbar"));
|
|
|
43
45
|
|
|
44
46
|
var _alternateResponses = _interopRequireDefault(require("./alternateResponses"));
|
|
45
47
|
|
|
46
|
-
function
|
|
48
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
49
|
+
|
|
50
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
51
|
+
|
|
52
|
+
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; }
|
|
47
53
|
|
|
48
54
|
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; }
|
|
49
55
|
|
|
50
56
|
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); }; }
|
|
51
57
|
|
|
52
|
-
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try {
|
|
58
|
+
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; } }
|
|
53
59
|
|
|
54
60
|
var toggle = _configUi.settings.toggle,
|
|
55
61
|
Panel = _configUi.settings.Panel;
|
|
@@ -150,46 +156,71 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
150
156
|
choices: choices
|
|
151
157
|
}));
|
|
152
158
|
});
|
|
159
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onLengthChanged", function (maxLengthPerChoice) {
|
|
160
|
+
var _this$props2 = _this.props,
|
|
161
|
+
model = _this$props2.model,
|
|
162
|
+
onModelChanged = _this$props2.onModelChanged;
|
|
163
|
+
onModelChanged(_objectSpread(_objectSpread({}, model), {}, {
|
|
164
|
+
maxLengthPerChoice: maxLengthPerChoice
|
|
165
|
+
}));
|
|
166
|
+
});
|
|
153
167
|
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onChangeResponse", function (index, newVal) {
|
|
154
|
-
var
|
|
168
|
+
var _this$props3 = _this.props,
|
|
169
|
+
model = _this$props3.model,
|
|
170
|
+
onModelChanged = _this$props3.onModelChanged;
|
|
171
|
+
var choices = model.choices,
|
|
172
|
+
maxLengthPerChoice = model.maxLengthPerChoice;
|
|
173
|
+
var newValLength = (newVal || '').length;
|
|
155
174
|
|
|
156
175
|
if (!choices[index]) {
|
|
157
176
|
choices[index] = [{
|
|
158
177
|
label: '',
|
|
159
178
|
value: '0'
|
|
160
179
|
}];
|
|
180
|
+
maxLengthPerChoice.splice(index, 0, newValLength);
|
|
161
181
|
}
|
|
162
182
|
|
|
163
183
|
choices[index][0].label = newVal || '';
|
|
164
184
|
|
|
165
|
-
|
|
166
|
-
|
|
185
|
+
if (maxLengthPerChoice && newVal && maxLengthPerChoice[index] < newValLength) {
|
|
186
|
+
maxLengthPerChoice[index] = newVal.length;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
onModelChanged(_objectSpread(_objectSpread({}, model), {}, {
|
|
190
|
+
choices: choices,
|
|
191
|
+
maxLengthPerChoice: maxLengthPerChoice
|
|
167
192
|
}));
|
|
168
193
|
});
|
|
169
194
|
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onChange", function (markup) {
|
|
170
|
-
var
|
|
195
|
+
var _this$props$model = _this.props.model,
|
|
196
|
+
choices = _this$props$model.choices,
|
|
197
|
+
maxLengthPerChoice = _this$props$model.maxLengthPerChoice;
|
|
171
198
|
var domMarkup = createElementFromHTML(markup);
|
|
172
199
|
var allRespAreas = domMarkup.querySelectorAll('[data-type="explicit_constructed_response"]');
|
|
173
200
|
var allChoices = {};
|
|
201
|
+
var updatedMaxLengthPerChoice = [];
|
|
174
202
|
allRespAreas.forEach(function (el, index) {
|
|
175
|
-
el.dataset.index
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
203
|
+
allChoices[index] = (0, _cloneDeep["default"])(Object.values(choices)[el.dataset.index]) || [{
|
|
204
|
+
label: el.dataset.value || '',
|
|
205
|
+
value: '0'
|
|
206
|
+
}];
|
|
179
207
|
|
|
180
|
-
if (
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
208
|
+
if (maxLengthPerChoice[el.dataset.index]) {
|
|
209
|
+
updatedMaxLengthPerChoice[index] = maxLengthPerChoice[el.dataset.index];
|
|
210
|
+
} else {
|
|
211
|
+
var labelLengthsArr = allChoices[index].map(function (choice) {
|
|
212
|
+
return (choice.label || '').length;
|
|
213
|
+
});
|
|
214
|
+
updatedMaxLengthPerChoice[index] = Math.max.apply(Math, (0, _toConsumableArray2["default"])(labelLengthsArr));
|
|
185
215
|
}
|
|
186
216
|
|
|
187
|
-
|
|
217
|
+
el.dataset.index = index;
|
|
188
218
|
});
|
|
189
219
|
|
|
190
220
|
_this.props.onModelChanged(_objectSpread(_objectSpread({}, _this.props.model), {}, {
|
|
191
221
|
choices: allChoices,
|
|
192
|
-
slateMarkup: domMarkup.innerHTML
|
|
222
|
+
slateMarkup: domMarkup.innerHTML,
|
|
223
|
+
maxLengthPerChoice: updatedMaxLengthPerChoice
|
|
193
224
|
}));
|
|
194
225
|
});
|
|
195
226
|
return _this;
|
|
@@ -198,22 +229,38 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
198
229
|
(0, _createClass2["default"])(Main, [{
|
|
199
230
|
key: "componentDidMount",
|
|
200
231
|
value: function componentDidMount() {
|
|
201
|
-
var
|
|
232
|
+
var _this$props4 = this.props,
|
|
233
|
+
_this$props4$model = _this$props4.model,
|
|
234
|
+
slateMarkup = _this$props4$model.slateMarkup,
|
|
235
|
+
choices = _this$props4$model.choices,
|
|
236
|
+
_this$props4$model$ma = _this$props4$model.maxLengthPerChoice,
|
|
237
|
+
maxLengthPerChoice = _this$props4$model$ma === void 0 ? [] : _this$props4$model$ma,
|
|
238
|
+
onModelChanged = _this$props4.onModelChanged;
|
|
202
239
|
this.setState({
|
|
203
240
|
markup: slateMarkup
|
|
241
|
+
}); //calculate maxLengthPerChoice array if it is not defined or defined incorrectly
|
|
242
|
+
|
|
243
|
+
Object.values(choices).forEach(function (choice, index) {
|
|
244
|
+
var labelLengthsArr = (choice || []).map(function (choice) {
|
|
245
|
+
return (choice.label || '').length;
|
|
246
|
+
});
|
|
247
|
+
maxLengthPerChoice[index] = Math.max.apply(Math, (0, _toConsumableArray2["default"])(labelLengthsArr).concat([maxLengthPerChoice && maxLengthPerChoice[index] || 1]));
|
|
204
248
|
});
|
|
249
|
+
onModelChanged(_objectSpread(_objectSpread({}, this.props.model), {}, {
|
|
250
|
+
maxLengthPerChoice: maxLengthPerChoice
|
|
251
|
+
}));
|
|
205
252
|
}
|
|
206
253
|
}, {
|
|
207
254
|
key: "render",
|
|
208
255
|
value: function render() {
|
|
209
256
|
var _this2 = this;
|
|
210
257
|
|
|
211
|
-
var _this$
|
|
212
|
-
classes = _this$
|
|
213
|
-
model = _this$
|
|
214
|
-
configuration = _this$
|
|
215
|
-
onConfigurationChanged = _this$
|
|
216
|
-
imageSupport = _this$
|
|
258
|
+
var _this$props5 = this.props,
|
|
259
|
+
classes = _this$props5.classes,
|
|
260
|
+
model = _this$props5.model,
|
|
261
|
+
configuration = _this$props5.configuration,
|
|
262
|
+
onConfigurationChanged = _this$props5.onConfigurationChanged,
|
|
263
|
+
imageSupport = _this$props5.imageSupport;
|
|
217
264
|
|
|
218
265
|
var _ref = configuration || {},
|
|
219
266
|
_ref$prompt = _ref.prompt,
|
|
@@ -223,7 +270,9 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
223
270
|
_ref$rationale = _ref.rationale,
|
|
224
271
|
rationale = _ref$rationale === void 0 ? {} : _ref$rationale,
|
|
225
272
|
_ref$teacherInstructi = _ref.teacherInstructions,
|
|
226
|
-
teacherInstructions = _ref$teacherInstructi === void 0 ? {} : _ref$teacherInstructi
|
|
273
|
+
teacherInstructions = _ref$teacherInstructi === void 0 ? {} : _ref$teacherInstructi,
|
|
274
|
+
_ref$maxLengthPerChoi = _ref.maxLengthPerChoice,
|
|
275
|
+
maxLengthPerChoice = _ref$maxLengthPerChoi === void 0 ? {} : _ref$maxLengthPerChoi;
|
|
227
276
|
|
|
228
277
|
var _ref2 = model || {},
|
|
229
278
|
teacherInstructionsEnabled = _ref2.teacherInstructionsEnabled,
|
|
@@ -256,7 +305,8 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
256
305
|
},
|
|
257
306
|
groups: {
|
|
258
307
|
Settings: {
|
|
259
|
-
partialScoring: partialScoring.settings && toggle(partialScoring.label)
|
|
308
|
+
partialScoring: partialScoring.settings && toggle(partialScoring.label),
|
|
309
|
+
maxLengthPerChoiceEnabled: maxLengthPerChoice.settings && toggle(maxLengthPerChoice.label)
|
|
260
310
|
},
|
|
261
311
|
Properties: {
|
|
262
312
|
teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),
|
|
@@ -325,7 +375,8 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
325
375
|
className: classes.text
|
|
326
376
|
}, "Define Alternates"), /*#__PURE__*/_react["default"].createElement(_alternateResponses["default"], {
|
|
327
377
|
model: model,
|
|
328
|
-
onChange: this.onResponsesChanged
|
|
378
|
+
onChange: this.onResponsesChanged,
|
|
379
|
+
onLengthChange: this.onLengthChanged
|
|
329
380
|
}), rationaleEnabled && /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
|
|
330
381
|
label: rationale.label,
|
|
331
382
|
className: classes.promptHolder
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/main.jsx"],"names":["toggle","settings","Panel","styles","theme","promptHolder","width","paddingBottom","spacing","unit","marginBottom","prompt","paddingTop","markup","minHeight","design","choiceConfiguration","switchElement","justifyContent","margin","addButton","text","color","fontFamily","fontSize","lineHeight","marginTop","createElementFromHTML","htmlString","div","document","createElement","innerHTML","trim","Main","newVal","props","onModelChanged","model","rationale","teacherInstructions","slateMarkup","choices","index","label","value","domMarkup","allRespAreas","querySelectorAll","allChoices","forEach","el","dataset","newChoices","Object","values","setState","classes","configuration","onConfigurationChanged","imageSupport","partialScoring","teacherInstructionsEnabled","promptEnabled","rationaleEnabled","toolbarOpts","toolbarEditorPosition","position","onModelChange","Settings","Properties","onTeacherInstructionsChanged","onPromptChanged","ALL_PLUGINS","type","options","duplicates","respAreaToolbar","node","onToolbarDone","correctChoice","data","get","onChangeResponse","onChange","onBlur","onResponsesChanged","onRationaleChanged","React","Component","PropTypes","object","isRequired","disableSidePanel","bool","func","shape","add","Styled"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport cloneDeep from 'lodash/cloneDeep';\nimport isEmpty from 'lodash/isEmpty';\nimport EditableHtml, { ALL_PLUGINS } from '@pie-lib/editable-html';\nimport { InputContainer, layout, settings } from '@pie-lib/config-ui';\nimport { withStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\n\nconst { toggle, Panel } = settings;\nimport ECRToolbar from './ecr-toolbar';\nimport AlternateResponses from './alternateResponses';\n\nconst styles = theme => ({\n promptHolder: {\n width: '100%',\n paddingBottom: theme.spacing.unit * 2,\n marginBottom: theme.spacing.unit * 2\n },\n prompt: {\n paddingTop: theme.spacing.unit * 2,\n width: '100%'\n },\n markup: {\n minHeight: '100px',\n paddingTop: theme.spacing.unit * 2,\n width: '100%',\n '& [data-slate-editor=\"true\"]': {\n minHeight: '100px'\n }\n },\n design: {\n paddingTop: theme.spacing.unit * 3\n },\n choiceConfiguration: {\n paddingTop: theme.spacing.unit * 2,\n paddingBottom: theme.spacing.unit * 2\n },\n switchElement: {\n justifyContent: 'space-between',\n margin: 0\n },\n addButton: {\n float: 'right'\n },\n text: {\n color: '#495B8F',\n fontFamily: 'Cerebri Sans',\n fontSize: '16px',\n lineHeight: '19px',\n marginTop: theme.spacing.unit * 4\n }\n});\n\nconst createElementFromHTML = htmlString => {\n const div = document.createElement('div');\n\n div.innerHTML = htmlString.trim();\n\n return div;\n};\n\nexport class Main extends React.Component {\n static propTypes = {\n configuration: PropTypes.object.isRequired,\n model: PropTypes.object.isRequired,\n disableSidePanel: PropTypes.bool,\n onModelChanged: PropTypes.func.isRequired,\n onConfigurationChanged: PropTypes.func.isRequired,\n classes: PropTypes.object.isRequired,\n imageSupport: PropTypes.shape({\n add: PropTypes.func.isRequired,\n delete: PropTypes.func.isRequired\n })\n };\n\n state = {};\n\n componentDidMount() {\n const {\n model: { slateMarkup }\n } = this.props;\n\n this.setState({\n markup: slateMarkup\n });\n }\n\n onModelChange = newVal => {\n this.props.onModelChanged({\n ...this.props.model,\n ...newVal\n });\n };\n\n onPromptChanged = prompt => {\n this.props.onModelChanged({\n ...this.props.model,\n prompt\n });\n };\n\n onRationaleChanged = rationale => {\n this.props.onModelChanged({\n ...this.props.model,\n rationale\n });\n };\n\n onTeacherInstructionsChanged = teacherInstructions => {\n const { model, onModelChanged } = this.props;\n\n onModelChanged({\n ...model,\n teacherInstructions\n });\n };\n\n onMarkupChanged = slateMarkup => {\n this.props.onModelChanged({\n ...this.props.model,\n slateMarkup\n });\n };\n\n onResponsesChanged = choices => {\n this.props.onModelChanged({\n ...this.props.model,\n choices\n });\n };\n\n onChangeResponse = (index, newVal) => {\n const {\n model: { choices }\n } = this.props;\n\n if (!choices[index]) {\n choices[index] = [{ label: '', value: '0' }];\n }\n\n choices[index][0].label = newVal || '';\n\n this.props.onModelChanged({\n ...this.props.model,\n choices\n });\n };\n\n onChange = markup => {\n const {\n model: { choices }\n } = this.props;\n const domMarkup = createElementFromHTML(markup);\n const allRespAreas = domMarkup.querySelectorAll(\n '[data-type=\"explicit_constructed_response\"]'\n );\n\n const allChoices = {};\n\n allRespAreas.forEach((el, index) => {\n el.dataset.index = index;\n });\n\n allRespAreas.forEach((el, index) => {\n const newChoices = cloneDeep(Object.values(choices)[index]);\n\n if (newChoices) {\n newChoices[0] = {\n label: el.dataset.value || '',\n value: '0'\n };\n }\n\n allChoices[el.dataset.index] = newChoices;\n });\n\n this.props.onModelChanged({\n ...this.props.model,\n choices: allChoices,\n slateMarkup: domMarkup.innerHTML\n });\n };\n\n render() {\n const {\n classes,\n model,\n configuration,\n onConfigurationChanged,\n imageSupport\n } = this.props;\n const {\n prompt = {},\n partialScoring = {},\n rationale = {},\n teacherInstructions = {}\n } = configuration || {};\n const { teacherInstructionsEnabled, promptEnabled, rationaleEnabled } =\n model || {};\n const toolbarOpts = {};\n\n switch (model.toolbarEditorPosition) {\n case 'top':\n toolbarOpts.position = 'top';\n break;\n default:\n toolbarOpts.position = 'bottom';\n break;\n }\n return (\n <div className={classes.design}>\n <layout.ConfigLayout\n settings={\n <Panel\n model={model}\n configuration={configuration}\n onChangeModel={model => this.onModelChange(model)}\n onChangeConfiguration={configuration =>\n onConfigurationChanged(configuration, true)\n }\n groups={{\n Settings: {\n partialScoring:\n partialScoring.settings && toggle(partialScoring.label)\n },\n Properties: {\n teacherInstructionsEnabled:\n teacherInstructions.settings &&\n toggle(teacherInstructions.label),\n rationaleEnabled:\n rationale.settings && toggle(rationale.label),\n promptEnabled: prompt.settings && toggle(prompt.label)\n }\n }}\n />\n }\n >\n <div>\n {teacherInstructionsEnabled && (\n <InputContainer\n label={teacherInstructions.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.teacherInstructions || ''}\n onChange={this.onTeacherInstructionsChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n toolbarOpts={toolbarOpts}\n />\n </InputContainer>\n )}\n {promptEnabled && (\n <InputContainer\n label={prompt.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.prompt}\n onChange={this.onPromptChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n disableUnderline\n toolbarOpts={toolbarOpts}\n />\n </InputContainer>\n )}\n <Typography className={classes.text}>\n Define Template, Choices, and Correct Responses\n </Typography>\n <EditableHtml\n activePlugins={ALL_PLUGINS}\n toolbarOpts={{ position: 'top' }}\n responseAreaProps={{\n type: 'explicit-constructed-response',\n options: {\n duplicates: true\n },\n respAreaToolbar: (node, value, onToolbarDone) => {\n const { model } = this.props;\n const correctChoice = (model.choices[\n node.data.get('index')\n ] || [])[0];\n\n return () => (\n <ECRToolbar\n onChangeResponse={newVal =>\n this.onChangeResponse(node.data.get('index'), newVal)\n }\n node={node}\n value={value}\n onToolbarDone={onToolbarDone}\n correctChoice={correctChoice}\n />\n );\n }\n }}\n className={classes.markup}\n markup={model.slateMarkup}\n onChange={this.onChange}\n imageSupport={imageSupport}\n onBlur={this.onBlur}\n disabled={false}\n highlightShape={false}\n />\n {!isEmpty(model.choices) && (\n <Typography className={classes.text}>\n Define Alternates\n </Typography>\n )}\n <AlternateResponses\n model={model}\n onChange={this.onResponsesChanged}\n />\n {rationaleEnabled && (\n <InputContainer\n label={rationale.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.rationale || ''}\n onChange={this.onRationaleChanged}\n imageSupport={imageSupport}\n toolbarOpts={toolbarOpts}\n />\n </InputContainer>\n )}\n </div>\n </layout.ConfigLayout>\n </div>\n );\n }\n}\n\nconst Styled = withStyles(styles)(Main);\n\nexport default Styled;\n"],"file":"main.js"}
|
|
1
|
+
{"version":3,"sources":["../src/main.jsx"],"names":["toggle","settings","Panel","styles","theme","promptHolder","width","paddingBottom","spacing","unit","marginBottom","prompt","paddingTop","markup","minHeight","design","choiceConfiguration","switchElement","justifyContent","margin","addButton","text","color","fontFamily","fontSize","lineHeight","marginTop","createElementFromHTML","htmlString","div","document","createElement","innerHTML","trim","Main","newVal","props","onModelChanged","model","rationale","teacherInstructions","slateMarkup","choices","maxLengthPerChoice","index","newValLength","length","label","value","splice","domMarkup","allRespAreas","querySelectorAll","allChoices","updatedMaxLengthPerChoice","forEach","el","Object","values","dataset","labelLengthsArr","map","choice","Math","max","setState","classes","configuration","onConfigurationChanged","imageSupport","partialScoring","teacherInstructionsEnabled","promptEnabled","rationaleEnabled","toolbarOpts","toolbarEditorPosition","position","onModelChange","Settings","maxLengthPerChoiceEnabled","Properties","onTeacherInstructionsChanged","onPromptChanged","ALL_PLUGINS","type","options","duplicates","respAreaToolbar","node","onToolbarDone","correctChoice","data","get","onChangeResponse","onChange","onBlur","onResponsesChanged","onLengthChanged","onRationaleChanged","React","Component","PropTypes","object","isRequired","disableSidePanel","bool","func","shape","add","Styled"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport cloneDeep from 'lodash/cloneDeep';\nimport isEmpty from 'lodash/isEmpty';\nimport EditableHtml, {ALL_PLUGINS} from '@pie-lib/editable-html';\nimport {InputContainer, layout, settings} from '@pie-lib/config-ui';\nimport {withStyles} from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport ECRToolbar from './ecr-toolbar';\nimport AlternateResponses from './alternateResponses';\n\nconst { toggle, Panel } = settings;\n\nconst styles = theme => ({\n promptHolder: {\n width: '100%',\n paddingBottom: theme.spacing.unit * 2,\n marginBottom: theme.spacing.unit * 2\n },\n prompt: {\n paddingTop: theme.spacing.unit * 2,\n width: '100%'\n },\n markup: {\n minHeight: '100px',\n paddingTop: theme.spacing.unit * 2,\n width: '100%',\n '& [data-slate-editor=\"true\"]': {\n minHeight: '100px'\n }\n },\n design: {\n paddingTop: theme.spacing.unit * 3\n },\n choiceConfiguration: {\n paddingTop: theme.spacing.unit * 2,\n paddingBottom: theme.spacing.unit * 2\n },\n switchElement: {\n justifyContent: 'space-between',\n margin: 0\n },\n addButton: {\n float: 'right'\n },\n text: {\n color: '#495B8F',\n fontFamily: 'Cerebri Sans',\n fontSize: '16px',\n lineHeight: '19px',\n marginTop: theme.spacing.unit * 4\n }\n});\n\nconst createElementFromHTML = htmlString => {\n const div = document.createElement('div');\n\n div.innerHTML = htmlString.trim();\n\n return div;\n};\n\nexport class Main extends React.Component {\n static propTypes = {\n configuration: PropTypes.object.isRequired,\n model: PropTypes.object.isRequired,\n disableSidePanel: PropTypes.bool,\n onModelChanged: PropTypes.func.isRequired,\n onConfigurationChanged: PropTypes.func.isRequired,\n classes: PropTypes.object.isRequired,\n imageSupport: PropTypes.shape({\n add: PropTypes.func.isRequired,\n delete: PropTypes.func.isRequired\n })\n };\n\n state = {};\n\n componentDidMount() {\n const {\n model: { slateMarkup, choices, maxLengthPerChoice = [] }, onModelChanged\n } = this.props;\n\n this.setState({\n markup: slateMarkup\n });\n\n //calculate maxLengthPerChoice array if it is not defined or defined incorrectly\n Object.values(choices).forEach((choice, index) => {\n const labelLengthsArr = (choice || []).map(choice => (choice.label || '').length);\n\n maxLengthPerChoice[index] = Math.max(...labelLengthsArr, maxLengthPerChoice && maxLengthPerChoice[index] || 1);\n });\n\n onModelChanged({\n ...this.props.model,\n maxLengthPerChoice\n });\n }\n\n onModelChange = newVal => {\n this.props.onModelChanged({\n ...this.props.model,\n ...newVal\n });\n };\n\n onPromptChanged = prompt => {\n this.props.onModelChanged({\n ...this.props.model,\n prompt\n });\n };\n\n onRationaleChanged = rationale => {\n this.props.onModelChanged({\n ...this.props.model,\n rationale\n });\n };\n\n onTeacherInstructionsChanged = teacherInstructions => {\n const { model, onModelChanged } = this.props;\n\n onModelChanged({\n ...model,\n teacherInstructions\n });\n };\n\n onMarkupChanged = slateMarkup => {\n this.props.onModelChanged({\n ...this.props.model,\n slateMarkup\n });\n };\n\n onResponsesChanged = choices => {\n this.props.onModelChanged({\n ...this.props.model,\n choices\n });\n };\n\n onLengthChanged = maxLengthPerChoice => {\n const { model, onModelChanged } = this.props;\n\n onModelChanged({\n ...model,\n maxLengthPerChoice\n });\n };\n\n onChangeResponse = (index, newVal) => {\n const { model, onModelChanged} = this.props;\n const { choices, maxLengthPerChoice } = model;\n const newValLength = (newVal || '').length;\n\n if (!choices[index]) {\n choices[index] = [{ label: '', value: '0' }];\n maxLengthPerChoice.splice(index, 0, newValLength);\n }\n\n choices[index][0].label = newVal || '';\n\n if (maxLengthPerChoice && newVal && maxLengthPerChoice[index] < newValLength) {\n maxLengthPerChoice[index] = newVal.length;\n }\n\n onModelChanged({\n ...model,\n choices,\n maxLengthPerChoice\n });\n };\n\n onChange = markup => {\n const {\n model: { choices, maxLengthPerChoice }\n } = this.props;\n const domMarkup = createElementFromHTML(markup);\n const allRespAreas = domMarkup.querySelectorAll(\n '[data-type=\"explicit_constructed_response\"]'\n );\n\n const allChoices = {};\n const updatedMaxLengthPerChoice = [];\n\n allRespAreas.forEach((el, index) => {\n allChoices[index] = cloneDeep(Object.values(choices)[el.dataset.index]) || [{label: el.dataset.value || '', value: '0'}];\n if (maxLengthPerChoice[el.dataset.index]) {\n updatedMaxLengthPerChoice[index] = maxLengthPerChoice[el.dataset.index];\n } else {\n const labelLengthsArr = allChoices[index].map(choice => (choice.label || '').length);\n updatedMaxLengthPerChoice[index] = Math.max(...labelLengthsArr);\n }\n\n el.dataset.index = index;\n });\n\n this.props.onModelChanged({\n ...this.props.model,\n choices: allChoices,\n slateMarkup: domMarkup.innerHTML,\n maxLengthPerChoice: updatedMaxLengthPerChoice\n });\n };\n\n render() {\n const {\n classes,\n model,\n configuration,\n onConfigurationChanged,\n imageSupport\n } = this.props;\n const {\n prompt = {},\n partialScoring = {},\n rationale = {},\n teacherInstructions = {},\n maxLengthPerChoice = {}\n } = configuration || {};\n const { teacherInstructionsEnabled, promptEnabled, rationaleEnabled } = model || {};\n const toolbarOpts = {};\n\n switch (model.toolbarEditorPosition) {\n case 'top':\n toolbarOpts.position = 'top';\n break;\n default:\n toolbarOpts.position = 'bottom';\n break;\n }\n return (\n <div className={classes.design}>\n <layout.ConfigLayout\n settings={\n <Panel\n model={model}\n configuration={configuration}\n onChangeModel={model => this.onModelChange(model)}\n onChangeConfiguration={configuration =>\n onConfigurationChanged(configuration, true)\n }\n groups={{\n Settings: {\n partialScoring:\n partialScoring.settings && toggle(partialScoring.label),\n maxLengthPerChoiceEnabled:\n maxLengthPerChoice.settings && toggle(maxLengthPerChoice.label),\n },\n Properties: {\n teacherInstructionsEnabled:\n teacherInstructions.settings &&\n toggle(teacherInstructions.label),\n rationaleEnabled:\n rationale.settings && toggle(rationale.label),\n promptEnabled: prompt.settings && toggle(prompt.label)\n }\n }}\n />\n }\n >\n <div>\n {teacherInstructionsEnabled && (\n <InputContainer\n label={teacherInstructions.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.teacherInstructions || ''}\n onChange={this.onTeacherInstructionsChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n toolbarOpts={toolbarOpts}\n />\n </InputContainer>\n )}\n {promptEnabled && (\n <InputContainer\n label={prompt.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.prompt}\n onChange={this.onPromptChanged}\n imageSupport={imageSupport}\n nonEmpty={false}\n disableUnderline\n toolbarOpts={toolbarOpts}\n />\n </InputContainer>\n )}\n <Typography className={classes.text}>\n Define Template, Choices, and Correct Responses\n </Typography>\n <EditableHtml\n activePlugins={ALL_PLUGINS}\n toolbarOpts={{ position: 'top' }}\n responseAreaProps={{\n type: 'explicit-constructed-response',\n options: {\n duplicates: true\n },\n respAreaToolbar: (node, value, onToolbarDone) => {\n const { model } = this.props;\n const correctChoice = (model.choices[\n node.data.get('index')\n ] || [])[0];\n\n return () => (\n <ECRToolbar\n onChangeResponse={newVal =>\n this.onChangeResponse(node.data.get('index'), newVal)\n }\n node={node}\n value={value}\n onToolbarDone={onToolbarDone}\n correctChoice={correctChoice}\n />\n );\n }\n }}\n className={classes.markup}\n markup={model.slateMarkup}\n onChange={this.onChange}\n imageSupport={imageSupport}\n onBlur={this.onBlur}\n disabled={false}\n highlightShape={false}\n />\n {!isEmpty(model.choices) && (\n <Typography className={classes.text}>\n Define Alternates\n </Typography>\n )}\n <AlternateResponses\n model={model}\n onChange={this.onResponsesChanged}\n onLengthChange={this.onLengthChanged}\n />\n {rationaleEnabled && (\n <InputContainer\n label={rationale.label}\n className={classes.promptHolder}\n >\n <EditableHtml\n className={classes.prompt}\n markup={model.rationale || ''}\n onChange={this.onRationaleChanged}\n imageSupport={imageSupport}\n toolbarOpts={toolbarOpts}\n />\n </InputContainer>\n )}\n </div>\n </layout.ConfigLayout>\n </div>\n );\n }\n}\n\nconst Styled = withStyles(styles)(Main);\n\nexport default Styled;\n"],"file":"main.js"}
|
package/configure/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/explicit-constructed-response-configure",
|
|
3
|
-
"version": "3.5.
|
|
3
|
+
"version": "3.5.31",
|
|
4
4
|
"private": true,
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"modue": "src/index.js",
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
"@material-ui/core": "^3.9.2",
|
|
9
9
|
"@material-ui/icons": "^3.0.1",
|
|
10
10
|
"@pie-framework/pie-configure-events": "^1.2.0",
|
|
11
|
-
"@pie-lib/config-ui": "^10.10.
|
|
12
|
-
"@pie-lib/editable-html": "^7.17.
|
|
11
|
+
"@pie-lib/config-ui": "^10.10.11",
|
|
12
|
+
"@pie-lib/editable-html": "^7.17.11",
|
|
13
13
|
"classnames": "^2.2.6",
|
|
14
14
|
"debug": "^3.1.0",
|
|
15
15
|
"lodash": "^4.17.15",
|
package/controller/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [3.3.3](https://github.com/pie-framework/pie-elements/compare/@pie-element/explicit-constructed-response-controller@3.3.2...@pie-element/explicit-constructed-response-controller@3.3.3) (2021-10-18)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @pie-element/explicit-constructed-response-controller
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
6
14
|
## [3.3.2](https://github.com/pie-framework/pie-elements/compare/@pie-element/explicit-constructed-response-controller@3.3.0...@pie-element/explicit-constructed-response-controller@3.3.2) (2021-08-05)
|
|
7
15
|
|
|
8
16
|
|
package/controller/lib/index.js
CHANGED
|
@@ -11,6 +11,8 @@ exports.createCorrectResponseSession = exports.getScore = exports.prepareVal = e
|
|
|
11
11
|
|
|
12
12
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
13
13
|
|
|
14
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
15
|
+
|
|
14
16
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
15
17
|
|
|
16
18
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
@@ -27,7 +29,7 @@ var _debug = _interopRequireDefault(require("debug"));
|
|
|
27
29
|
|
|
28
30
|
var _controllerUtils = require("@pie-lib/controller-utils");
|
|
29
31
|
|
|
30
|
-
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; }
|
|
32
|
+
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; }
|
|
31
33
|
|
|
32
34
|
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; }
|
|
33
35
|
|
|
@@ -86,7 +88,7 @@ exports.normalize = normalize;
|
|
|
86
88
|
function model(question, session, env) {
|
|
87
89
|
return new Promise( /*#__PURE__*/function () {
|
|
88
90
|
var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(resolve) {
|
|
89
|
-
var normalizedQuestion, defaultFeedback, _ref2, _ref2$value, value, preparChoiceFn, choices, feedback, showNote, out;
|
|
91
|
+
var normalizedQuestion, defaultFeedback, _ref2, _ref2$value, value, preparChoiceFn, choices, feedback, showNote, _normalizedQuestion$m, maxLengthPerChoice, out;
|
|
90
92
|
|
|
91
93
|
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
92
94
|
while (1) {
|
|
@@ -140,6 +142,14 @@ function model(question, session, env) {
|
|
|
140
142
|
showNote = true;
|
|
141
143
|
}
|
|
142
144
|
});
|
|
145
|
+
_normalizedQuestion$m = normalizedQuestion.maxLengthPerChoice, maxLengthPerChoice = _normalizedQuestion$m === void 0 ? [] : _normalizedQuestion$m; //calculate maxLengthPerChoice array if it is not defined or defined incorrectly
|
|
146
|
+
|
|
147
|
+
Object.values(choices).forEach(function (choice, index) {
|
|
148
|
+
var labelLengthsArr = (choice || []).map(function (choice) {
|
|
149
|
+
return (choice.label || '').length;
|
|
150
|
+
});
|
|
151
|
+
maxLengthPerChoice[index] = Math.max.apply(Math, (0, _toConsumableArray2["default"])(labelLengthsArr).concat([maxLengthPerChoice && maxLengthPerChoice[index] || 1]));
|
|
152
|
+
});
|
|
143
153
|
out = {
|
|
144
154
|
disabled: env.mode !== 'gather',
|
|
145
155
|
mode: env.mode,
|
|
@@ -150,6 +160,7 @@ function model(question, session, env) {
|
|
|
150
160
|
env: env,
|
|
151
161
|
note: normalizedQuestion.note,
|
|
152
162
|
showNote: showNote,
|
|
163
|
+
maxLengthPerChoice: maxLengthPerChoice,
|
|
153
164
|
responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined
|
|
154
165
|
};
|
|
155
166
|
|
|
@@ -163,7 +174,7 @@ function model(question, session, env) {
|
|
|
163
174
|
|
|
164
175
|
resolve(out);
|
|
165
176
|
|
|
166
|
-
case
|
|
177
|
+
case 15:
|
|
167
178
|
case "end":
|
|
168
179
|
return _context.stop();
|
|
169
180
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["log","prepareChoice","mode","defaultFeedback","choice","out","label","value","correct","feedbackType","feedback","type","getFeedback","normalize","question","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","model","session","env","Promise","resolve","choices","Object","keys","forEach","key","map","item","index","normalizedQuestion","assign","incorrect","preparChoiceFn","obj","area","respArea","chosenValue","val","c","prepareVal","showNote","values","length","disabled","prompt","markup","note","responseCorrect","getScore","undefined","role","rationale","teacherInstructions","getTextFromHTML","html","replace","trim","config","responseAreas","match","maxScore","correctCount","total","str","toFixed","parseFloat","outcome","partialScoringEnabled","partialScoring","enabled","score","empty","createCorrectResponseSession","i","id"],"mappings":"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","sourcesContent":["import map from 'lodash/map';\nimport reduce from 'lodash/reduce';\nimport find from 'lodash/find';\nimport isEmpty from 'lodash/isEmpty';\nimport debug from 'debug';\nimport { partialScoring } from '@pie-lib/controller-utils';\n\nconst log = debug('explicit-constructed-response:controller');\n\nexport const prepareChoice = (mode, defaultFeedback) => choice => {\n const out = {\n label: choice.label,\n value: choice.value\n };\n\n if (mode === 'evaluate') {\n out.correct = true;\n\n const feedbackType = (choice.feedback && choice.feedback.type) || 'none';\n\n if (feedbackType === 'default') {\n out.feedback = defaultFeedback['correct'];\n } else if (feedbackType === 'custom') {\n out.feedback = choice.feedback.value;\n }\n }\n\n return out;\n};\n\nconst getFeedback = value => {\n if (value) {\n return 'correct';\n }\n\n return 'incorrect';\n};\n\nexport const normalize = question => ({\n rationaleEnabled: true,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n ...question,\n});\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n */\nexport function model(question, session, env) {\n return new Promise(async resolve => {\n // this was added to treat an exception, when the model has choices without the \"value\" property\n // like: { label: 'test' }\n if (question.choices) {\n Object.keys(question.choices).forEach(key => {\n question.choices[key] = question.choices[key].map((item, index) => {\n if (!item.value) {\n log('Choice does not contain \"value\" property, which is required.', item);\n return { value: `${index}`, ...item };\n }\n\n return item;\n })\n });\n }\n\n const normalizedQuestion = normalize(question);\n const defaultFeedback = Object.assign(\n { correct: 'Correct', incorrect: 'Incorrect' },\n normalizedQuestion.defaultFeedback\n );\n\n const { value = {} } = session || {};\n\n const preparChoiceFn = prepareChoice(env.mode, defaultFeedback);\n\n let choices = reduce(\n normalizedQuestion.choices,\n (obj, area, key) => {\n obj[key] = map(area, preparChoiceFn);\n\n return obj;\n },\n {}\n );\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n feedback = reduce(normalizedQuestion.choices, (obj, respArea, key) => {\n const chosenValue = value && value[key];\n const val = !isEmpty(chosenValue) && find(respArea, c => prepareVal(c.label) === prepareVal(chosenValue));\n\n obj[key] = getFeedback(val);\n\n return obj;\n }, {});\n }\n\n let showNote = false;\n // check if a choice has an alternate\n Object.values(choices).forEach(choice => {\n if (choice && choice.length > 1) {\n showNote = true;\n }\n });\n\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n markup: normalizedQuestion.markup,\n choices,\n feedback,\n env,\n note: normalizedQuestion.note,\n showNote,\n responseCorrect:\n env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined\n };\n\n if (\n env.role === 'instructor' &&\n (env.mode === 'view' || env.mode === 'evaluate')\n ) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n}\n\nconst getTextFromHTML = (html) => {\n return (html || '').replace(/<\\/?[^>]+(>|$)/g, '');\n};\n\nexport const prepareVal = html => {\n const value = getTextFromHTML(html);\n\n return value.trim();\n};\n\nexport const getScore = (config, session) => {\n const { value } = session || {};\n\n if (!session || isEmpty(session) || !value) {\n return 0;\n }\n\n const responseAreas = config.markup && config.markup.match(/\\{\\{(.)\\}\\}/g);\n const maxScore = responseAreas ? responseAreas.length : 0;\n const correctCount = reduce(config.choices, (total, respArea, key) => {\n const chosenValue = value && value[key];\n\n if (isEmpty(chosenValue) || !find(respArea, c => prepareVal(c.label) === prepareVal(chosenValue))) {\n return total;\n }\n\n return total + 1;\n }, 0);\n\n const str = maxScore ? (correctCount / maxScore).toFixed(2) : 0;\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 const partialScoringEnabled = partialScoring.enabled(model, env);\n const score = getScore(model, session);\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0, empty: isEmpty(session) });\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 Object.keys(choices).forEach((key, i) => {\n value[i] = choices[key][0].label;\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":["log","prepareChoice","mode","defaultFeedback","choice","out","label","value","correct","feedbackType","feedback","type","getFeedback","normalize","question","rationaleEnabled","promptEnabled","teacherInstructionsEnabled","studentInstructionsEnabled","model","session","env","Promise","resolve","choices","Object","keys","forEach","key","map","item","index","normalizedQuestion","assign","incorrect","preparChoiceFn","obj","area","respArea","chosenValue","val","c","prepareVal","showNote","values","length","maxLengthPerChoice","labelLengthsArr","Math","max","disabled","prompt","markup","note","responseCorrect","getScore","undefined","role","rationale","teacherInstructions","getTextFromHTML","html","replace","trim","config","responseAreas","match","maxScore","correctCount","total","str","toFixed","parseFloat","outcome","partialScoringEnabled","partialScoring","enabled","score","empty","createCorrectResponseSession","i","id"],"mappings":"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","sourcesContent":["import map from 'lodash/map';\nimport reduce from 'lodash/reduce';\nimport find from 'lodash/find';\nimport isEmpty from 'lodash/isEmpty';\nimport debug from 'debug';\nimport { partialScoring } from '@pie-lib/controller-utils';\n\nconst log = debug('explicit-constructed-response:controller');\n\nexport const prepareChoice = (mode, defaultFeedback) => choice => {\n const out = {\n label: choice.label,\n value: choice.value\n };\n\n if (mode === 'evaluate') {\n out.correct = true;\n\n const feedbackType = (choice.feedback && choice.feedback.type) || 'none';\n\n if (feedbackType === 'default') {\n out.feedback = defaultFeedback['correct'];\n } else if (feedbackType === 'custom') {\n out.feedback = choice.feedback.value;\n }\n }\n\n return out;\n};\n\nconst getFeedback = value => {\n if (value) {\n return 'correct';\n }\n\n return 'incorrect';\n};\n\nexport const normalize = question => ({\n rationaleEnabled: true,\n promptEnabled: true,\n teacherInstructionsEnabled: true,\n studentInstructionsEnabled: true,\n ...question,\n});\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n */\nexport function model(question, session, env) {\n return new Promise(async resolve => {\n // this was added to treat an exception, when the model has choices without the \"value\" property\n // like: { label: 'test' }\n if (question.choices) {\n Object.keys(question.choices).forEach(key => {\n question.choices[key] = question.choices[key].map((item, index) => {\n if (!item.value) {\n log('Choice does not contain \"value\" property, which is required.', item);\n return { value: `${index}`, ...item };\n }\n\n return item;\n })\n });\n }\n\n const normalizedQuestion = normalize(question);\n const defaultFeedback = Object.assign(\n { correct: 'Correct', incorrect: 'Incorrect' },\n normalizedQuestion.defaultFeedback\n );\n\n const { value = {} } = session || {};\n\n const preparChoiceFn = prepareChoice(env.mode, defaultFeedback);\n\n let choices = reduce(\n normalizedQuestion.choices,\n (obj, area, key) => {\n obj[key] = map(area, preparChoiceFn);\n\n return obj;\n },\n {}\n );\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n feedback = reduce(normalizedQuestion.choices, (obj, respArea, key) => {\n const chosenValue = value && value[key];\n const val = !isEmpty(chosenValue) && find(respArea, c => prepareVal(c.label) === prepareVal(chosenValue));\n\n obj[key] = getFeedback(val);\n\n return obj;\n }, {});\n }\n\n let showNote = false;\n // check if a choice has an alternate\n Object.values(choices).forEach(choice => {\n if (choice && choice.length > 1) {\n showNote = true;\n }\n });\n\n const { maxLengthPerChoice = [] } = normalizedQuestion;\n\n //calculate maxLengthPerChoice array if it is not defined or defined incorrectly\n Object.values(choices).forEach((choice, index) => {\n const labelLengthsArr = (choice || []).map(choice => (choice.label || '').length);\n\n maxLengthPerChoice[index] = Math.max(...labelLengthsArr, maxLengthPerChoice && maxLengthPerChoice[index] || 1);\n });\n\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n markup: normalizedQuestion.markup,\n choices,\n feedback,\n env,\n note: normalizedQuestion.note,\n showNote,\n maxLengthPerChoice,\n responseCorrect:\n env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined\n };\n\n if (\n env.role === 'instructor' &&\n (env.mode === 'view' || env.mode === 'evaluate')\n ) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n}\n\nconst getTextFromHTML = (html) => {\n return (html || '').replace(/<\\/?[^>]+(>|$)/g, '');\n};\n\nexport const prepareVal = html => {\n const value = getTextFromHTML(html);\n\n return value.trim();\n};\n\nexport const getScore = (config, session) => {\n const { value } = session || {};\n\n if (!session || isEmpty(session) || !value) {\n return 0;\n }\n\n const responseAreas = config.markup && config.markup.match(/\\{\\{(.)\\}\\}/g);\n const maxScore = responseAreas ? responseAreas.length : 0;\n const correctCount = reduce(config.choices, (total, respArea, key) => {\n const chosenValue = value && value[key];\n\n if (isEmpty(chosenValue) || !find(respArea, c => prepareVal(c.label) === prepareVal(chosenValue))) {\n return total;\n }\n\n return total + 1;\n }, 0);\n\n const str = maxScore ? (correctCount / maxScore).toFixed(2) : 0;\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 const partialScoringEnabled = partialScoring.enabled(model, env);\n const score = getScore(model, session);\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0, empty: isEmpty(session) });\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 Object.keys(choices).forEach((key, i) => {\n value[i] = choices[key][0].label;\n });\n\n resolve({\n id: '1',\n value\n });\n } else {\n resolve(null);\n }\n });\n};\n"],"file":"index.js"}
|
package/controller/package.json
CHANGED
package/docs/config-schema.json
CHANGED
|
@@ -131,6 +131,22 @@
|
|
|
131
131
|
}
|
|
132
132
|
}
|
|
133
133
|
},
|
|
134
|
+
"maxLengthPerChoice": {
|
|
135
|
+
"title": "ConfigureProp",
|
|
136
|
+
"type": "object",
|
|
137
|
+
"properties": {
|
|
138
|
+
"settings": {
|
|
139
|
+
"description": "Indicates if the item has to be displayed in the Settings Panel",
|
|
140
|
+
"type": "boolean",
|
|
141
|
+
"title": "settings"
|
|
142
|
+
},
|
|
143
|
+
"label": {
|
|
144
|
+
"description": "Indicates the label for the item that has to be displayed in the Settings Panel",
|
|
145
|
+
"type": "string",
|
|
146
|
+
"title": "label"
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
},
|
|
134
150
|
"showPrompt": {
|
|
135
151
|
"description": "Determines whether prompt field will be displayed or not",
|
|
136
152
|
"default": true,
|
|
@@ -98,6 +98,18 @@ Indicates if the item has to be displayed in the Settings Panel
|
|
|
98
98
|
|
|
99
99
|
Indicates the label for the item that has to be displayed in the Settings Panel
|
|
100
100
|
|
|
101
|
+
# `maxLengthPerChoice` (object)
|
|
102
|
+
|
|
103
|
+
Properties of the `maxLengthPerChoice` object:
|
|
104
|
+
|
|
105
|
+
## `settings` (boolean)
|
|
106
|
+
|
|
107
|
+
Indicates if the item has to be displayed in the Settings Panel
|
|
108
|
+
|
|
109
|
+
## `label` (string)
|
|
110
|
+
|
|
111
|
+
Indicates the label for the item that has to be displayed in the Settings Panel
|
|
112
|
+
|
|
101
113
|
# `showPrompt` (boolean)
|
|
102
114
|
|
|
103
115
|
Determines whether prompt field will be displayed or not
|
package/docs/demo/generate.js
CHANGED
|
@@ -12,6 +12,7 @@ exports.model = (id, element) => ({
|
|
|
12
12
|
1: [choice('over', '0'), choice('past', '1'), choice('beyond', '2')],
|
|
13
13
|
2: [choice('moon', '0')]
|
|
14
14
|
},
|
|
15
|
+
maxLengthPerChoice: [6, 6, 4],
|
|
15
16
|
prompt: 'Complete the sentence',
|
|
16
17
|
note: 'The answer shown above is the most common correct answer for this item. One or more additional correct answers are also defined, and will also be recognized as correct.',
|
|
17
18
|
promptEnabled: true,
|
package/docs/pie-schema.json
CHANGED
|
@@ -108,6 +108,14 @@
|
|
|
108
108
|
"type": "string",
|
|
109
109
|
"title": "toolbarEditorPosition"
|
|
110
110
|
},
|
|
111
|
+
"maxLengthPerChoice": {
|
|
112
|
+
"description": "Indicates the maximum length for each response area",
|
|
113
|
+
"type": "array",
|
|
114
|
+
"items": {
|
|
115
|
+
"type": "number"
|
|
116
|
+
},
|
|
117
|
+
"title": "maxLengthPerChoice"
|
|
118
|
+
},
|
|
111
119
|
"id": {
|
|
112
120
|
"description": "Identifier to identify the Pie Element in html markup, Must be unique within a pie item config.",
|
|
113
121
|
"type": "string",
|
package/docs/pie-schema.json.md
CHANGED
|
@@ -71,6 +71,12 @@ This element must be one of the following enum values:
|
|
|
71
71
|
|
|
72
72
|
Default: `": 'bottom'"`
|
|
73
73
|
|
|
74
|
+
# `maxLengthPerChoice` (array)
|
|
75
|
+
|
|
76
|
+
Indicates the maximum length for each response area
|
|
77
|
+
|
|
78
|
+
The object is an array with all elements of the type `number`.
|
|
79
|
+
|
|
74
80
|
# `id` (string, required)
|
|
75
81
|
|
|
76
82
|
Identifier to identify the Pie Element in html markup, Must be unique within a pie item config.
|
package/lib/index.js
CHANGED
|
@@ -35,7 +35,7 @@ var _main = _interopRequireDefault(require("./main"));
|
|
|
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 {
|
|
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 InlineDropdown = /*#__PURE__*/function (_HTMLElement) {
|
|
41
41
|
(0, _inherits2["default"])(InlineDropdown, _HTMLElement);
|
|
@@ -60,6 +60,7 @@ var InlineDropdown = /*#__PURE__*/function (_HTMLElement) {
|
|
|
60
60
|
choices: _this._model.choices,
|
|
61
61
|
markup: _this._model.markup,
|
|
62
62
|
mode: _this._model.mode,
|
|
63
|
+
maxLengthPerChoice: _this._model.maxLengthPerChoice,
|
|
63
64
|
value: _this._session.value,
|
|
64
65
|
feedback: _this._model.feedback,
|
|
65
66
|
onChange: _this.changeSession
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["InlineDropdown","_model","_session","elem","React","createElement","Main","teacherInstructions","prompt","note","showNote","env","rationale","disabled","choices","markup","mode","value","feedback","onChange","changeSession","ReactDOM","render","dispatchEvent","SessionChangedEvent","tagName","toLowerCase","session","dispatchChangedEvent","_render","m","ModelSetEvent","s","HTMLElement"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AAIA;;AAEA;;;;;;IAEqBA,c;;;;;AACnB,4BAAc;AAAA;;AAAA;AACZ;AADY,gGA4BJ,YAAM;AACd,UAAI,MAAKC,MAAL,IAAe,MAAKC,QAAxB,EAAkC;AAChC,YAAIC,IAAI,gBAAGC,kBAAMC,aAAN,CAAoBC,gBAApB,EAA0B;AACnCC,UAAAA,mBAAmB,EAAE,MAAKN,MAAL,CAAYM,mBADE;AAEnCC,UAAAA,MAAM,EAAE,MAAKP,MAAL,CAAYO,MAFe;AAGnCC,UAAAA,IAAI,EAAE,MAAKR,MAAL,CAAYQ,IAHiB;AAInCC,UAAAA,QAAQ,EAAE,MAAKT,MAAL,CAAYS,QAJa;AAKnCC,UAAAA,GAAG,EAAE,MAAKV,MAAL,CAAYU,GALkB;AAMnCC,UAAAA,SAAS,EAAE,MAAKX,MAAL,CAAYW,SANY;AAOnCC,UAAAA,QAAQ,EAAE,MAAKZ,MAAL,CAAYY,QAPa;AAQnCC,UAAAA,OAAO,EAAE,MAAKb,MAAL,CAAYa,OARc;AASnCC,UAAAA,MAAM,EAAE,MAAKd,MAAL,CAAYc,MATe;AAUnCC,UAAAA,IAAI,EAAE,MAAKf,MAAL,CAAYe,IAViB;AAWnCC,UAAAA,KAAK,EAAE,
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"names":["InlineDropdown","_model","_session","elem","React","createElement","Main","teacherInstructions","prompt","note","showNote","env","rationale","disabled","choices","markup","mode","maxLengthPerChoice","value","feedback","onChange","changeSession","ReactDOM","render","dispatchEvent","SessionChangedEvent","tagName","toLowerCase","session","dispatchChangedEvent","_render","m","ModelSetEvent","s","HTMLElement"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AAIA;;AAEA;;;;;;IAEqBA,c;;;;;AACnB,4BAAc;AAAA;;AAAA;AACZ;AADY,gGA4BJ,YAAM;AACd,UAAI,MAAKC,MAAL,IAAe,MAAKC,QAAxB,EAAkC;AAChC,YAAIC,IAAI,gBAAGC,kBAAMC,aAAN,CAAoBC,gBAApB,EAA0B;AACnCC,UAAAA,mBAAmB,EAAE,MAAKN,MAAL,CAAYM,mBADE;AAEnCC,UAAAA,MAAM,EAAE,MAAKP,MAAL,CAAYO,MAFe;AAGnCC,UAAAA,IAAI,EAAE,MAAKR,MAAL,CAAYQ,IAHiB;AAInCC,UAAAA,QAAQ,EAAE,MAAKT,MAAL,CAAYS,QAJa;AAKnCC,UAAAA,GAAG,EAAE,MAAKV,MAAL,CAAYU,GALkB;AAMnCC,UAAAA,SAAS,EAAE,MAAKX,MAAL,CAAYW,SANY;AAOnCC,UAAAA,QAAQ,EAAE,MAAKZ,MAAL,CAAYY,QAPa;AAQnCC,UAAAA,OAAO,EAAE,MAAKb,MAAL,CAAYa,OARc;AASnCC,UAAAA,MAAM,EAAE,MAAKd,MAAL,CAAYc,MATe;AAUnCC,UAAAA,IAAI,EAAE,MAAKf,MAAL,CAAYe,IAViB;AAWnCC,UAAAA,kBAAkB,EAAE,MAAKhB,MAAL,CAAYgB,kBAXG;AAYnCC,UAAAA,KAAK,EAAE,MAAKhB,QAAL,CAAcgB,KAZc;AAanCC,UAAAA,QAAQ,EAAE,MAAKlB,MAAL,CAAYkB,QAba;AAcnCC,UAAAA,QAAQ,EAAE,MAAKC;AAdoB,SAA1B,CAAX;;AAgBAC,6BAASC,MAAT,CAAgBpB,IAAhB,kDAA4B,YAAM;AAChC;AACD,SAFD;AAGD;AACF,KAlDa;AAAA,6GAoDS,YAAM;AAC3B,YAAKqB,aAAL,CACE,IAAIC,oCAAJ,CACE,MAAKC,OAAL,CAAaC,WAAb,EADF,EAEE,MAAKC,OAAL,IAAgB,CAAC,CAAC,MAAKA,OAAL,CAAaV,KAFjC,CADF;AAMD,KA3Da;AAAA,sGA6DE,UAAAA,KAAK,EAAI;AACvB,YAAKU,OAAL,CAAaV,KAAb,GAAqBA,KAArB;;AACA,YAAKW,oBAAL;;AACA,YAAKC,OAAL;AACD,KAjEa;AAEZ,UAAK7B,MAAL,GAAc,IAAd;AACA,UAAKC,QAAL,GAAgB,IAAhB;AAHY;AAIb;;;;SAED,aAAU6B,CAAV,EAAa;AACX,WAAK9B,MAAL,GAAc8B,CAAd;AACA,WAAKP,aAAL,CACE,IAAIQ,8BAAJ,CACE,KAAKN,OAAL,CAAaC,WAAb,EADF,EAEE,KAAKC,OAAL,IAAgB,CAAC,CAAC,KAAKA,OAAL,CAAaV,KAFjC,EAGE,CAAC,CAAC,KAAKjB,MAHT,CADF;;AAQA,WAAK6B,OAAL;AACD;;;SAOD,eAAc;AACZ,aAAO,KAAK5B,QAAZ;AACD,K;SAPD,aAAY+B,CAAZ,EAAe;AACb,WAAK/B,QAAL,GAAgB+B,CAAhB;;AACA,WAAKH,OAAL;AACD;;;WA6CD,6BAAoB;AAClB,WAAKA,OAAL;AACD;;;kDAtEyCI,W","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport {\n ModelSetEvent,\n SessionChangedEvent\n} from '@pie-framework/pie-player-events';\nimport { renderMath } from '@pie-lib/math-rendering';\n\nimport Main from './main';\n\nexport default class InlineDropdown extends HTMLElement {\n constructor() {\n super();\n this._model = null;\n this._session = null;\n }\n\n set model(m) {\n this._model = m;\n this.dispatchEvent(\n new ModelSetEvent(\n this.tagName.toLowerCase(),\n this.session && !!this.session.value,\n !!this._model\n )\n );\n\n this._render();\n }\n\n set session(s) {\n this._session = s;\n this._render();\n }\n\n get session() {\n return this._session;\n }\n\n _render = () => {\n if (this._model && this._session) {\n let elem = React.createElement(Main, {\n teacherInstructions: this._model.teacherInstructions,\n prompt: this._model.prompt,\n note: this._model.note,\n showNote: this._model.showNote,\n env: this._model.env,\n rationale: this._model.rationale,\n disabled: this._model.disabled,\n choices: this._model.choices,\n markup: this._model.markup,\n mode: this._model.mode,\n maxLengthPerChoice: this._model.maxLengthPerChoice,\n value: this._session.value,\n feedback: this._model.feedback,\n onChange: this.changeSession\n });\n ReactDOM.render(elem, this, () => {\n renderMath(this);\n });\n }\n };\n\n dispatchChangedEvent = () => {\n this.dispatchEvent(\n new SessionChangedEvent(\n this.tagName.toLowerCase(),\n this.session && !!this.session.value\n )\n );\n };\n\n changeSession = value => {\n this.session.value = value;\n this.dispatchChangedEvent();\n this._render();\n };\n\n connectedCallback() {\n this._render();\n }\n}\n"],"file":"index.js"}
|