@pie-element/complex-rubric 2.1.2-next.27 → 2.1.2-next.34
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/configure/lib/main.js +6 -2
- package/configure/lib/main.js.map +1 -1
- package/configure/src/main.jsx +2 -2
- package/controller/lib/index.js +148 -1
- package/controller/lib/index.js.map +1 -1
- package/controller/lib/utils.js +13 -0
- package/controller/lib/utils.js.map +1 -0
- package/controller/src/index.js +118 -0
- package/controller/src/utils.js +3 -0
- package/package.json +4 -4
package/configure/lib/main.js
CHANGED
|
@@ -110,7 +110,9 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
110
110
|
ref: function ref(_ref) {
|
|
111
111
|
if (_ref) {
|
|
112
112
|
_this2.simpleRubric = _ref;
|
|
113
|
-
_this2.simpleRubric.model = rubrics.simpleRubric
|
|
113
|
+
_this2.simpleRubric.model = _objectSpread(_objectSpread({}, rubrics.simpleRubric), {}, {
|
|
114
|
+
errors: model.errors || {}
|
|
115
|
+
});
|
|
114
116
|
_this2.simpleRubric.configuration = _objectSpread(_objectSpread({}, simpleRubric), {}, {
|
|
115
117
|
width: width
|
|
116
118
|
});
|
|
@@ -126,7 +128,9 @@ var Main = /*#__PURE__*/function (_React$Component) {
|
|
|
126
128
|
ref: function ref(_ref2) {
|
|
127
129
|
if (_ref2) {
|
|
128
130
|
_this2.multiTraitRubric = _ref2;
|
|
129
|
-
_this2.multiTraitRubric.model = rubrics.multiTraitRubric
|
|
131
|
+
_this2.multiTraitRubric.model = _objectSpread(_objectSpread({}, rubrics.multiTraitRubric), {}, {
|
|
132
|
+
errors: model.errors || {}
|
|
133
|
+
});
|
|
130
134
|
_this2.multiTraitRubric.configuration = _objectSpread(_objectSpread({}, multiTraitRubric), {}, {
|
|
131
135
|
width: width || multiTraitRubric.width
|
|
132
136
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/main.jsx"],"names":["styles","Main","model","onModelChanged","props","e","rubricType","target","value","configuration","canUpdateModel","rubrics","contentDimensions","multiTraitRubric","simpleRubric","width","rubricTag","RUBRIC_TYPES","SIMPLE_RUBRIC","ref","MULTI_TRAIT_RUBRIC","onChangeRubricType","React","Component","classes","PropTypes","object","bool","func","onConfigurationChanged"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;AAEA,IAAMA,MAAM,GAAG,EAAf;;IAEaC,I;;;;;;;;;;;;;;;uGAUM,UAACC,KAAD,EAAW;AAC1B,UAAQC,cAAR,GAA2B,MAAKC,KAAhC,CAAQD,cAAR;AAEA,aAAOA,cAAc,CAACD,KAAD,CAArB;AACD,K;2GAEoB,UAACG,CAAD,EAAO;AAC1B,UAAQH,KAAR,GAAkB,MAAKE,KAAvB,CAAQF,KAAR;AAEA,UAAMI,UAAU,GAAGD,CAAC,CAACE,MAAF,CAASC,KAA5B;;AACA,YAAKL,cAAL,iCAAyBD,KAAzB;AAAgCI,QAAAA,UAAU,EAAVA;AAAhC;AACD,K;;;;;;WAED,kBAAS;AAAA;;AACP,wBAAiD,KAAKF,KAAtD;AAAA,UAAQF,KAAR,eAAQA,KAAR;AAAA,UAAeO,aAAf,eAAeA,aAAf;AAAA,UAA8BC,cAA9B,eAA8BA,cAA9B;AACA,2BAAyBR,KAAzB,CAAQS,OAAR;AAAA,UAAQA,OAAR,+BAAkB,EAAlB;AACA,UAAML,UAAN,GAAqBJ,KAArB,CAAMI,UAAN;AACA,kCAA0EG,aAA1E,CAAQG,iBAAR;AAAA,UAAQA,iBAAR,sCAA4B,EAA5B;AAAA,UAAgCC,gBAAhC,GAA0EJ,aAA1E,CAAgCI,gBAAhC;AAAA,UAAkDC,YAAlD,GAA0EL,aAA1E,CAAkDK,YAAlD;AAAA,UAAgEC,KAAhE,GAA0EN,aAA1E,CAAgEM,KAAhE;AACA,UAAIC,SAAS,GAAG,EAAhB;;AAEA,UAAI,CAACV,UAAL,EAAiB;AACfA,QAAAA,UAAU,GAAGW,qBAAaC,aAA1B;AACD;;AAED,UAAIR,cAAJ,EAAoB;AAClB,gBAAQJ,UAAR;AACE,eAAKW,qBAAaC,aAAlB;AACA;AACEF,YAAAA,SAAS,gBACP;AACE,cAAA,EAAE,EAAC,cADL;AAEE,cAAA,GAAG,EAAC,eAFN;AAGE,cAAA,GAAG,EAAE,aAACG,IAAD,EAAS;AACZ,oBAAIA,IAAJ,EAAS;AACP,kBAAA,MAAI,CAACL,YAAL,GAAoBK,IAApB;AACA,kBAAA,MAAI,CAACL,YAAL,CAAkBZ,KAAlB,
|
|
1
|
+
{"version":3,"sources":["../src/main.jsx"],"names":["styles","Main","model","onModelChanged","props","e","rubricType","target","value","configuration","canUpdateModel","rubrics","contentDimensions","multiTraitRubric","simpleRubric","width","rubricTag","RUBRIC_TYPES","SIMPLE_RUBRIC","ref","errors","MULTI_TRAIT_RUBRIC","onChangeRubricType","React","Component","classes","PropTypes","object","bool","func","onConfigurationChanged"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { RUBRIC_TYPES } from '@pie-lib/pie-toolbox/rubric';\nimport { layout } from '@pie-lib/pie-toolbox/config-ui';\nimport Radio from '@material-ui/core/Radio';\nimport RadioGroup from '@material-ui/core/RadioGroup';\nimport { withStyles } from '@material-ui/core/styles';\nimport { FormControlLabel } from '@material-ui/core';\n\nconst styles = {};\n\nexport class Main extends React.Component {\n static propTypes = {\n classes: PropTypes.object,\n canUpdateModel: PropTypes.bool,\n configuration: PropTypes.object,\n model: PropTypes.object,\n onModelChanged: PropTypes.func,\n onConfigurationChanged: PropTypes.func,\n };\n\n onModelChanged = (model) => {\n const { onModelChanged } = this.props;\n\n return onModelChanged(model);\n };\n\n onChangeRubricType = (e) => {\n const { model } = this.props;\n\n const rubricType = e.target.value;\n this.onModelChanged({ ...model, rubricType });\n };\n\n render() {\n const { model, configuration, canUpdateModel } = this.props;\n const { rubrics = {} } = model;\n let { rubricType } = model;\n const { contentDimensions = {}, multiTraitRubric, simpleRubric, width } = configuration;\n let rubricTag = '';\n\n if (!rubricType) {\n rubricType = RUBRIC_TYPES.SIMPLE_RUBRIC;\n }\n\n if (canUpdateModel) {\n switch (rubricType) {\n case RUBRIC_TYPES.SIMPLE_RUBRIC:\n default:\n rubricTag = (\n <rubric-configure\n id=\"simpleRubric\"\n key=\"simple-rubric\"\n ref={(ref) => {\n if (ref) {\n this.simpleRubric = ref;\n this.simpleRubric.model = {...rubrics.simpleRubric, errors: model.errors || {}};\n this.simpleRubric.configuration = { ...simpleRubric, width };\n }\n }}\n />\n );\n break;\n\n case RUBRIC_TYPES.MULTI_TRAIT_RUBRIC:\n rubricTag = (\n <multi-trait-rubric-configure\n id=\"multiTraitRubric\"\n key=\"multi-trait-rubric\"\n ref={(ref) => {\n if (ref) {\n this.multiTraitRubric = ref;\n\n this.multiTraitRubric.model = {...rubrics.multiTraitRubric, errors: model.errors || {} };\n this.multiTraitRubric.configuration = { ...multiTraitRubric, width: width || multiTraitRubric.width };\n }\n }}\n />\n );\n break;\n }\n }\n\n return (\n <layout.ConfigLayout dimensions={contentDimensions} hideSettings={true} settings={null}>\n <RadioGroup\n aria-label=\"rubric-type\"\n name=\"rubricType\"\n value={model.rubricType}\n onChange={this.onChangeRubricType}\n >\n <FormControlLabel\n value={RUBRIC_TYPES.SIMPLE_RUBRIC}\n control={<Radio checked={rubricType === RUBRIC_TYPES.SIMPLE_RUBRIC} />}\n label=\"Simple Rubric\"\n />\n\n <FormControlLabel\n value={RUBRIC_TYPES.MULTI_TRAIT_RUBRIC}\n control={<Radio checked={rubricType === RUBRIC_TYPES.MULTI_TRAIT_RUBRIC} />}\n label=\"Multi Trait Rubric\"\n />\n </RadioGroup>\n\n {rubricTag}\n </layout.ConfigLayout>\n );\n }\n}\n\nexport default withStyles(styles)(Main);\n"],"file":"main.js"}
|
package/configure/src/main.jsx
CHANGED
|
@@ -54,7 +54,7 @@ export class Main extends React.Component {
|
|
|
54
54
|
ref={(ref) => {
|
|
55
55
|
if (ref) {
|
|
56
56
|
this.simpleRubric = ref;
|
|
57
|
-
this.simpleRubric.model = rubrics.simpleRubric;
|
|
57
|
+
this.simpleRubric.model = {...rubrics.simpleRubric, errors: model.errors || {}};
|
|
58
58
|
this.simpleRubric.configuration = { ...simpleRubric, width };
|
|
59
59
|
}
|
|
60
60
|
}}
|
|
@@ -71,7 +71,7 @@ export class Main extends React.Component {
|
|
|
71
71
|
if (ref) {
|
|
72
72
|
this.multiTraitRubric = ref;
|
|
73
73
|
|
|
74
|
-
this.multiTraitRubric.model = rubrics.multiTraitRubric;
|
|
74
|
+
this.multiTraitRubric.model = {...rubrics.multiTraitRubric, errors: model.errors || {} };
|
|
75
75
|
this.multiTraitRubric.configuration = { ...multiTraitRubric, width: width || multiTraitRubric.width };
|
|
76
76
|
}
|
|
77
77
|
}}
|
package/controller/lib/index.js
CHANGED
|
@@ -11,6 +11,7 @@ exports.getScore = void 0;
|
|
|
11
11
|
exports.model = model;
|
|
12
12
|
exports.normalize = void 0;
|
|
13
13
|
exports.outcome = outcome;
|
|
14
|
+
exports.validate = void 0;
|
|
14
15
|
|
|
15
16
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
16
17
|
|
|
@@ -20,6 +21,8 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
|
|
|
20
21
|
|
|
21
22
|
var _defaults = _interopRequireDefault(require("./defaults"));
|
|
22
23
|
|
|
24
|
+
var _utils = require("./utils");
|
|
25
|
+
|
|
23
26
|
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; }
|
|
24
27
|
|
|
25
28
|
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; }
|
|
@@ -144,7 +147,151 @@ var createCorrectResponseSession = function createCorrectResponseSession(questio
|
|
|
144
147
|
resolve(null);
|
|
145
148
|
}
|
|
146
149
|
});
|
|
147
|
-
};
|
|
150
|
+
}; // IMPORTANT! This function is a duplicate of rubric/controller/validate function!
|
|
151
|
+
// If you make any changes to this function, please make sure you also update rubric/controller/validate function!“.
|
|
152
|
+
|
|
148
153
|
|
|
149
154
|
exports.createCorrectResponseSession = createCorrectResponseSession;
|
|
155
|
+
|
|
156
|
+
var validateSimpleRubric = function validateSimpleRubric(model) {
|
|
157
|
+
var points = model.points;
|
|
158
|
+
var errors = {};
|
|
159
|
+
var pointsDescriptorsErrors = {};
|
|
160
|
+
(points || []).forEach(function (point, index) {
|
|
161
|
+
if (!point || point === '<div></div>') {
|
|
162
|
+
pointsDescriptorsErrors[index] = 'Points descriptors cannot be empty.';
|
|
163
|
+
} else {
|
|
164
|
+
var identicalPointDescr = points.slice(index + 1).some(function (p) {
|
|
165
|
+
return (0, _utils.markupToText)(p) === (0, _utils.markupToText)(point);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
if (identicalPointDescr) {
|
|
169
|
+
pointsDescriptorsErrors[index] = 'Points descriptors should be unique.';
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
if (Object.keys(pointsDescriptorsErrors).length > 0) {
|
|
175
|
+
errors.pointsDescriptorsErrors = pointsDescriptorsErrors;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return errors;
|
|
179
|
+
}; // IMPORTANT! This function is a duplicate of multi-trait-rubric/controller/validate function!
|
|
180
|
+
// If you make any changes to this function, please make sure you also update multi-trait-rubric/controller/validate function!“.
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
var validateMultiTraitRubric = function validateMultiTraitRubric(model) {
|
|
184
|
+
var scales = model.scales,
|
|
185
|
+
_model$description = model.description,
|
|
186
|
+
description = _model$description === void 0 ? false : _model$description,
|
|
187
|
+
_model$pointLabels = model.pointLabels,
|
|
188
|
+
pointLabels = _model$pointLabels === void 0 ? false : _model$pointLabels;
|
|
189
|
+
var errors = {};
|
|
190
|
+
var traitsErrors = {};
|
|
191
|
+
var scorePointsErrors = {};
|
|
192
|
+
(scales || []).forEach(function (scale, scaleIndex) {
|
|
193
|
+
var _scale$traits = scale.traits,
|
|
194
|
+
traits = _scale$traits === void 0 ? [] : _scale$traits;
|
|
195
|
+
var _scale$scorePointsLab = scale.scorePointsLabels,
|
|
196
|
+
scorePointsLabels = _scale$scorePointsLab === void 0 ? [] : _scale$scorePointsLab;
|
|
197
|
+
var scaleErrors = {};
|
|
198
|
+
var scorePointsLabelsErrors = {};
|
|
199
|
+
|
|
200
|
+
if (pointLabels) {
|
|
201
|
+
scorePointsLabels.forEach(function (scorePointLabel, scoreIndex) {
|
|
202
|
+
if (!scorePointLabel || scorePointLabel === '<div></div>') {
|
|
203
|
+
scorePointsLabelsErrors[scoreIndex] = 'Points labels should not be empty.';
|
|
204
|
+
} else {
|
|
205
|
+
var identicalScorePointLabel = scorePointsLabels.slice(scoreIndex + 1).some(function (s) {
|
|
206
|
+
return (0, _utils.markupToText)(s) === (0, _utils.markupToText)(scorePointLabel);
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
if (identicalScorePointLabel) {
|
|
210
|
+
scorePointsLabelsErrors[scoreIndex] = 'Points labels should be unique.';
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
if (Object.keys(scorePointsLabelsErrors).length > 0) {
|
|
217
|
+
scorePointsErrors[scaleIndex] = scorePointsLabelsErrors;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
traits.forEach(function (trait, traitIndex) {
|
|
221
|
+
if (!trait.name || trait.name === '<div></div>') {
|
|
222
|
+
scaleErrors[traitIndex] = {
|
|
223
|
+
name: 'Trait names should not be empty.'
|
|
224
|
+
};
|
|
225
|
+
} else {
|
|
226
|
+
var identicalTraitName = traits.slice(traitIndex + 1).some(function (t) {
|
|
227
|
+
return (0, _utils.markupToText)(t.name) === (0, _utils.markupToText)(trait.name);
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
if (identicalTraitName) {
|
|
231
|
+
scaleErrors[traitIndex] = {
|
|
232
|
+
name: 'Trait names should be unique.'
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
if (description && (!trait.description || trait.description === '<div></div>')) {
|
|
238
|
+
scaleErrors[traitIndex] = _objectSpread(_objectSpread({}, scaleErrors[traitIndex]), {}, {
|
|
239
|
+
description: 'Trait description should not be empty'
|
|
240
|
+
});
|
|
241
|
+
} else {
|
|
242
|
+
var identicalTraitDescr = traits.slice(traitIndex + 1).some(function (t) {
|
|
243
|
+
return (0, _utils.markupToText)(t.description) === (0, _utils.markupToText)(trait.description);
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
if (description && identicalTraitDescr) {
|
|
247
|
+
scaleErrors[traitIndex] = _objectSpread(_objectSpread({}, scaleErrors[traitIndex]), {}, {
|
|
248
|
+
description: 'Trait descriptions should be unique.'
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
if (Object.keys(scaleErrors).length > 0) {
|
|
255
|
+
traitsErrors[scaleIndex] = scaleErrors;
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
if (Object.keys(traitsErrors).length > 0) {
|
|
260
|
+
errors.traitsErrors = traitsErrors;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if (Object.keys(scorePointsErrors).length > 0) {
|
|
264
|
+
errors.scorePointsErrors = scorePointsErrors;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
return errors;
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
var validate = function validate() {
|
|
271
|
+
var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
272
|
+
var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
273
|
+
var _model$rubrics = model.rubrics,
|
|
274
|
+
rubrics = _model$rubrics === void 0 ? {} : _model$rubrics,
|
|
275
|
+
rubricType = model.rubricType;
|
|
276
|
+
var _rubrics$multiTraitRu = rubrics.multiTraitRubric,
|
|
277
|
+
multiTraitRubric = _rubrics$multiTraitRu === void 0 ? {} : _rubrics$multiTraitRu,
|
|
278
|
+
_rubrics$simpleRubric = rubrics.simpleRubric,
|
|
279
|
+
simpleRubric = _rubrics$simpleRubric === void 0 ? {} : _rubrics$simpleRubric;
|
|
280
|
+
var errors = {};
|
|
281
|
+
|
|
282
|
+
switch (rubricType) {
|
|
283
|
+
case RUBRIC_TYPES.SIMPLE_RUBRIC:
|
|
284
|
+
default:
|
|
285
|
+
errors = validateSimpleRubric(simpleRubric);
|
|
286
|
+
break;
|
|
287
|
+
|
|
288
|
+
case RUBRIC_TYPES.MULTI_TRAIT_RUBRIC:
|
|
289
|
+
errors = validateMultiTraitRubric(multiTraitRubric);
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
return errors;
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
exports.validate = validate;
|
|
150
297
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["RUBRIC_TYPES","SIMPLE_RUBRIC","MULTI_TRAIT_RUBRIC","createDefaultModel","model","Promise","resolve","defaults","normalize","question","session","env","normalizedQuestion","rubricType","role","rubrics","multiTraitRubric","visible","visibleToStudent","scales","excludeZero","parsedScales","map","scale","simpleRubric","getScore","outcome","score","empty","createCorrectResponseSession","mode","id"],"mappings":"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","sourcesContent":["import defaults from './defaults';\n\n// todo the import from pie-lib/rubric might break webpack\nconst RUBRIC_TYPES = {\n SIMPLE_RUBRIC: 'simpleRubric',\n MULTI_TRAIT_RUBRIC: 'multiTraitRubric',\n};\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => resolve({ ...defaults.model, ...model }));\n}\n\nexport const normalize = (question) => ({ ...defaults.model, ...question });\n\n/**\n * @param {*} question\n * @param {*} session\n * @param {*} env\n */\nexport async function model(question, session, env) {\n const normalizedQuestion = normalize(question);\n\n if (normalizedQuestion.rubricType === RUBRIC_TYPES.SIMPLE_RUBRIC) {\n return new Promise((resolve) => {\n resolve(\n env && env.role && env.role === 'instructor'\n ? {\n ...normalizedQuestion,\n rubrics: {\n ...normalizedQuestion.rubrics,\n multiTraitRubric: {\n ...normalizedQuestion.rubrics.multiTraitRubric,\n visible: false,\n },\n },\n }\n : {},\n );\n });\n } else {\n if (\n !env.role ||\n (env.role === 'student' && normalizedQuestion.rubrics && normalizedQuestion.rubrics.multiTraitRubric)\n ) {\n normalizedQuestion.rubrics.multiTraitRubric.visible = normalizedQuestion.visibleToStudent;\n } else {\n normalizedQuestion.rubrics.multiTraitRubric.visible = true;\n }\n\n // todo update pie-ui instead of parsing this here:\n const { scales, excludeZero } = normalizedQuestion.rubrics.multiTraitRubric || {};\n const parsedScales = (scales || []).map((scale) => ({ ...scale, excludeZero }));\n\n return {\n ...normalizedQuestion,\n rubrics: {\n ...normalizedQuestion.rubrics,\n simpleRubric: {\n ...normalizedQuestion.rubrics.simpleRubric,\n visible: false,\n },\n multiTraitRubric: {\n ...normalizedQuestion.rubrics.multiTraitRubric,\n scales: parsedScales,\n },\n },\n };\n }\n}\n\nexport const getScore = () => 0;\n\n/**\n * @param {Object} model - the main model\n * @param {*} session\n * @param {Object} env\n */\nexport function outcome() {\n return new Promise((resolve) => resolve({ score: 0, empty: true }));\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n resolve({ id: '1' });\n } else {\n resolve(null);\n }\n });\n};\n"],"file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"names":["RUBRIC_TYPES","SIMPLE_RUBRIC","MULTI_TRAIT_RUBRIC","createDefaultModel","model","Promise","resolve","defaults","normalize","question","session","env","normalizedQuestion","rubricType","role","rubrics","multiTraitRubric","visible","visibleToStudent","scales","excludeZero","parsedScales","map","scale","simpleRubric","getScore","outcome","score","empty","createCorrectResponseSession","mode","id","validateSimpleRubric","points","errors","pointsDescriptorsErrors","forEach","point","index","identicalPointDescr","slice","some","p","Object","keys","length","validateMultiTraitRubric","description","pointLabels","traitsErrors","scorePointsErrors","scaleIndex","traits","scorePointsLabels","scaleErrors","scorePointsLabelsErrors","scorePointLabel","scoreIndex","identicalScorePointLabel","s","trait","traitIndex","name","identicalTraitName","t","identicalTraitDescr","validate","config"],"mappings":"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","sourcesContent":["import defaults from './defaults';\nimport { markupToText } from './utils';\n\n// todo the import from pie-lib/rubric might break webpack\nconst RUBRIC_TYPES = {\n SIMPLE_RUBRIC: 'simpleRubric',\n MULTI_TRAIT_RUBRIC: 'multiTraitRubric',\n};\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => resolve({ ...defaults.model, ...model }));\n}\n\nexport const normalize = (question) => ({ ...defaults.model, ...question });\n\n/**\n * @param {*} question\n * @param {*} session\n * @param {*} env\n */\nexport async function model(question, session, env) {\n const normalizedQuestion = normalize(question);\n\n if (normalizedQuestion.rubricType === RUBRIC_TYPES.SIMPLE_RUBRIC) {\n return new Promise((resolve) => {\n resolve(\n env && env.role && env.role === 'instructor'\n ? {\n ...normalizedQuestion,\n rubrics: {\n ...normalizedQuestion.rubrics,\n multiTraitRubric: {\n ...normalizedQuestion.rubrics.multiTraitRubric,\n visible: false,\n },\n },\n }\n : {},\n );\n });\n } else {\n if (\n !env.role ||\n (env.role === 'student' && normalizedQuestion.rubrics && normalizedQuestion.rubrics.multiTraitRubric)\n ) {\n normalizedQuestion.rubrics.multiTraitRubric.visible = normalizedQuestion.visibleToStudent;\n } else {\n normalizedQuestion.rubrics.multiTraitRubric.visible = true;\n }\n\n // todo update pie-ui instead of parsing this here:\n const { scales, excludeZero } = normalizedQuestion.rubrics.multiTraitRubric || {};\n const parsedScales = (scales || []).map((scale) => ({ ...scale, excludeZero }));\n\n return {\n ...normalizedQuestion,\n rubrics: {\n ...normalizedQuestion.rubrics,\n simpleRubric: {\n ...normalizedQuestion.rubrics.simpleRubric,\n visible: false,\n },\n multiTraitRubric: {\n ...normalizedQuestion.rubrics.multiTraitRubric,\n scales: parsedScales,\n },\n },\n };\n }\n}\n\nexport const getScore = () => 0;\n\n/**\n * @param {Object} model - the main model\n * @param {*} session\n * @param {Object} env\n */\nexport function outcome() {\n return new Promise((resolve) => resolve({ score: 0, empty: true }));\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n resolve({ id: '1' });\n } else {\n resolve(null);\n }\n });\n};\n\n// IMPORTANT! This function is a duplicate of rubric/controller/validate function!\n// If you make any changes to this function, please make sure you also update rubric/controller/validate function!“.\nconst validateSimpleRubric = (model) => {\n const { points } = model;\n const errors = {};\n const pointsDescriptorsErrors = {};\n\n (points || []).forEach((point, index) => {\n if(!point|| point === '<div></div>') {\n pointsDescriptorsErrors[index] = 'Points descriptors cannot be empty.';\n }\n else{\n const identicalPointDescr = points.slice(index + 1).some(p => markupToText(p) === markupToText(point));\n\n if (identicalPointDescr) {\n pointsDescriptorsErrors[index] = 'Points descriptors should be unique.';\n }\n }\n });\n\n if(Object.keys(pointsDescriptorsErrors).length > 0){\n errors.pointsDescriptorsErrors = pointsDescriptorsErrors;\n }\n\n return errors;\n};\n\n// IMPORTANT! This function is a duplicate of multi-trait-rubric/controller/validate function!\n// If you make any changes to this function, please make sure you also update multi-trait-rubric/controller/validate function!“.\nconst validateMultiTraitRubric = (model) => {\n const { scales, description = false, pointLabels = false } = model;\n const errors = {};\n const traitsErrors = {};\n const scorePointsErrors = {};\n\n (scales || []).forEach((scale, scaleIndex) => {\n const { traits = [] } = scale;\n const { scorePointsLabels = [] } = scale;\n const scaleErrors = {};\n const scorePointsLabelsErrors = {};\n\n if(pointLabels) {\n scorePointsLabels.forEach((scorePointLabel, scoreIndex) => {\n if (!scorePointLabel || scorePointLabel === '<div></div>') {\n scorePointsLabelsErrors[scoreIndex] = 'Points labels should not be empty.';\n } else {\n const identicalScorePointLabel = scorePointsLabels.slice(scoreIndex + 1).some(s => markupToText(s) === markupToText(scorePointLabel));\n\n if (identicalScorePointLabel) {\n scorePointsLabelsErrors[scoreIndex] = 'Points labels should be unique.';\n }\n }\n })\n }\n\n if(Object.keys(scorePointsLabelsErrors).length > 0){\n scorePointsErrors[scaleIndex] = scorePointsLabelsErrors;\n }\n\n traits.forEach((trait, traitIndex) => {\n if(!trait.name || trait.name === '<div></div>') {\n scaleErrors[traitIndex] = {name: 'Trait names should not be empty.'};\n }\n else{\n const identicalTraitName = traits.slice(traitIndex + 1).some(t => markupToText(t.name) === markupToText(trait.name));\n\n if (identicalTraitName) {\n scaleErrors[traitIndex] = {name: 'Trait names should be unique.'};\n }\n }\n if(description && (!trait.description || trait.description === '<div></div>')) {\n scaleErrors[traitIndex] = {... scaleErrors[traitIndex], description: 'Trait description should not be empty'};\n }\n else{\n const identicalTraitDescr = traits.slice(traitIndex + 1).some(t => markupToText(t.description) === markupToText(trait.description));\n\n if (description && identicalTraitDescr) {\n scaleErrors[traitIndex] = {... scaleErrors[traitIndex], description: 'Trait descriptions should be unique.'};\n }\n }\n\n });\n if(Object.keys(scaleErrors).length > 0){\n traitsErrors[scaleIndex] = scaleErrors;\n }\n });\n\n if(Object.keys(traitsErrors).length > 0){\n errors.traitsErrors = traitsErrors;\n }\n\n if(Object.keys(scorePointsErrors).length > 0){\n errors.scorePointsErrors = scorePointsErrors;\n }\n\n return errors;\n};\n\n\nexport const validate = (model = {}, config = {}) => {\n const { rubrics = {}, rubricType } = model;\n const { multiTraitRubric = {}, simpleRubric = {} } = rubrics;\n let errors = {};\n\n switch (rubricType) {\n case RUBRIC_TYPES.SIMPLE_RUBRIC:\n default:\n errors = validateSimpleRubric(simpleRubric);\n break;\n case RUBRIC_TYPES.MULTI_TRAIT_RUBRIC:\n errors = validateMultiTraitRubric(multiTraitRubric);\n break;\n }\n\n return errors;\n};\n"],"file":"index.js"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.markupToText = void 0;
|
|
7
|
+
|
|
8
|
+
var markupToText = function markupToText(s) {
|
|
9
|
+
return (s || '').replace(/(<([^>]+)>)/ig, '');
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
exports.markupToText = markupToText;
|
|
13
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils.js"],"names":["markupToText","s","replace"],"mappings":";;;;;;;AAAO,IAAMA,YAAY,GAAG,SAAfA,YAAe,CAACC,CAAD,EAAO;AAC/B,SAAO,CAACA,CAAC,IAAI,EAAN,EAAUC,OAAV,CAAkB,eAAlB,EAAmC,EAAnC,CAAP;AACH,CAFM","sourcesContent":["export const markupToText = (s) => {\n return (s || '').replace(/(<([^>]+)>)/ig, '');\n};\n"],"file":"utils.js"}
|
package/controller/src/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import defaults from './defaults';
|
|
2
|
+
import { markupToText } from './utils';
|
|
2
3
|
|
|
3
4
|
// todo the import from pie-lib/rubric might break webpack
|
|
4
5
|
const RUBRIC_TYPES = {
|
|
@@ -88,3 +89,120 @@ export const createCorrectResponseSession = (question, env) => {
|
|
|
88
89
|
}
|
|
89
90
|
});
|
|
90
91
|
};
|
|
92
|
+
|
|
93
|
+
// IMPORTANT! This function is a duplicate of rubric/controller/validate function!
|
|
94
|
+
// If you make any changes to this function, please make sure you also update rubric/controller/validate function!“.
|
|
95
|
+
const validateSimpleRubric = (model) => {
|
|
96
|
+
const { points } = model;
|
|
97
|
+
const errors = {};
|
|
98
|
+
const pointsDescriptorsErrors = {};
|
|
99
|
+
|
|
100
|
+
(points || []).forEach((point, index) => {
|
|
101
|
+
if(!point|| point === '<div></div>') {
|
|
102
|
+
pointsDescriptorsErrors[index] = 'Points descriptors cannot be empty.';
|
|
103
|
+
}
|
|
104
|
+
else{
|
|
105
|
+
const identicalPointDescr = points.slice(index + 1).some(p => markupToText(p) === markupToText(point));
|
|
106
|
+
|
|
107
|
+
if (identicalPointDescr) {
|
|
108
|
+
pointsDescriptorsErrors[index] = 'Points descriptors should be unique.';
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
if(Object.keys(pointsDescriptorsErrors).length > 0){
|
|
114
|
+
errors.pointsDescriptorsErrors = pointsDescriptorsErrors;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return errors;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// IMPORTANT! This function is a duplicate of multi-trait-rubric/controller/validate function!
|
|
121
|
+
// If you make any changes to this function, please make sure you also update multi-trait-rubric/controller/validate function!“.
|
|
122
|
+
const validateMultiTraitRubric = (model) => {
|
|
123
|
+
const { scales, description = false, pointLabels = false } = model;
|
|
124
|
+
const errors = {};
|
|
125
|
+
const traitsErrors = {};
|
|
126
|
+
const scorePointsErrors = {};
|
|
127
|
+
|
|
128
|
+
(scales || []).forEach((scale, scaleIndex) => {
|
|
129
|
+
const { traits = [] } = scale;
|
|
130
|
+
const { scorePointsLabels = [] } = scale;
|
|
131
|
+
const scaleErrors = {};
|
|
132
|
+
const scorePointsLabelsErrors = {};
|
|
133
|
+
|
|
134
|
+
if(pointLabels) {
|
|
135
|
+
scorePointsLabels.forEach((scorePointLabel, scoreIndex) => {
|
|
136
|
+
if (!scorePointLabel || scorePointLabel === '<div></div>') {
|
|
137
|
+
scorePointsLabelsErrors[scoreIndex] = 'Points labels should not be empty.';
|
|
138
|
+
} else {
|
|
139
|
+
const identicalScorePointLabel = scorePointsLabels.slice(scoreIndex + 1).some(s => markupToText(s) === markupToText(scorePointLabel));
|
|
140
|
+
|
|
141
|
+
if (identicalScorePointLabel) {
|
|
142
|
+
scorePointsLabelsErrors[scoreIndex] = 'Points labels should be unique.';
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
})
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if(Object.keys(scorePointsLabelsErrors).length > 0){
|
|
149
|
+
scorePointsErrors[scaleIndex] = scorePointsLabelsErrors;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
traits.forEach((trait, traitIndex) => {
|
|
153
|
+
if(!trait.name || trait.name === '<div></div>') {
|
|
154
|
+
scaleErrors[traitIndex] = {name: 'Trait names should not be empty.'};
|
|
155
|
+
}
|
|
156
|
+
else{
|
|
157
|
+
const identicalTraitName = traits.slice(traitIndex + 1).some(t => markupToText(t.name) === markupToText(trait.name));
|
|
158
|
+
|
|
159
|
+
if (identicalTraitName) {
|
|
160
|
+
scaleErrors[traitIndex] = {name: 'Trait names should be unique.'};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if(description && (!trait.description || trait.description === '<div></div>')) {
|
|
164
|
+
scaleErrors[traitIndex] = {... scaleErrors[traitIndex], description: 'Trait description should not be empty'};
|
|
165
|
+
}
|
|
166
|
+
else{
|
|
167
|
+
const identicalTraitDescr = traits.slice(traitIndex + 1).some(t => markupToText(t.description) === markupToText(trait.description));
|
|
168
|
+
|
|
169
|
+
if (description && identicalTraitDescr) {
|
|
170
|
+
scaleErrors[traitIndex] = {... scaleErrors[traitIndex], description: 'Trait descriptions should be unique.'};
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
});
|
|
175
|
+
if(Object.keys(scaleErrors).length > 0){
|
|
176
|
+
traitsErrors[scaleIndex] = scaleErrors;
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
if(Object.keys(traitsErrors).length > 0){
|
|
181
|
+
errors.traitsErrors = traitsErrors;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if(Object.keys(scorePointsErrors).length > 0){
|
|
185
|
+
errors.scorePointsErrors = scorePointsErrors;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return errors;
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
export const validate = (model = {}, config = {}) => {
|
|
193
|
+
const { rubrics = {}, rubricType } = model;
|
|
194
|
+
const { multiTraitRubric = {}, simpleRubric = {} } = rubrics;
|
|
195
|
+
let errors = {};
|
|
196
|
+
|
|
197
|
+
switch (rubricType) {
|
|
198
|
+
case RUBRIC_TYPES.SIMPLE_RUBRIC:
|
|
199
|
+
default:
|
|
200
|
+
errors = validateSimpleRubric(simpleRubric);
|
|
201
|
+
break;
|
|
202
|
+
case RUBRIC_TYPES.MULTI_TRAIT_RUBRIC:
|
|
203
|
+
errors = validateMultiTraitRubric(multiTraitRubric);
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return errors;
|
|
208
|
+
};
|
package/package.json
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/complex-rubric",
|
|
3
3
|
"repository": "pie-framework/pie-elements",
|
|
4
|
-
"version": "2.1.2-next.
|
|
4
|
+
"version": "2.1.2-next.34+087c5883e",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
8
|
"dependencies": {
|
|
9
9
|
"@material-ui/core": "^3.9.2",
|
|
10
|
-
"@pie-element/multi-trait-rubric": "^3.0.4-next.
|
|
11
|
-
"@pie-element/rubric": "^3.0.4-next.
|
|
10
|
+
"@pie-element/multi-trait-rubric": "^3.0.4-next.34+087c5883e",
|
|
11
|
+
"@pie-element/rubric": "^3.0.4-next.34+087c5883e",
|
|
12
12
|
"@pie-framework/pie-player-events": "^0.1.0",
|
|
13
13
|
"classnames": "^2.2.5",
|
|
14
14
|
"debug": "^4.1.1",
|
|
15
15
|
"lodash": "^4.17.11",
|
|
16
16
|
"prop-types": "^15.7.2"
|
|
17
17
|
},
|
|
18
|
-
"gitHead": "
|
|
18
|
+
"gitHead": "087c5883e5e95c62412666d249712d39c9712296",
|
|
19
19
|
"scripts": {
|
|
20
20
|
"postpublish": "../../scripts/postpublish"
|
|
21
21
|
},
|