Skip to content

Commit e7847b6

Browse files
committed
fix(multi-trait-rubric): disallow use of Exclude Zero when Max Points is 1 PD-4832
1 parent fa9e913 commit e7847b6

4 files changed

Lines changed: 200 additions & 165 deletions

File tree

packages/multi-trait-rubric/configure/src/index.js

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@ import {
33
InsertSoundEvent,
44
DeleteSoundEvent,
55
InsertImageEvent,
6-
DeleteImageEvent
6+
DeleteImageEvent,
77
} from '@pie-framework/pie-configure-events';
88

99
import React from 'react';
1010
import ReactDOM from 'react-dom';
1111

1212
import Main from './main';
1313
import defaults from './defaults';
14+
import { addOrRemoveScaleColumn } from './utils';
15+
import { excludeZeroTypes } from './modals';
1416

1517
const modelWithDefaults = (m) => ({ ...defaults.model, ...m });
1618
const configurationWithDefaults = (c) => ({ ...defaults.configuration, ...c });
@@ -23,23 +25,24 @@ export default class MultiTraitRubricElement extends HTMLElement {
2325
}
2426

2527
updateModelAccordingToReceivedProps = (m) => {
26-
const currentModel = {...this._model};
28+
const currentModel = { ...this._model };
29+
2730
if (!m) {
2831
return currentModel;
2932
}
3033

3134
const validatedModel = { ...m };
3235
const { scales, excludeZero } = validatedModel || {};
3336

34-
(scales || []).forEach(scale => {
37+
(scales || []).forEach((scale) => {
3538
if (!scale) {
3639
scale = { scorePointsLabels: [], traits: [] };
3740
}
3841

3942
const { maxPoints } = scale || {};
4043

41-
scale.scorePointsLabels = [ ...(scale.scorePointsLabels || []) ];
42-
scale.traits = [ ...(scale.traits || []) ];
44+
scale.scorePointsLabels = [...(scale.scorePointsLabels || [])];
45+
scale.traits = [...(scale.traits || [])];
4346

4447
const howManyScorePointLabelsShouldHave = excludeZero ? maxPoints : maxPoints + 1;
4548
const howManyScorePointLabelsItHas = scale.scorePointsLabels.length;
@@ -54,12 +57,12 @@ export default class MultiTraitRubricElement extends HTMLElement {
5457
}
5558
}
5659

57-
(scale.traits || []).forEach(trait => {
60+
(scale.traits || []).forEach((trait) => {
5861
if (!trait) {
5962
trait = { scorePointsDescriptors: [] };
6063
}
6164

62-
trait.scorePointsDescriptors = [ ...(trait.scorePointsDescriptors || []) ];
65+
trait.scorePointsDescriptors = [...(trait.scorePointsDescriptors || [])];
6366

6467
const howManyScorePointDescriptorsItHas = trait.scorePointsDescriptors.length;
6568

@@ -75,6 +78,18 @@ export default class MultiTraitRubricElement extends HTMLElement {
7578
});
7679
});
7780

81+
if (validatedModel.excludeZero) {
82+
// check if any scale has maxPoints set to 1
83+
const shouldAddColumn0 = validatedModel.scales.some((scale) => scale.maxPoints === 1);
84+
85+
if (shouldAddColumn0) {
86+
// excludeZero should be false and disabled when maxPoints is 1
87+
validatedModel.excludeZero = false;
88+
// add column 0 for all scales
89+
validatedModel.scales = addOrRemoveScaleColumn(scales, excludeZeroTypes.add0);
90+
}
91+
}
92+
7893
return validatedModel;
7994
};
8095

@@ -115,7 +130,7 @@ export default class MultiTraitRubricElement extends HTMLElement {
115130
onDeleteImage(src, done) {
116131
this.dispatchEvent(new DeleteImageEvent(src, done));
117132
}
118-
133+
119134
_render() {
120135
if (this._model) {
121136
let element = React.createElement(Main, {

packages/multi-trait-rubric/configure/src/main.jsx

Lines changed: 13 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { layout, settings } from '@pie-lib/pie-toolbox/config-ui';
1313
import Scale from './scale';
1414
import { MultiTraitButton } from './common';
1515
import { ExcludeZeroDialog, excludeZeroTypes, IncludeZeroDialog, InfoDialog } from './modals';
16+
import { addOrRemoveScaleColumn } from './utils';
1617

1718
const { Panel, toggle } = settings;
1819
const MIN_WIDTH = '650px';
@@ -138,14 +139,20 @@ export class Main extends React.Component {
138139

139140
onScaleChanged = (scaleIndex, params) => {
140141
const { model, onModelChanged } = this.props;
141-
const scales = cloneDeep((model || {}).scales);
142+
let scales = cloneDeep((model || {}).scales);
142143

143144
if (scaleIndex < 0 || scaleIndex >= scales.length || isEmpty(params)) return false;
144145

145146
Object.keys(params).forEach((key) => {
146147
scales[scaleIndex][key] = params[key];
147148
});
148149

150+
if (model.excludeZero && params.maxPoints === 1) {
151+
// excludeZero should be false and disabled when maxPoints is 1 for any scale
152+
model.excludeZero = false;
153+
scales = addOrRemoveScaleColumn(scales, excludeZeroTypes.add0);
154+
}
155+
149156
onModelChanged({ ...model, scales });
150157
};
151158

@@ -230,65 +237,7 @@ export class Main extends React.Component {
230237
if (!scales || !scales.length) return;
231238

232239
excludeZero = !excludeZero;
233-
234-
const newScales = scales.reduce((acc, scale) => {
235-
let { scorePointsLabels, traits } = scale || {};
236-
237-
if (scorePointsLabels.length < 1) return acc;
238-
239-
switch (excludeZeroType) {
240-
case excludeZeroTypes.remove0: {
241-
// removes column 0
242-
scorePointsLabels = scorePointsLabels.slice(1);
243-
traits = traits.map(({ scorePointsDescriptors, ...trait }) => ({
244-
...trait,
245-
scorePointsDescriptors: scorePointsDescriptors.slice(1),
246-
}));
247-
248-
break;
249-
}
250-
251-
case excludeZeroTypes.add0: {
252-
// adds empty column at start
253-
scorePointsLabels = ['', ...scorePointsLabels];
254-
traits = traits.map(({ scorePointsDescriptors, ...trait }) => ({
255-
...trait,
256-
scorePointsDescriptors: ['', ...scorePointsDescriptors],
257-
}));
258-
259-
break;
260-
}
261-
262-
case excludeZeroTypes.shiftLeft: {
263-
// removes last column
264-
scorePointsLabels = scorePointsLabels.slice(0, -1);
265-
traits = traits.map(({ scorePointsDescriptors, ...trait }) => ({
266-
...trait,
267-
scorePointsDescriptors: scorePointsDescriptors.slice(0, -1),
268-
}));
269-
270-
break;
271-
}
272-
273-
case excludeZeroTypes.shiftRight: {
274-
// adds empty column at end
275-
scorePointsLabels = [...scorePointsLabels, ''];
276-
traits = traits.map(({ scorePointsDescriptors, ...trait }) => ({
277-
...trait,
278-
scorePointsDescriptors: [...scorePointsDescriptors, ''],
279-
}));
280-
281-
break;
282-
}
283-
284-
default:
285-
break;
286-
}
287-
288-
acc.push({ ...scale, scorePointsLabels, traits });
289-
290-
return acc;
291-
}, []);
240+
const newScales = addOrRemoveScaleColumn(scales, excludeZeroType);
292241

293242
onModelChanged({ ...model, scales: newScales, excludeZero });
294243

@@ -344,11 +293,14 @@ export class Main extends React.Component {
344293
} = model || {};
345294
const { showExcludeZeroDialog, showInfoDialog, infoDialogText, adjustedWidth } = this.state || {};
346295

296+
// excludeZero should be false and disabled when maxPoints is 1 for any scale
297+
const disabledExcludeZero = scales?.some((scale) => scale.maxPoints === 1);
298+
347299
const panelSettings = {
348300
standards: showStandards.settings && toggle(showStandards.label),
349301
'showLevelTagInput.enabled': showLevelTagInput.settings && toggle(showLevelTagInput.label, true),
350302
visibleToStudent: showVisibleToStudent.settings && toggle(showVisibleToStudent.label),
351-
excludeZero: showExcludeZero.settings && toggle(showExcludeZero.label),
303+
excludeZero: showExcludeZero.settings && toggle(showExcludeZero.label, false, disabledExcludeZero),
352304
halfScoring: showHalfScoring.settings && toggle(showHalfScoring.label),
353305
'dragAndDrop.enabled': dragAndDrop.settings && toggle(dragAndDrop.label, true),
354306
};
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,73 @@
11
import { DEFAULT_PLUGINS } from '@pie-lib/pie-toolbox/editable-html';
2+
import { excludeZeroTypes } from './modals';
23

34
export const filteredDefaultPlugins = (DEFAULT_PLUGINS || []).filter(
45
(p) => p !== 'table' && p !== 'bulleted-list' && p !== 'numbered-list',
56
);
7+
8+
export const addOrRemoveScaleColumn = (scales, excludeZeroType) => {
9+
if (!scales || !scales.length) {
10+
return [];
11+
}
12+
13+
return scales.reduce((acc, scale) => {
14+
let { scorePointsLabels, traits } = scale || {};
15+
16+
if (scorePointsLabels.length < 1) {
17+
return acc;
18+
}
19+
20+
switch (excludeZeroType) {
21+
case excludeZeroTypes.remove0: {
22+
// removes column 0
23+
scorePointsLabels = scorePointsLabels.slice(1);
24+
traits = traits.map(({ scorePointsDescriptors, ...trait }) => ({
25+
...trait,
26+
scorePointsDescriptors: scorePointsDescriptors.slice(1),
27+
}));
28+
29+
break;
30+
}
31+
32+
case excludeZeroTypes.add0: {
33+
// adds empty column at start
34+
scorePointsLabels = ['', ...scorePointsLabels];
35+
traits = traits.map(({ scorePointsDescriptors, ...trait }) => ({
36+
...trait,
37+
scorePointsDescriptors: ['', ...scorePointsDescriptors],
38+
}));
39+
40+
break;
41+
}
42+
43+
case excludeZeroTypes.shiftLeft: {
44+
// removes last column
45+
scorePointsLabels = scorePointsLabels.slice(0, -1);
46+
traits = traits.map(({ scorePointsDescriptors, ...trait }) => ({
47+
...trait,
48+
scorePointsDescriptors: scorePointsDescriptors.slice(0, -1),
49+
}));
50+
51+
break;
52+
}
53+
54+
case excludeZeroTypes.shiftRight: {
55+
// adds empty column at end
56+
scorePointsLabels = [...scorePointsLabels, ''];
57+
traits = traits.map(({ scorePointsDescriptors, ...trait }) => ({
58+
...trait,
59+
scorePointsDescriptors: [...scorePointsDescriptors, ''],
60+
}));
61+
62+
break;
63+
}
64+
65+
default:
66+
break;
67+
}
68+
69+
acc.push({ ...scale, scorePointsLabels, traits });
70+
71+
return acc;
72+
}, []);
73+
};

0 commit comments

Comments
 (0)