@pie-lib/rubric 0.8.32-next.0 → 0.9.1-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -110
- package/NEXT.CHANGELOG.json +1 -0
- package/package.json +5 -3
- package/src/__tests__/__snapshots__/rubric.test.jsx.snap +48 -0
- package/src/__tests__/rubric.test.jsx +91 -0
- package/src/authoring.jsx +99 -12
- package/src/index.js +1 -0
- package/lib/authoring.js +0 -474
- package/lib/authoring.js.map +0 -1
- package/lib/index.js +0 -23
- package/lib/index.js.map +0 -1
- package/lib/point-menu.js +0 -172
- package/lib/point-menu.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
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
|
-
## [0.
|
|
6
|
+
## [0.9.1-beta.0](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.31...@pie-lib/rubric@0.9.1-beta.0) (2025-07-20)
|
|
7
7
|
|
|
8
8
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
9
9
|
|
|
@@ -11,7 +11,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
# [0.9.0-beta.0](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.31...@pie-lib/rubric@0.9.0-beta.0) (2025-07-20)
|
|
15
15
|
|
|
16
16
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
17
17
|
|
|
@@ -19,230 +19,130 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
# [0.10.0-beta.0](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.31...@pie-lib/rubric@0.10.0-beta.0) (2025-07-15)
|
|
23
23
|
|
|
24
24
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
25
25
|
|
|
26
|
+
# [0.9.0-beta.0](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.31...@pie-lib/rubric@0.9.0-beta.0) (2025-07-15)
|
|
26
27
|
|
|
28
|
+
**Note:** Version bump only for package @pie-lib/rubric
|
|
27
29
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
## [0.8.28](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.27...@pie-lib/rubric@0.8.28) (2023-10-03)
|
|
30
|
+
## [0.8.30](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.29...@pie-lib/rubric@0.8.30) (2023-10-16)
|
|
31
31
|
|
|
32
32
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
33
33
|
|
|
34
|
+
## [0.8.29](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.28...@pie-lib/rubric@0.8.29) (2023-10-16)
|
|
34
35
|
|
|
36
|
+
**Note:** Version bump only for package @pie-lib/rubric
|
|
35
37
|
|
|
38
|
+
## [0.8.28](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.27...@pie-lib/rubric@0.8.28) (2023-10-03)
|
|
36
39
|
|
|
40
|
+
**Note:** Version bump only for package @pie-lib/rubric
|
|
37
41
|
|
|
38
42
|
## [0.8.27](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.26...@pie-lib/rubric@0.8.27) (2023-10-01)
|
|
39
43
|
|
|
40
44
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
41
45
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
46
|
## [0.8.26](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.25...@pie-lib/rubric@0.8.26) (2023-09-27)
|
|
47
47
|
|
|
48
48
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
50
|
## [0.8.25](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.24...@pie-lib/rubric@0.8.25) (2023-09-27)
|
|
55
51
|
|
|
56
52
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
57
53
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
54
|
## [0.8.24](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.23...@pie-lib/rubric@0.8.24) (2023-09-27)
|
|
63
55
|
|
|
64
56
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
65
57
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
58
|
## [0.8.23](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.22...@pie-lib/rubric@0.8.23) (2023-09-26)
|
|
71
59
|
|
|
72
60
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
73
61
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
62
|
## [0.8.22](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.21...@pie-lib/rubric@0.8.22) (2023-09-25)
|
|
79
63
|
|
|
80
64
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
81
65
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
66
|
## [0.8.21](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.20...@pie-lib/rubric@0.8.21) (2023-09-20)
|
|
87
67
|
|
|
88
68
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
89
69
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
70
|
## [0.8.20](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.19...@pie-lib/rubric@0.8.20) (2023-09-20)
|
|
95
71
|
|
|
96
72
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
97
73
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
74
|
## [0.8.19](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.18...@pie-lib/rubric@0.8.19) (2023-09-18)
|
|
103
75
|
|
|
104
76
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
105
77
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
78
|
## [0.8.18](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.17...@pie-lib/rubric@0.8.18) (2023-09-14)
|
|
111
79
|
|
|
112
80
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
113
81
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
82
|
## [0.8.17](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.16...@pie-lib/rubric@0.8.17) (2023-09-14)
|
|
119
83
|
|
|
120
84
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
121
85
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
86
|
## [0.8.16](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.15...@pie-lib/rubric@0.8.16) (2023-09-14)
|
|
127
87
|
|
|
128
88
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
129
89
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
90
|
## [0.8.15](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.14...@pie-lib/rubric@0.8.15) (2023-09-05)
|
|
135
91
|
|
|
136
92
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
137
93
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
94
|
## [0.8.14](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.13...@pie-lib/rubric@0.8.14) (2023-09-02)
|
|
143
95
|
|
|
144
96
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
145
97
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
98
|
## [0.8.13](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.12...@pie-lib/rubric@0.8.13) (2023-09-02)
|
|
151
99
|
|
|
152
100
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
153
101
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
102
|
## [0.8.12](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.11...@pie-lib/rubric@0.8.12) (2023-08-30)
|
|
159
103
|
|
|
160
104
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
161
105
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
106
|
## [0.8.11](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.10...@pie-lib/rubric@0.8.11) (2023-08-21)
|
|
167
107
|
|
|
168
108
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
169
109
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
110
|
## [0.8.10](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.9...@pie-lib/rubric@0.8.10) (2023-08-21)
|
|
175
111
|
|
|
176
112
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
177
113
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
114
|
## [0.8.9](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.8...@pie-lib/rubric@0.8.9) (2023-08-15)
|
|
183
115
|
|
|
184
116
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
185
117
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
118
|
## [0.8.8](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.7...@pie-lib/rubric@0.8.8) (2023-08-07)
|
|
191
119
|
|
|
192
120
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
193
121
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
122
|
## [0.8.7](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.6...@pie-lib/rubric@0.8.7) (2023-07-31)
|
|
199
123
|
|
|
200
124
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
201
125
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
126
|
## [0.8.6](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.5...@pie-lib/rubric@0.8.6) (2023-07-24)
|
|
207
127
|
|
|
208
128
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
209
129
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
130
|
## [0.8.5](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.4...@pie-lib/rubric@0.8.5) (2023-07-04)
|
|
215
131
|
|
|
216
132
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
217
133
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
134
|
## [0.8.4](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.3...@pie-lib/rubric@0.8.4) (2023-06-24)
|
|
223
135
|
|
|
224
136
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
225
137
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
138
|
## [0.8.3](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.2...@pie-lib/rubric@0.8.3) (2023-06-23)
|
|
231
139
|
|
|
232
140
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
233
141
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
142
|
## [0.8.2](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.1...@pie-lib/rubric@0.8.2) (2023-06-13)
|
|
239
143
|
|
|
240
144
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
241
145
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
146
|
## [0.8.1](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.0...@pie-lib/rubric@0.8.1) (2023-06-12)
|
|
247
147
|
|
|
248
148
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-lib/rubric",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.1-beta.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -9,7 +9,9 @@
|
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"@material-ui/core": "^3.9.3",
|
|
11
11
|
"@material-ui/icons": "^3.0.2",
|
|
12
|
-
"@pie-lib/
|
|
12
|
+
"@pie-lib/config-ui": "beta",
|
|
13
|
+
"@pie-lib/editable-html": "^11.2.1-beta.0",
|
|
14
|
+
"classnames": "^2.2.6",
|
|
13
15
|
"debug": "^4.1.1",
|
|
14
16
|
"editable-html": "npm:@pie-lib/editable-html@^7.21.0",
|
|
15
17
|
"lodash": "^4.17.11",
|
|
@@ -18,5 +20,5 @@
|
|
|
18
20
|
"react-beautiful-dnd": "^11.0.2",
|
|
19
21
|
"react-dom": "^16.9.0"
|
|
20
22
|
},
|
|
21
|
-
"gitHead": "
|
|
23
|
+
"gitHead": "e2aa3ddac60f49bcb8c2562370f496323642f453"
|
|
22
24
|
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`Rubric render snapshot 1`] = `
|
|
4
|
+
<div
|
|
5
|
+
className="className"
|
|
6
|
+
>
|
|
7
|
+
<WithStyles(Typography)
|
|
8
|
+
variant="h5"
|
|
9
|
+
>
|
|
10
|
+
Rubric
|
|
11
|
+
</WithStyles(Typography)>
|
|
12
|
+
<WithStyles(FormGroup)
|
|
13
|
+
row={true}
|
|
14
|
+
>
|
|
15
|
+
<WithStyles(Component)
|
|
16
|
+
max={10}
|
|
17
|
+
onChange={[Function]}
|
|
18
|
+
pluginOpts={Object {}}
|
|
19
|
+
value={3}
|
|
20
|
+
/>
|
|
21
|
+
<WithStyles(WithFormControlContext(FormControlLabel))
|
|
22
|
+
control={
|
|
23
|
+
<WithStyles(Checkbox)
|
|
24
|
+
checked={false}
|
|
25
|
+
onChange={[Function]}
|
|
26
|
+
/>
|
|
27
|
+
}
|
|
28
|
+
label="Exclude zeros"
|
|
29
|
+
/>
|
|
30
|
+
</WithStyles(FormGroup)>
|
|
31
|
+
<div>
|
|
32
|
+
<DragDropContext
|
|
33
|
+
onDragEnd={[Function]}
|
|
34
|
+
>
|
|
35
|
+
<Connect(Droppable)
|
|
36
|
+
direction="vertical"
|
|
37
|
+
droppableId="droppable"
|
|
38
|
+
ignoreContainerClipping={false}
|
|
39
|
+
isCombineEnabled={false}
|
|
40
|
+
isDropDisabled={false}
|
|
41
|
+
type="DEFAULT"
|
|
42
|
+
>
|
|
43
|
+
<Component />
|
|
44
|
+
</Connect(Droppable)>
|
|
45
|
+
</DragDropContext>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
`;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { shallow, mount } from 'enzyme';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { RawAuthoring } from '../authoring';
|
|
4
|
+
import { Draggable } from 'react-beautiful-dnd';
|
|
5
|
+
import _ from 'lodash';
|
|
6
|
+
|
|
7
|
+
jest.mock('@pie-lib/editable-html', () => () => <div />);
|
|
8
|
+
|
|
9
|
+
describe('Rubric', () => {
|
|
10
|
+
let w;
|
|
11
|
+
|
|
12
|
+
const points = ['nothing right', 'a teeny bit right', 'mostly right', 'bingo'];
|
|
13
|
+
const sampleAnswers = [null, 'just right', 'not left', null];
|
|
14
|
+
const wrapper = (value, opts) => {
|
|
15
|
+
const props = {
|
|
16
|
+
classes: {},
|
|
17
|
+
onChange: jest.fn(),
|
|
18
|
+
className: 'className',
|
|
19
|
+
value: {
|
|
20
|
+
excludeZero: false,
|
|
21
|
+
points,
|
|
22
|
+
sampleAnswers,
|
|
23
|
+
...value,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
const fn = opts && opts.mount ? mount : shallow;
|
|
27
|
+
return fn(<RawAuthoring {...props} />, opts);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
describe('render', () => {
|
|
31
|
+
it('snapshot', () => {
|
|
32
|
+
w = wrapper();
|
|
33
|
+
expect(w).toMatchSnapshot();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
describe('draggable', () => {
|
|
37
|
+
it('renders correctly for excluded zeroes', () => {
|
|
38
|
+
let w = wrapper({ excludeZero: true }, { mount: true });
|
|
39
|
+
expect(w.find(Draggable).length).toEqual(3);
|
|
40
|
+
});
|
|
41
|
+
it('renders correctly for excluded zeroes', () => {
|
|
42
|
+
let w = wrapper({ excludeZero: false }, { mount: true });
|
|
43
|
+
expect(w.find(Draggable).length).toEqual(4);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe('logic', () => {
|
|
49
|
+
describe('rendering', () => {});
|
|
50
|
+
|
|
51
|
+
describe('changeMaxPoints', () => {
|
|
52
|
+
const assertChangeMax = (points, excludeZero, expectedPoints, expectedSampleAnswers) => {
|
|
53
|
+
it(`${points} calls onChange with: ${expectedPoints} and ${expectedSampleAnswers}`, () => {
|
|
54
|
+
let w = wrapper({ excludeZero });
|
|
55
|
+
w.instance().changeMaxPoints(points);
|
|
56
|
+
expect(w.instance().props.onChange).toHaveBeenCalledWith({
|
|
57
|
+
excludeZero,
|
|
58
|
+
points: expectedPoints,
|
|
59
|
+
sampleAnswers: expectedSampleAnswers,
|
|
60
|
+
maxPoints: expectedPoints.length - 1,
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
assertChangeMax(1, false, _.takeRight(points, 2), _.takeRight(sampleAnswers, 2));
|
|
66
|
+
assertChangeMax(1, true, _.takeRight(points, 2), _.takeRight(sampleAnswers, 2));
|
|
67
|
+
assertChangeMax(2, true, _.takeRight(points, 3), _.takeRight(sampleAnswers, 3));
|
|
68
|
+
assertChangeMax(2, false, _.takeRight(points, 3), _.takeRight(sampleAnswers, 3));
|
|
69
|
+
assertChangeMax(5, false, ['', ''].concat(points), [null, null].concat(sampleAnswers));
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
describe('changeSampleResponse', () => {
|
|
73
|
+
const assertChangeSample = (index, clickedItem, excludeZero, expectedPoints, expectedSampleAnswers) => {
|
|
74
|
+
it(`Point ${index} calls onChange with: ${expectedPoints} and ${expectedSampleAnswers}`, () => {
|
|
75
|
+
let w = wrapper({ excludeZero });
|
|
76
|
+
w.instance().onPointMenuChange(index, clickedItem);
|
|
77
|
+
expect(w.instance().props.onChange).toHaveBeenCalledWith({
|
|
78
|
+
excludeZero,
|
|
79
|
+
points: expectedPoints,
|
|
80
|
+
sampleAnswers: expectedSampleAnswers,
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
assertChangeSample(0, 'sample', false, points, ['', 'just right', 'not left', null]);
|
|
86
|
+
assertChangeSample(3, 'sample', false, points, [null, 'just right', 'not left', '']);
|
|
87
|
+
assertChangeSample(1, 'sample', true, points, [null, null, 'not left', null]);
|
|
88
|
+
assertChangeSample(3, 'sample', true, points, [null, 'just right', 'not left', '']);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
});
|
package/src/authoring.jsx
CHANGED
|
@@ -21,6 +21,8 @@ import takeRight from 'lodash/takeRight';
|
|
|
21
21
|
import PointMenu from './point-menu';
|
|
22
22
|
|
|
23
23
|
import range from 'lodash/range';
|
|
24
|
+
import { InputContainer } from '@pie-lib/config-ui';
|
|
25
|
+
|
|
24
26
|
const log = debug('pie-lib:rubric:authoring');
|
|
25
27
|
|
|
26
28
|
const reorder = (list, startIndex, endIndex) => {
|
|
@@ -37,6 +39,7 @@ export const RubricType = PropTypes.shape({
|
|
|
37
39
|
points: PropTypes.arrayOf(PropTypes.string),
|
|
38
40
|
sampleAnswers: PropTypes.arrayOf(PropTypes.string),
|
|
39
41
|
maxPoints: PropTypes.number,
|
|
42
|
+
rubriclessInstruction: PropTypes.string,
|
|
40
43
|
});
|
|
41
44
|
|
|
42
45
|
const MaxPoints = withStyles((theme) => ({
|
|
@@ -53,7 +56,7 @@ const MaxPoints = withStyles((theme) => ({
|
|
|
53
56
|
Max Points
|
|
54
57
|
</InputLabel>
|
|
55
58
|
<Select value={value} onChange={(e) => onChange(e.target.value)} input={<OutlinedInput labelWidth={80} />}>
|
|
56
|
-
{range(1, max).map((v) => (
|
|
59
|
+
{range(1, max + 1).map((v) => (
|
|
57
60
|
<MenuItem key={`${v}`} value={v}>
|
|
58
61
|
{v}
|
|
59
62
|
</MenuItem>
|
|
@@ -94,8 +97,14 @@ export const PointConfig = withStyles((theme) => ({
|
|
|
94
97
|
position: 'absolute',
|
|
95
98
|
right: 0,
|
|
96
99
|
},
|
|
100
|
+
errorText: {
|
|
101
|
+
fontSize: theme.typography.fontSize - 2,
|
|
102
|
+
color: theme.palette.error.main,
|
|
103
|
+
paddingLeft: theme.spacing.unit * 3,
|
|
104
|
+
paddingTop: theme.spacing.unit,
|
|
105
|
+
},
|
|
97
106
|
}))((props) => {
|
|
98
|
-
const { points, content, classes, sampleAnswer, mathMlOptions = {} } = props;
|
|
107
|
+
const { points, content, classes, sampleAnswer, mathMlOptions = {}, error, pluginOpts = {} } = props;
|
|
99
108
|
const pointsLabel = `${points} ${points <= 1 ? 'pt' : 'pts'}`;
|
|
100
109
|
const showSampleAnswer = checkSampleAnswer(sampleAnswer);
|
|
101
110
|
|
|
@@ -109,6 +118,8 @@ export const PointConfig = withStyles((theme) => ({
|
|
|
109
118
|
<DragIndicator className={classes.dragIndicator} />
|
|
110
119
|
<EditableHtml
|
|
111
120
|
className={classes.editor}
|
|
121
|
+
error={error}
|
|
122
|
+
pluginProps={pluginOpts}
|
|
112
123
|
markup={content}
|
|
113
124
|
onChange={props.onChange}
|
|
114
125
|
mathMlOptions={mathMlOptions}
|
|
@@ -121,7 +132,7 @@ export const PointConfig = withStyles((theme) => ({
|
|
|
121
132
|
onChange={props.onMenuChange}
|
|
122
133
|
/>
|
|
123
134
|
</div>
|
|
124
|
-
|
|
135
|
+
{error && <div className={classes.errorText}>{error}</div>}
|
|
125
136
|
{!showSampleAnswer && (
|
|
126
137
|
<div className={classes.sampleAnswersEditor}>
|
|
127
138
|
<Typography variant="overline" className={classes.dragIndicator}>
|
|
@@ -130,6 +141,7 @@ export const PointConfig = withStyles((theme) => ({
|
|
|
130
141
|
<EditableHtml
|
|
131
142
|
className={classes.editor}
|
|
132
143
|
markup={sampleAnswer}
|
|
144
|
+
pluginProps={pluginOpts}
|
|
133
145
|
onChange={props.onSampleChange}
|
|
134
146
|
mathMlOptions={mathMlOptions}
|
|
135
147
|
/>
|
|
@@ -144,6 +156,9 @@ export class RawAuthoring extends React.Component {
|
|
|
144
156
|
classes: PropTypes.object.isRequired,
|
|
145
157
|
className: PropTypes.string,
|
|
146
158
|
value: RubricType,
|
|
159
|
+
config: PropTypes.object,
|
|
160
|
+
pluginOpts: PropTypes.object,
|
|
161
|
+
rubricless: PropTypes.bool,
|
|
147
162
|
onChange: PropTypes.func,
|
|
148
163
|
};
|
|
149
164
|
|
|
@@ -162,8 +177,13 @@ export class RawAuthoring extends React.Component {
|
|
|
162
177
|
onChange({ ...value, points, sampleAnswers });
|
|
163
178
|
};
|
|
164
179
|
|
|
165
|
-
|
|
180
|
+
changeRubriclessInstruction = (input) => {
|
|
166
181
|
const { value, onChange } = this.props;
|
|
182
|
+
onChange({ ...value, rubriclessInstruction: input });
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
changeMaxPoints = (maxPoints) => {
|
|
186
|
+
const { value, onChange, rubricless } = this.props;
|
|
167
187
|
const currentMax = value.points.length - 1;
|
|
168
188
|
|
|
169
189
|
log('current', currentMax, 'new: ', maxPoints);
|
|
@@ -184,8 +204,10 @@ export class RawAuthoring extends React.Component {
|
|
|
184
204
|
sampleAnswers = takeRight(value.sampleAnswers, maxPoints + 1);
|
|
185
205
|
}
|
|
186
206
|
|
|
187
|
-
if (points) {
|
|
188
|
-
onChange({ ...value, points, sampleAnswers });
|
|
207
|
+
if (points && !rubricless) {
|
|
208
|
+
onChange({ ...value, points, sampleAnswers, maxPoints });
|
|
209
|
+
} else {
|
|
210
|
+
onChange({ ...value, maxPoints });
|
|
189
211
|
}
|
|
190
212
|
};
|
|
191
213
|
|
|
@@ -242,21 +264,47 @@ export class RawAuthoring extends React.Component {
|
|
|
242
264
|
};
|
|
243
265
|
|
|
244
266
|
render() {
|
|
245
|
-
const {
|
|
246
|
-
|
|
247
|
-
|
|
267
|
+
const {
|
|
268
|
+
classes,
|
|
269
|
+
className,
|
|
270
|
+
value,
|
|
271
|
+
mathMlOptions = {},
|
|
272
|
+
config = {},
|
|
273
|
+
rubricless = false,
|
|
274
|
+
pluginOpts = {},
|
|
275
|
+
} = this.props;
|
|
276
|
+
let {
|
|
277
|
+
excludeZeroEnabled = true,
|
|
278
|
+
maxPointsEnabled = true,
|
|
279
|
+
errors = {},
|
|
280
|
+
rubriclessInstructionEnabled = false,
|
|
281
|
+
maxPoints = 10,
|
|
282
|
+
} = value || {};
|
|
283
|
+
// rubric will contain a max value for maxPoints
|
|
284
|
+
const { rubriclessInstruction = {}, maxMaxPoints = 10 } = config || {};
|
|
285
|
+
const { pointsDescriptorsErrors } = errors || {};
|
|
248
286
|
if (value && Number.isFinite(value.maxPoints)) {
|
|
249
287
|
// eslint-disable-next-line no-console
|
|
250
288
|
console.warn('maxPoints is deprecated - remove from model');
|
|
251
289
|
}
|
|
252
290
|
|
|
291
|
+
// for rubric value is computed based on points
|
|
292
|
+
const maxPointsValue = !rubricless ? value.points.length - 1 : maxPoints;
|
|
293
|
+
|
|
253
294
|
return (
|
|
254
295
|
<div className={classNames(classes.class, className)}>
|
|
255
296
|
<Typography variant="h5" className={classes.rubricTitle}>
|
|
256
297
|
Rubric
|
|
257
298
|
</Typography>
|
|
258
299
|
<FormGroup row>
|
|
259
|
-
{maxPointsEnabled &&
|
|
300
|
+
{maxPointsEnabled && (
|
|
301
|
+
<MaxPoints
|
|
302
|
+
max={maxMaxPoints < 100 ? maxMaxPoints : 100}
|
|
303
|
+
value={maxPointsValue}
|
|
304
|
+
onChange={this.changeMaxPoints}
|
|
305
|
+
pluginOpts={pluginOpts}
|
|
306
|
+
/>
|
|
307
|
+
)}
|
|
260
308
|
{excludeZeroEnabled && (
|
|
261
309
|
<FormControlLabel
|
|
262
310
|
label="Exclude zeros"
|
|
@@ -265,7 +313,22 @@ export class RawAuthoring extends React.Component {
|
|
|
265
313
|
)}
|
|
266
314
|
</FormGroup>
|
|
267
315
|
|
|
268
|
-
|
|
316
|
+
{rubriclessInstructionEnabled && rubricless && (
|
|
317
|
+
<InputContainer label={rubriclessInstruction.label} className={classes.inputContainer}>
|
|
318
|
+
<EditableHtml
|
|
319
|
+
className={classes.input}
|
|
320
|
+
markup={value.rubriclessInstruction || ''}
|
|
321
|
+
onChange={this.changeRubriclessInstruction}
|
|
322
|
+
pluginProps={pluginOpts}
|
|
323
|
+
nonEmpty={false}
|
|
324
|
+
disableUnderline
|
|
325
|
+
languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}
|
|
326
|
+
mathMlOptions={mathMlOptions}
|
|
327
|
+
/>
|
|
328
|
+
</InputContainer>
|
|
329
|
+
)}
|
|
330
|
+
|
|
331
|
+
<div className={rubricless ? classes.rubricless : classes.container}>
|
|
269
332
|
<DragDropContext onDragEnd={this.dragEnd}>
|
|
270
333
|
<Droppable droppableId="droppable">
|
|
271
334
|
{(provided) => (
|
|
@@ -284,11 +347,15 @@ export class RawAuthoring extends React.Component {
|
|
|
284
347
|
<PointConfig
|
|
285
348
|
points={value.points.length - 1 - index}
|
|
286
349
|
content={p}
|
|
350
|
+
error={
|
|
351
|
+
pointsDescriptorsErrors && pointsDescriptorsErrors[value.points.length - 1 - index]
|
|
352
|
+
}
|
|
287
353
|
sampleAnswer={value.sampleAnswers && value.sampleAnswers[index]}
|
|
288
354
|
onChange={(content) => this.changeContent(index, content, 'points')}
|
|
289
355
|
onSampleChange={(content) => this.changeContent(index, content, 'sampleAnswers')}
|
|
290
356
|
onMenuChange={(clickedItem) => this.onPointMenuChange(index, clickedItem)}
|
|
291
357
|
mathMlOptions={mathMlOptions}
|
|
358
|
+
pluginOpts={pluginOpts}
|
|
292
359
|
/>
|
|
293
360
|
</div>
|
|
294
361
|
)}
|
|
@@ -315,6 +382,14 @@ const styles = (theme) => ({
|
|
|
315
382
|
padding: theme.spacing.unit * 2,
|
|
316
383
|
margin: theme.spacing.unit,
|
|
317
384
|
},
|
|
385
|
+
inputContainer: {
|
|
386
|
+
width: '100%',
|
|
387
|
+
paddingTop: theme.spacing.unit * 2,
|
|
388
|
+
marginBottom: theme.spacing.unit * 2,
|
|
389
|
+
},
|
|
390
|
+
rubricless: {
|
|
391
|
+
display: 'none',
|
|
392
|
+
},
|
|
318
393
|
configHolder: {
|
|
319
394
|
paddingTop: theme.spacing.unit,
|
|
320
395
|
paddingBottom: theme.spacing.unit,
|
|
@@ -328,6 +403,7 @@ const styles = (theme) => ({
|
|
|
328
403
|
const StyledRawAuthoring = withStyles(styles)(RawAuthoring);
|
|
329
404
|
|
|
330
405
|
const Reverse = (props) => {
|
|
406
|
+
const { rubricless = false, config = {}, pluginOpts = {} } = props || {};
|
|
331
407
|
const points = Array.from(props.value.points || []).reverse();
|
|
332
408
|
let sampleAnswers = Array.from(props.value.sampleAnswers || []).reverse();
|
|
333
409
|
|
|
@@ -347,11 +423,22 @@ const Reverse = (props) => {
|
|
|
347
423
|
});
|
|
348
424
|
};
|
|
349
425
|
|
|
350
|
-
return
|
|
426
|
+
return (
|
|
427
|
+
<StyledRawAuthoring
|
|
428
|
+
value={value}
|
|
429
|
+
config={config}
|
|
430
|
+
onChange={onChange}
|
|
431
|
+
rubricless={rubricless}
|
|
432
|
+
pluginOpts={pluginOpts}
|
|
433
|
+
/>
|
|
434
|
+
);
|
|
351
435
|
};
|
|
352
436
|
|
|
353
437
|
Reverse.propTypes = {
|
|
354
438
|
value: RubricType,
|
|
439
|
+
config: PropTypes.object,
|
|
440
|
+
pluginOpts: PropTypes.object,
|
|
441
|
+
rubricless: PropTypes.bool,
|
|
355
442
|
getIndex: PropTypes.func,
|
|
356
443
|
onChange: PropTypes.func,
|
|
357
444
|
};
|