@pie-element/image-cloze-association 10.1.2-next.2 → 10.1.2
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.json +437 -0
- package/CHANGELOG.md +1997 -0
- package/LICENSE.md +5 -0
- package/README.md +1 -0
- package/configure/CHANGELOG.json +197 -0
- package/configure/CHANGELOG.md +1600 -0
- package/configure/lib/defaults.js +86 -0
- package/configure/lib/defaults.js.map +1 -0
- package/configure/lib/index.js +99 -0
- package/configure/lib/index.js.map +1 -0
- package/configure/lib/root.js +135 -0
- package/configure/lib/root.js.map +1 -0
- package/configure/package.json +23 -0
- package/configure/src/__tests__/index.test.js +155 -0
- package/configure/src/defaults.js +59 -0
- package/configure/src/index.js +114 -0
- package/configure/src/root.jsx +116 -0
- package/controller/CHANGELOG.json +137 -0
- package/controller/CHANGELOG.md +1149 -0
- package/controller/lib/defaults.js +14 -0
- package/controller/lib/defaults.js.map +1 -0
- package/controller/lib/index.js +304 -0
- package/controller/lib/index.js.map +1 -0
- package/controller/lib/utils.js +70 -0
- package/controller/lib/utils.js.map +1 -0
- package/controller/package.json +19 -0
- package/controller/src/__tests__/index.test.js +711 -0
- package/controller/src/defaults.js +7 -0
- package/controller/src/index.js +322 -0
- package/controller/src/utils.js +72 -0
- package/docs/config-schema.json +1382 -0
- package/docs/config-schema.json.md +1021 -0
- package/docs/demo/config.js +8 -0
- package/docs/demo/generate.js +74 -0
- package/docs/demo/index.html +1 -0
- package/docs/demo/session.js +16 -0
- package/docs/pie-schema.json +1085 -0
- package/docs/pie-schema.json.md +810 -0
- package/lib/constants.js +12 -0
- package/lib/constants.js.map +1 -0
- package/lib/evaluation-icon.js +60 -0
- package/lib/evaluation-icon.js.map +1 -0
- package/lib/image-container.js +94 -0
- package/lib/image-container.js.map +1 -0
- package/lib/image-drop-target.js +130 -0
- package/lib/image-drop-target.js.map +1 -0
- package/lib/index.js +220 -0
- package/lib/index.js.map +1 -0
- package/lib/interactive-section.js +104 -0
- package/lib/interactive-section.js.map +1 -0
- package/lib/possible-response.js +161 -0
- package/lib/possible-response.js.map +1 -0
- package/lib/possible-responses.js +58 -0
- package/lib/possible-responses.js.map +1 -0
- package/lib/root.js +491 -0
- package/lib/root.js.map +1 -0
- package/lib/static-html-span.js +35 -0
- package/lib/static-html-span.js.map +1 -0
- package/lib/utils-correctness.js +89 -0
- package/lib/utils-correctness.js.map +1 -0
- package/package.json +21 -86
- package/src/__tests__/index.test.js +174 -0
- package/src/__tests__/root.test.jsx +99 -0
- package/src/__tests__/utils.test.js +207 -0
- package/src/constants.js +5 -0
- package/src/evaluation-icon.jsx +54 -0
- package/src/image-container.jsx +90 -0
- package/src/image-drop-target.jsx +140 -0
- package/src/index.js +245 -0
- package/src/interactive-section.jsx +94 -0
- package/src/possible-response.jsx +152 -0
- package/src/possible-responses.jsx +52 -0
- package/src/root.jsx +490 -0
- package/src/static-html-span.jsx +30 -0
- package/src/utils-correctness.js +95 -0
- package/configure.js +0 -2
- package/controller.js +0 -1
- package/dist/author/defaults.d.ts +0 -88
- package/dist/author/defaults.js +0 -58
- package/dist/author/index.d.ts +0 -34
- package/dist/author/index.js +0 -71
- package/dist/author/root.d.ts +0 -14
- package/dist/author/root.js +0 -80
- package/dist/browser/Check-DL1c-mLM.js +0 -10708
- package/dist/browser/Check-DL1c-mLM.js.map +0 -1
- package/dist/browser/author/index.js +0 -38597
- package/dist/browser/author/index.js.map +0 -1
- package/dist/browser/controller/index.js +0 -171
- package/dist/browser/controller/index.js.map +0 -1
- package/dist/browser/delivery/index.js +0 -2699
- package/dist/browser/delivery/index.js.map +0 -1
- package/dist/browser/dist-BphSS14E.js +0 -346
- package/dist/browser/dist-BphSS14E.js.map +0 -1
- package/dist/browser/humps-CZ4RCLab.js +0 -67
- package/dist/browser/humps-CZ4RCLab.js.map +0 -1
- package/dist/browser/image-cloze-association.css +0 -2
- package/dist/controller/defaults.d.ts +0 -16
- package/dist/controller/defaults.js +0 -10
- package/dist/controller/index.d.ts +0 -23
- package/dist/controller/index.js +0 -122
- package/dist/controller/utils.d.ts +0 -14
- package/dist/controller/utils.js +0 -36
- package/dist/delivery/constants.d.ts +0 -14
- package/dist/delivery/evaluation-icon.d.ts +0 -28
- package/dist/delivery/evaluation-icon.js +0 -38
- package/dist/delivery/image-container.d.ts +0 -13
- package/dist/delivery/image-container.js +0 -61
- package/dist/delivery/image-drop-target.d.ts +0 -45
- package/dist/delivery/image-drop-target.js +0 -90
- package/dist/delivery/index.d.ts +0 -20
- package/dist/delivery/index.js +0 -110
- package/dist/delivery/interactive-section.d.ts +0 -15
- package/dist/delivery/interactive-section.js +0 -72
- package/dist/delivery/possible-response.d.ts +0 -34
- package/dist/delivery/possible-response.js +0 -100
- package/dist/delivery/possible-responses.d.ts +0 -31
- package/dist/delivery/possible-responses.js +0 -41
- package/dist/delivery/root.d.ts +0 -21
- package/dist/delivery/root.js +0 -278
- package/dist/delivery/static-html-span.d.ts +0 -14
- package/dist/delivery/static-html-span.js +0 -22
- package/dist/delivery/utils-correctness.d.ts +0 -10
- package/dist/delivery/utils-correctness.js +0 -43
- package/dist/index.d.ts +0 -1
- package/dist/index.iife.d.ts +0 -8
- package/dist/index.iife.js +0 -152
- package/dist/index.js +0 -2
- package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js +0 -16
- package/dist/runtime-support.d.ts +0 -12
- package/dist/runtime-support.js +0 -12
package/lib/root.js
ADDED
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = exports.ImageClozeAssociationComponent = void 0;
|
|
8
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
10
|
+
var _react = _interopRequireDefault(require("react"));
|
|
11
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
12
|
+
var _core = require("@dnd-kit/core");
|
|
13
|
+
var _drag = require("@pie-lib/drag");
|
|
14
|
+
var _reactTransitionGroup = require("react-transition-group");
|
|
15
|
+
var _renderUi = require("@pie-lib/render-ui");
|
|
16
|
+
var _styles = require("@mui/material/styles");
|
|
17
|
+
var _NotInterested = _interopRequireDefault(require("@mui/icons-material/NotInterested"));
|
|
18
|
+
var _correctAnswerToggle = _interopRequireDefault(require("@pie-lib/correct-answer-toggle"));
|
|
19
|
+
var _translator = _interopRequireDefault(require("@pie-lib/translator"));
|
|
20
|
+
var _lodashEs = require("lodash-es");
|
|
21
|
+
var _imageContainer = _interopRequireDefault(require("./image-container"));
|
|
22
|
+
var _interactiveSection = _interopRequireDefault(require("./interactive-section"));
|
|
23
|
+
var _possibleResponses2 = _interopRequireDefault(require("./possible-responses"));
|
|
24
|
+
var _utilsCorrectness = require("./utils-correctness");
|
|
25
|
+
var _possibleResponse = _interopRequireDefault(require("./possible-response"));
|
|
26
|
+
const {
|
|
27
|
+
translator
|
|
28
|
+
} = _translator.default;
|
|
29
|
+
const generateId = () => Math.random().toString(36).substring(2) + new Date().getTime().toString(36);
|
|
30
|
+
const StyledUiLayout = (0, _styles.styled)(_renderUi.UiLayout)({
|
|
31
|
+
color: _renderUi.color.text(),
|
|
32
|
+
backgroundColor: _renderUi.color.background(),
|
|
33
|
+
position: 'relative',
|
|
34
|
+
'& img': {
|
|
35
|
+
maxWidth: '100%',
|
|
36
|
+
height: 'auto'
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
const StyledTeacherInstructions = (0, _styles.styled)(_renderUi.Collapsible)(({
|
|
40
|
+
theme
|
|
41
|
+
}) => ({
|
|
42
|
+
marginBottom: theme.spacing(2)
|
|
43
|
+
}));
|
|
44
|
+
const StyledRationale = (0, _styles.styled)(_renderUi.Collapsible)(({
|
|
45
|
+
theme
|
|
46
|
+
}) => ({
|
|
47
|
+
marginTop: theme.spacing(2)
|
|
48
|
+
}));
|
|
49
|
+
class ImageClozeAssociationComponent extends _react.default.Component {
|
|
50
|
+
constructor(props) {
|
|
51
|
+
super(props);
|
|
52
|
+
(0, _defineProperty2.default)(this, "onDragStart", event => {
|
|
53
|
+
const {
|
|
54
|
+
active
|
|
55
|
+
} = event;
|
|
56
|
+
if (active?.data?.current) {
|
|
57
|
+
this.setState({
|
|
58
|
+
draggingElement: active.data.current,
|
|
59
|
+
isValidDrop: false
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
(0, _defineProperty2.default)(this, "onDragEnd", event => {
|
|
64
|
+
const {
|
|
65
|
+
active,
|
|
66
|
+
over
|
|
67
|
+
} = event;
|
|
68
|
+
const {
|
|
69
|
+
model
|
|
70
|
+
} = this.props;
|
|
71
|
+
const {
|
|
72
|
+
duplicateResponses
|
|
73
|
+
} = model || {};
|
|
74
|
+
|
|
75
|
+
// Check if drop is valid
|
|
76
|
+
const draggedItem = active?.data?.current;
|
|
77
|
+
const responseArea = over?.data?.current;
|
|
78
|
+
const isValidDrop = over && active && draggedItem && responseArea && responseArea.containerIndex !== undefined;
|
|
79
|
+
const shouldDisableAnimation = isValidDrop && duplicateResponses;
|
|
80
|
+
this.setState({
|
|
81
|
+
draggingElement: {
|
|
82
|
+
id: '',
|
|
83
|
+
value: ''
|
|
84
|
+
},
|
|
85
|
+
isValidDrop: shouldDisableAnimation
|
|
86
|
+
});
|
|
87
|
+
if (!over || !active) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (!draggedItem) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (over.id === 'ica-board') {
|
|
94
|
+
this.handleOnAnswerRemove(draggedItem);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (responseArea) {
|
|
98
|
+
this.handleOnAnswerSelect(draggedItem, responseArea.containerIndex);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
(0, _defineProperty2.default)(this, "renderDragOverlay", () => {
|
|
102
|
+
const {
|
|
103
|
+
draggingElement
|
|
104
|
+
} = this.state;
|
|
105
|
+
const {
|
|
106
|
+
model
|
|
107
|
+
} = this.props;
|
|
108
|
+
if (!draggingElement.id) return null;
|
|
109
|
+
|
|
110
|
+
// check if the response contains an image
|
|
111
|
+
const imgRegex = /<img[^>]+src="([^">]+)"/;
|
|
112
|
+
const containsImage = imgRegex.test(draggingElement.value);
|
|
113
|
+
return /*#__PURE__*/_react.default.createElement(_possibleResponse.default, {
|
|
114
|
+
key: draggingElement.id,
|
|
115
|
+
canDrag: false,
|
|
116
|
+
data: draggingElement,
|
|
117
|
+
onDragBegin: () => {},
|
|
118
|
+
isOverlay: true,
|
|
119
|
+
containerStyle: {
|
|
120
|
+
...(model.answerChoiceTransparency ? {
|
|
121
|
+
opacity: '0.8'
|
|
122
|
+
} : {}),
|
|
123
|
+
...(!containsImage ? {
|
|
124
|
+
padding: '0 10px',
|
|
125
|
+
margin: '4px 6px !important'
|
|
126
|
+
} : {})
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
(0, _defineProperty2.default)(this, "filterPossibleAnswers", (possibleResponses, answer) => possibleResponses.filter(response => response.value !== answer.value));
|
|
131
|
+
(0, _defineProperty2.default)(this, "handleOnAnswerSelect", (answer, responseContainerIndex) => {
|
|
132
|
+
const {
|
|
133
|
+
model: {
|
|
134
|
+
duplicateResponses
|
|
135
|
+
},
|
|
136
|
+
updateAnswer
|
|
137
|
+
} = this.props;
|
|
138
|
+
const {
|
|
139
|
+
answers,
|
|
140
|
+
maxResponsePerZone
|
|
141
|
+
} = this.state;
|
|
142
|
+
let {
|
|
143
|
+
possibleResponses
|
|
144
|
+
} = this.state;
|
|
145
|
+
let answersToStore;
|
|
146
|
+
const answersInThisContainer = [];
|
|
147
|
+
const answersInOtherContainers = [];
|
|
148
|
+
answers.forEach(a => {
|
|
149
|
+
if (a.containerIndex === responseContainerIndex) {
|
|
150
|
+
answersInThisContainer.push(a);
|
|
151
|
+
} else {
|
|
152
|
+
answersInOtherContainers.push(a);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
if (maxResponsePerZone === answersInThisContainer.length) {
|
|
156
|
+
const shiftedItem = answersInThisContainer[0];
|
|
157
|
+
if (maxResponsePerZone === 1) {
|
|
158
|
+
answersInThisContainer.shift(); // FIFO
|
|
159
|
+
} else {
|
|
160
|
+
this.setState({
|
|
161
|
+
maxResponsePerZoneWarning: true
|
|
162
|
+
});
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// if duplicates are not allowed, make sure to put the shifted value back in possible responses
|
|
167
|
+
if (!duplicateResponses) {
|
|
168
|
+
possibleResponses = Array.isArray(possibleResponses) ? possibleResponses : [];
|
|
169
|
+
possibleResponses.push({
|
|
170
|
+
...shiftedItem,
|
|
171
|
+
containerIndex: undefined,
|
|
172
|
+
id: shiftedItem.id || generateId()
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// answers will be:
|
|
177
|
+
// + shifted answers for the current container
|
|
178
|
+
// + if duplicatesAllowed, all the other answers from other containers
|
|
179
|
+
// else: all the answers from other containers that are not having the same value
|
|
180
|
+
// + new answer
|
|
181
|
+
answersToStore = [...answersInThisContainer,
|
|
182
|
+
// shifted
|
|
183
|
+
// TODO allow duplicates case Question: should we remove answer from a container if dragged to another container?
|
|
184
|
+
// if yes, this should do it: add a.id !== answer.id instead of 'true'
|
|
185
|
+
...answersInOtherContainers.filter(a => duplicateResponses ? true : a.value !== answer.value),
|
|
186
|
+
// un-shifted
|
|
187
|
+
{
|
|
188
|
+
...answer,
|
|
189
|
+
containerIndex: responseContainerIndex,
|
|
190
|
+
...(duplicateResponses ? {
|
|
191
|
+
id: generateId()
|
|
192
|
+
} : {})
|
|
193
|
+
}];
|
|
194
|
+
} else {
|
|
195
|
+
// answers will be:
|
|
196
|
+
// + if duplicatesAllowed, all the other answers, except the one that was dragged
|
|
197
|
+
// else: all the answers that are not having the same value
|
|
198
|
+
// + new answer
|
|
199
|
+
answersToStore = [
|
|
200
|
+
// TODO allow duplicates case Question: should we remove answer from a container if dragged to another container?
|
|
201
|
+
// if yes, this should do it: add a.id !== answer.id instead of 'true'
|
|
202
|
+
...answers.filter(a => duplicateResponses ? a.id !== answer.id : a.value !== answer.value), {
|
|
203
|
+
...answer,
|
|
204
|
+
containerIndex: responseContainerIndex,
|
|
205
|
+
...(duplicateResponses ? {
|
|
206
|
+
id: generateId()
|
|
207
|
+
} : {})
|
|
208
|
+
}];
|
|
209
|
+
}
|
|
210
|
+
this.setState({
|
|
211
|
+
maxResponsePerZoneWarning: false,
|
|
212
|
+
answers: answersToStore,
|
|
213
|
+
possibleResponses:
|
|
214
|
+
// for single response per container remove answer from possible responses
|
|
215
|
+
duplicateResponses ? possibleResponses : this.filterPossibleAnswers(possibleResponses, answer)
|
|
216
|
+
});
|
|
217
|
+
updateAnswer(answersToStore);
|
|
218
|
+
});
|
|
219
|
+
(0, _defineProperty2.default)(this, "handleOnAnswerRemove", answer => {
|
|
220
|
+
const {
|
|
221
|
+
model: {
|
|
222
|
+
duplicateResponses
|
|
223
|
+
},
|
|
224
|
+
updateAnswer
|
|
225
|
+
} = this.props;
|
|
226
|
+
const {
|
|
227
|
+
answers,
|
|
228
|
+
possibleResponses
|
|
229
|
+
} = this.state;
|
|
230
|
+
const answersToStore = answers.filter(a => a.id !== answer.id);
|
|
231
|
+
const shouldNotPushInPossibleResponses = answer.containerIndex === undefined; // don't duplicate possible responses
|
|
232
|
+
|
|
233
|
+
this.setState({
|
|
234
|
+
maxResponsePerZoneWarning: false,
|
|
235
|
+
answers: answersToStore,
|
|
236
|
+
// push back into possible responses the removed answer if responses cannot be duplicated
|
|
237
|
+
possibleResponses: duplicateResponses || shouldNotPushInPossibleResponses ? possibleResponses : [...possibleResponses, {
|
|
238
|
+
...answer,
|
|
239
|
+
containerIndex: undefined
|
|
240
|
+
}]
|
|
241
|
+
});
|
|
242
|
+
updateAnswer(answersToStore);
|
|
243
|
+
});
|
|
244
|
+
(0, _defineProperty2.default)(this, "toggleCorrect", showCorrect => this.setState({
|
|
245
|
+
showCorrect
|
|
246
|
+
}));
|
|
247
|
+
const {
|
|
248
|
+
model: {
|
|
249
|
+
possibleResponses: _possibleResponses,
|
|
250
|
+
responseContainers,
|
|
251
|
+
duplicateResponses: _duplicateResponses,
|
|
252
|
+
maxResponsePerZone: _maxResponsePerZone
|
|
253
|
+
},
|
|
254
|
+
session
|
|
255
|
+
} = props;
|
|
256
|
+
let {
|
|
257
|
+
answers: _answers
|
|
258
|
+
} = session || {};
|
|
259
|
+
// set id for each possible response
|
|
260
|
+
const possibleResponsesWithIds = (_possibleResponses || []).map((item, index) => ({
|
|
261
|
+
value: item,
|
|
262
|
+
id: `${index}`
|
|
263
|
+
}));
|
|
264
|
+
let groupedAnswers = (0, _lodashEs.groupBy)(_answers || [], 'containerIndex');
|
|
265
|
+
// keep only last maxResponsePerZone answers for each zone
|
|
266
|
+
let limitedAnswers = (0, _lodashEs.flatMap)(groupedAnswers, grp => grp.slice(-(_maxResponsePerZone || 1)));
|
|
267
|
+
_answers = limitedAnswers
|
|
268
|
+
// set id for each answer
|
|
269
|
+
.map((answer, index) => ({
|
|
270
|
+
...answer,
|
|
271
|
+
id: `${index}`
|
|
272
|
+
}))
|
|
273
|
+
// return only answer which have a valid container index
|
|
274
|
+
.filter(answer => answer.containerIndex < responseContainers.length);
|
|
275
|
+
const possibleResponsesFiltered = possibleResponsesWithIds.filter(response => !_answers.find(answer => answer.value === response.value));
|
|
276
|
+
this.state = {
|
|
277
|
+
answers: _answers || [],
|
|
278
|
+
draggingElement: {
|
|
279
|
+
id: '',
|
|
280
|
+
value: ''
|
|
281
|
+
},
|
|
282
|
+
possibleResponses: _duplicateResponses ? possibleResponsesWithIds : possibleResponsesFiltered,
|
|
283
|
+
// set id for each response containers
|
|
284
|
+
responseContainers: (responseContainers || []).map((item, index) => ({
|
|
285
|
+
index,
|
|
286
|
+
...item,
|
|
287
|
+
id: `${index}`
|
|
288
|
+
})),
|
|
289
|
+
maxResponsePerZone: _maxResponsePerZone || 1,
|
|
290
|
+
showCorrect: false,
|
|
291
|
+
isValidDrop: false
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
render() {
|
|
295
|
+
const {
|
|
296
|
+
model: {
|
|
297
|
+
disabled,
|
|
298
|
+
duplicateResponses,
|
|
299
|
+
extraCSSRules,
|
|
300
|
+
image,
|
|
301
|
+
responseAreaFill,
|
|
302
|
+
stimulus,
|
|
303
|
+
responseCorrect,
|
|
304
|
+
validation,
|
|
305
|
+
teacherInstructions,
|
|
306
|
+
prompt,
|
|
307
|
+
autoplayAudioEnabled,
|
|
308
|
+
showDashedBorder,
|
|
309
|
+
mode,
|
|
310
|
+
rationale,
|
|
311
|
+
language,
|
|
312
|
+
uiStyle = {},
|
|
313
|
+
answerChoiceTransparency,
|
|
314
|
+
responseContainerPadding,
|
|
315
|
+
imageDropTargetPadding,
|
|
316
|
+
fontSizeFactor,
|
|
317
|
+
customAudioButton
|
|
318
|
+
}
|
|
319
|
+
} = this.props;
|
|
320
|
+
const {
|
|
321
|
+
answers,
|
|
322
|
+
draggingElement,
|
|
323
|
+
possibleResponses,
|
|
324
|
+
responseContainers,
|
|
325
|
+
maxResponsePerZone,
|
|
326
|
+
maxResponsePerZoneWarning,
|
|
327
|
+
showCorrect,
|
|
328
|
+
isValidDrop
|
|
329
|
+
} = this.state;
|
|
330
|
+
const isEvaluateMode = mode === 'evaluate';
|
|
331
|
+
const showToggle = isEvaluateMode && !responseCorrect;
|
|
332
|
+
const {
|
|
333
|
+
possibilityListPosition = 'bottom'
|
|
334
|
+
} = uiStyle || {};
|
|
335
|
+
const isVertical = possibilityListPosition === 'left' || possibilityListPosition === 'right';
|
|
336
|
+
const {
|
|
337
|
+
validResponse
|
|
338
|
+
} = validation || {};
|
|
339
|
+
const correctAnswers = [];
|
|
340
|
+
const showRationale = rationale && ((0, _renderUi.hasText)(rationale) || (0, _renderUi.hasMedia)(rationale));
|
|
341
|
+
const showTeacherInstructions = teacherInstructions && ((0, _renderUi.hasText)(teacherInstructions) || (0, _renderUi.hasMedia)(teacherInstructions));
|
|
342
|
+
if (validResponse) {
|
|
343
|
+
(validResponse.value || []).forEach((container, i) => {
|
|
344
|
+
(container.images || []).forEach(v => {
|
|
345
|
+
correctAnswers.push({
|
|
346
|
+
value: v,
|
|
347
|
+
containerIndex: i,
|
|
348
|
+
isCorrect: true
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
const warningMessage = translator.t('imageClozeAssociation.reachedLimit_other', {
|
|
354
|
+
lng: language,
|
|
355
|
+
count: maxResponsePerZone
|
|
356
|
+
});
|
|
357
|
+
let answersToShow = responseCorrect !== undefined ? (0, _utilsCorrectness.getAnswersCorrectness)(answers, validation, duplicateResponses) : answers;
|
|
358
|
+
if (responseCorrect === false && maxResponsePerZone === 1) {
|
|
359
|
+
answersToShow = [...answersToShow, ...(0, _utilsCorrectness.getUnansweredAnswers)(answersToShow, validation)];
|
|
360
|
+
}
|
|
361
|
+
const sharedImageProps = {
|
|
362
|
+
draggingElement,
|
|
363
|
+
duplicateResponses,
|
|
364
|
+
image,
|
|
365
|
+
onAnswerSelect: this.handleOnAnswerSelect,
|
|
366
|
+
onDragAnswerBegin: this.onDragStart,
|
|
367
|
+
onDragAnswerEnd: this.onDragEnd,
|
|
368
|
+
responseContainers,
|
|
369
|
+
showDashedBorder,
|
|
370
|
+
responseAreaFill,
|
|
371
|
+
responseContainerPadding,
|
|
372
|
+
imageDropTargetPadding,
|
|
373
|
+
maxResponsePerZone
|
|
374
|
+
};
|
|
375
|
+
const renderImage = () => /*#__PURE__*/_react.default.createElement(_imageContainer.default, (0, _extends2.default)({}, sharedImageProps, {
|
|
376
|
+
canDrag: showCorrect && showToggle ? false : !disabled,
|
|
377
|
+
answers: showCorrect && showToggle ? correctAnswers : answersToShow,
|
|
378
|
+
answerChoiceTransparency: !(showCorrect && showToggle) ? answerChoiceTransparency : undefined
|
|
379
|
+
}));
|
|
380
|
+
const renderPossibleResponses = () => {
|
|
381
|
+
if (showCorrect && showToggle) return null;
|
|
382
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, maxResponsePerZoneWarning && /*#__PURE__*/_react.default.createElement(WarningInfo, {
|
|
383
|
+
message: warningMessage
|
|
384
|
+
}), /*#__PURE__*/_react.default.createElement(_possibleResponses2.default, {
|
|
385
|
+
canDrag: !disabled,
|
|
386
|
+
data: possibleResponses,
|
|
387
|
+
onAnswerRemove: this.handleOnAnswerRemove,
|
|
388
|
+
onDragBegin: this.onDragStart,
|
|
389
|
+
answerChoiceTransparency: answerChoiceTransparency,
|
|
390
|
+
customStyle: {
|
|
391
|
+
minWidth: isVertical ? '130px' : image?.width || 'fit-content'
|
|
392
|
+
},
|
|
393
|
+
isVertical: isVertical,
|
|
394
|
+
minHeight: isVertical ? image?.height : undefined
|
|
395
|
+
}));
|
|
396
|
+
};
|
|
397
|
+
return /*#__PURE__*/_react.default.createElement(_drag.DragProvider, {
|
|
398
|
+
onDragStart: this.onDragStart,
|
|
399
|
+
onDragEnd: this.onDragEnd
|
|
400
|
+
}, /*#__PURE__*/_react.default.createElement(StyledUiLayout, {
|
|
401
|
+
extraCSSRules: extraCSSRules,
|
|
402
|
+
id: 'main-container',
|
|
403
|
+
fontSizeFactor: fontSizeFactor
|
|
404
|
+
}, showTeacherInstructions && /*#__PURE__*/_react.default.createElement(StyledTeacherInstructions, {
|
|
405
|
+
labels: {
|
|
406
|
+
hidden: 'Show Teacher Instructions',
|
|
407
|
+
visible: 'Hide Teacher Instructions'
|
|
408
|
+
}
|
|
409
|
+
}, /*#__PURE__*/_react.default.createElement(_renderUi.PreviewPrompt, {
|
|
410
|
+
prompt: teacherInstructions
|
|
411
|
+
})), /*#__PURE__*/_react.default.createElement(_renderUi.PreviewPrompt, {
|
|
412
|
+
className: "prompt",
|
|
413
|
+
prompt: prompt,
|
|
414
|
+
autoplayAudioEnabled: autoplayAudioEnabled,
|
|
415
|
+
customAudioButton: customAudioButton
|
|
416
|
+
}), /*#__PURE__*/_react.default.createElement(_renderUi.PreviewPrompt, {
|
|
417
|
+
prompt: stimulus
|
|
418
|
+
}), /*#__PURE__*/_react.default.createElement(_correctAnswerToggle.default, {
|
|
419
|
+
show: showToggle,
|
|
420
|
+
toggled: showCorrect,
|
|
421
|
+
onToggle: this.toggleCorrect,
|
|
422
|
+
language: language
|
|
423
|
+
}), /*#__PURE__*/_react.default.createElement(_interactiveSection.default, {
|
|
424
|
+
responseCorrect: showCorrect && showToggle ? true : responseCorrect,
|
|
425
|
+
uiStyle: uiStyle
|
|
426
|
+
}, renderImage(), renderPossibleResponses()), showRationale && /*#__PURE__*/_react.default.createElement(StyledRationale, {
|
|
427
|
+
labels: {
|
|
428
|
+
hidden: 'Show Rationale',
|
|
429
|
+
visible: 'Hide Rationale'
|
|
430
|
+
}
|
|
431
|
+
}, /*#__PURE__*/_react.default.createElement(_renderUi.PreviewPrompt, {
|
|
432
|
+
prompt: rationale
|
|
433
|
+
}))), /*#__PURE__*/_react.default.createElement(_core.DragOverlay, {
|
|
434
|
+
dropAnimation: isValidDrop ? null : undefined
|
|
435
|
+
}, this.renderDragOverlay()));
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
exports.ImageClozeAssociationComponent = ImageClozeAssociationComponent;
|
|
439
|
+
const WarningContainer = (0, _styles.styled)('div')(({
|
|
440
|
+
theme
|
|
441
|
+
}) => ({
|
|
442
|
+
margin: `0 ${theme.spacing(2)}`,
|
|
443
|
+
backgroundColor: '#dddddd',
|
|
444
|
+
padding: theme.spacing(1),
|
|
445
|
+
display: 'flex',
|
|
446
|
+
alignItems: 'center',
|
|
447
|
+
'& svg': {
|
|
448
|
+
height: '30px'
|
|
449
|
+
},
|
|
450
|
+
'& h1': {
|
|
451
|
+
padding: '0px',
|
|
452
|
+
margin: '0px'
|
|
453
|
+
}
|
|
454
|
+
}));
|
|
455
|
+
const WarningMessage = (0, _styles.styled)('span')(({
|
|
456
|
+
theme
|
|
457
|
+
}) => ({
|
|
458
|
+
paddingLeft: theme.spacing(0.5),
|
|
459
|
+
userSelect: 'none'
|
|
460
|
+
}));
|
|
461
|
+
const WarningInfo = ({
|
|
462
|
+
message
|
|
463
|
+
}) => {
|
|
464
|
+
const nodeRef = _react.default.useRef(null);
|
|
465
|
+
return /*#__PURE__*/_react.default.createElement(_reactTransitionGroup.TransitionGroup, null, /*#__PURE__*/_react.default.createElement(_reactTransitionGroup.CSSTransition, {
|
|
466
|
+
classNames: 'fb',
|
|
467
|
+
key: "fb",
|
|
468
|
+
timeout: 300,
|
|
469
|
+
nodeRef: nodeRef
|
|
470
|
+
}, /*#__PURE__*/_react.default.createElement(WarningContainer, {
|
|
471
|
+
ref: nodeRef,
|
|
472
|
+
key: "panel"
|
|
473
|
+
}, /*#__PURE__*/_react.default.createElement(_NotInterested.default, {
|
|
474
|
+
color: 'secondary',
|
|
475
|
+
fontSize: 'small'
|
|
476
|
+
}), /*#__PURE__*/_react.default.createElement(WarningMessage, {
|
|
477
|
+
dangerouslySetInnerHTML: {
|
|
478
|
+
__html: message
|
|
479
|
+
}
|
|
480
|
+
}))));
|
|
481
|
+
};
|
|
482
|
+
WarningInfo.propTypes = {
|
|
483
|
+
message: _propTypes.default.string
|
|
484
|
+
};
|
|
485
|
+
ImageClozeAssociationComponent.propTypes = {
|
|
486
|
+
model: _propTypes.default.object.isRequired,
|
|
487
|
+
session: _propTypes.default.object,
|
|
488
|
+
updateAnswer: _propTypes.default.func.isRequired
|
|
489
|
+
};
|
|
490
|
+
var _default = exports.default = ImageClozeAssociationComponent;
|
|
491
|
+
//# sourceMappingURL=root.js.map
|
package/lib/root.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root.js","names":["_react","_interopRequireDefault","require","_propTypes","_core","_drag","_reactTransitionGroup","_renderUi","_styles","_NotInterested","_correctAnswerToggle","_translator","_lodashEs","_imageContainer","_interactiveSection","_possibleResponses2","_utilsCorrectness","_possibleResponse","translator","Translator","generateId","Math","random","toString","substring","Date","getTime","StyledUiLayout","styled","UiLayout","color","text","backgroundColor","background","position","maxWidth","height","StyledTeacherInstructions","Collapsible","theme","marginBottom","spacing","StyledRationale","marginTop","ImageClozeAssociationComponent","React","Component","constructor","props","_defineProperty2","default","event","active","data","current","setState","draggingElement","isValidDrop","over","model","duplicateResponses","draggedItem","responseArea","containerIndex","undefined","shouldDisableAnimation","id","value","handleOnAnswerRemove","handleOnAnswerSelect","state","imgRegex","containsImage","test","createElement","key","canDrag","onDragBegin","isOverlay","containerStyle","answerChoiceTransparency","opacity","padding","margin","possibleResponses","answer","filter","response","responseContainerIndex","updateAnswer","answers","maxResponsePerZone","answersToStore","answersInThisContainer","answersInOtherContainers","forEach","a","push","length","shiftedItem","shift","maxResponsePerZoneWarning","Array","isArray","filterPossibleAnswers","shouldNotPushInPossibleResponses","showCorrect","responseContainers","session","possibleResponsesWithIds","map","item","index","groupedAnswers","groupBy","limitedAnswers","flatMap","grp","slice","possibleResponsesFiltered","find","render","disabled","extraCSSRules","image","responseAreaFill","stimulus","responseCorrect","validation","teacherInstructions","prompt","autoplayAudioEnabled","showDashedBorder","mode","rationale","language","uiStyle","responseContainerPadding","imageDropTargetPadding","fontSizeFactor","customAudioButton","isEvaluateMode","showToggle","possibilityListPosition","isVertical","validResponse","correctAnswers","showRationale","hasText","hasMedia","showTeacherInstructions","container","i","images","v","isCorrect","warningMessage","t","lng","count","answersToShow","getAnswersCorrectness","getUnansweredAnswers","sharedImageProps","onAnswerSelect","onDragAnswerBegin","onDragStart","onDragAnswerEnd","onDragEnd","renderImage","_extends2","renderPossibleResponses","Fragment","WarningInfo","message","onAnswerRemove","customStyle","minWidth","width","minHeight","DragProvider","labels","hidden","visible","PreviewPrompt","className","show","toggled","onToggle","toggleCorrect","DragOverlay","dropAnimation","renderDragOverlay","exports","WarningContainer","display","alignItems","WarningMessage","paddingLeft","userSelect","nodeRef","useRef","TransitionGroup","CSSTransition","classNames","timeout","ref","fontSize","dangerouslySetInnerHTML","__html","propTypes","PropTypes","string","object","isRequired","func","_default"],"sources":["../src/root.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { DragOverlay } from '@dnd-kit/core';\nimport { DragProvider } from '@pie-lib/drag';\nimport { CSSTransition, TransitionGroup } from 'react-transition-group';\nimport { color, Collapsible, PreviewPrompt, UiLayout, hasText, hasMedia } from '@pie-lib/render-ui';\nimport { styled } from '@mui/material/styles';\nimport NotInterestedIcon from '@mui/icons-material/NotInterested';\nimport CorrectAnswerToggle from '@pie-lib/correct-answer-toggle';\nimport Translator from '@pie-lib/translator';\nimport { flatMap, groupBy } from 'lodash-es';\n\nconst { translator } = Translator;\nimport Image from './image-container';\nimport InteractiveSection from './interactive-section';\nimport PossibleResponses from './possible-responses';\nimport { getUnansweredAnswers, getAnswersCorrectness } from './utils-correctness';\nimport PossibleResponse from './possible-response';\n\nconst generateId = () => Math.random().toString(36).substring(2) + new Date().getTime().toString(36);\n\nconst StyledUiLayout = styled(UiLayout)({\n color: color.text(),\n backgroundColor: color.background(),\n position: 'relative',\n '& img': {\n maxWidth: '100%',\n height: 'auto',\n },\n});\n\nconst StyledTeacherInstructions = styled(Collapsible)(({ theme }) => ({\n marginBottom: theme.spacing(2),\n}));\n\nconst StyledRationale = styled(Collapsible)(({ theme }) => ({\n marginTop: theme.spacing(2),\n}));\n\nexport class ImageClozeAssociationComponent extends React.Component {\n constructor(props) {\n super(props);\n const {\n model: { possibleResponses, responseContainers, duplicateResponses, maxResponsePerZone },\n session,\n } = props;\n let { answers } = session || {};\n // set id for each possible response\n const possibleResponsesWithIds = (possibleResponses || []).map((item, index) => ({\n value: item,\n id: `${index}`,\n }));\n\n let groupedAnswers = groupBy(answers || [], 'containerIndex');\n // keep only last maxResponsePerZone answers for each zone\n let limitedAnswers = flatMap(groupedAnswers, (grp) => grp.slice(-(maxResponsePerZone || 1)));\n answers = limitedAnswers\n // set id for each answer\n .map((answer, index) => ({ ...answer, id: `${index}` }))\n // return only answer which have a valid container index\n .filter((answer) => answer.containerIndex < responseContainers.length);\n\n const possibleResponsesFiltered = possibleResponsesWithIds.filter(\n (response) => !answers.find((answer) => answer.value === response.value),\n );\n this.state = {\n answers: answers || [],\n draggingElement: { id: '', value: '' },\n possibleResponses: duplicateResponses ? possibleResponsesWithIds : possibleResponsesFiltered,\n // set id for each response containers\n responseContainers: (responseContainers || []).map((item, index) => ({\n index,\n ...item,\n id: `${index}`,\n })),\n maxResponsePerZone: maxResponsePerZone || 1,\n showCorrect: false,\n isValidDrop: false,\n };\n }\n\n onDragStart = (event) => {\n const { active } = event;\n\n if (active?.data?.current) {\n this.setState({\n draggingElement: active.data.current,\n isValidDrop: false,\n });\n }\n };\n\n onDragEnd = (event) => {\n const { active, over } = event;\n const { model } = this.props;\n const { duplicateResponses } = model || {};\n\n // Check if drop is valid\n const draggedItem = active?.data?.current;\n const responseArea = over?.data?.current;\n const isValidDrop =\n over &&\n active &&\n draggedItem &&\n responseArea &&\n responseArea.containerIndex !== undefined;\n\n const shouldDisableAnimation = isValidDrop && duplicateResponses;\n\n this.setState({\n draggingElement: { id: '', value: '' },\n isValidDrop: shouldDisableAnimation,\n });\n\n if (!over || !active) {\n return;\n }\n\n if (!draggedItem) {\n return;\n }\n\n if (over.id === 'ica-board') {\n this.handleOnAnswerRemove(draggedItem);\n return;\n }\n\n if (responseArea) {\n this.handleOnAnswerSelect(draggedItem, responseArea.containerIndex);\n }\n };\n\n renderDragOverlay = () => {\n const { draggingElement } = this.state;\n const { model } = this.props;\n\n if (!draggingElement.id) return null;\n\n // check if the response contains an image\n const imgRegex = /<img[^>]+src=\"([^\">]+)\"/;\n const containsImage = imgRegex.test(draggingElement.value);\n\n return (\n <PossibleResponse\n key={draggingElement.id}\n canDrag={false}\n data={draggingElement}\n onDragBegin={() => {}}\n isOverlay\n containerStyle={{\n ...(model.answerChoiceTransparency ? { opacity: '0.8' } : {}),\n ...(!containsImage ? { padding: '0 10px', margin: '4px 6px !important' } : {}),\n }}\n />\n );\n };\n\n filterPossibleAnswers = (possibleResponses, answer) =>\n possibleResponses.filter((response) => response.value !== answer.value);\n\n handleOnAnswerSelect = (answer, responseContainerIndex) => {\n const {\n model: { duplicateResponses },\n updateAnswer,\n } = this.props;\n const { answers, maxResponsePerZone } = this.state;\n let { possibleResponses } = this.state;\n let answersToStore;\n\n const answersInThisContainer = [];\n const answersInOtherContainers = [];\n\n answers.forEach((a) => {\n if (a.containerIndex === responseContainerIndex) {\n answersInThisContainer.push(a);\n } else {\n answersInOtherContainers.push(a);\n }\n });\n\n if (maxResponsePerZone === answersInThisContainer.length) {\n const shiftedItem = answersInThisContainer[0];\n if (maxResponsePerZone === 1) {\n answersInThisContainer.shift(); // FIFO\n } else {\n this.setState({ maxResponsePerZoneWarning: true });\n return;\n }\n\n // if duplicates are not allowed, make sure to put the shifted value back in possible responses\n if (!duplicateResponses) {\n possibleResponses = Array.isArray(possibleResponses) ? possibleResponses : [];\n\n possibleResponses.push({\n ...shiftedItem,\n containerIndex: undefined,\n id: shiftedItem.id || generateId(),\n });\n }\n\n // answers will be:\n // + shifted answers for the current container\n // + if duplicatesAllowed, all the other answers from other containers\n // else: all the answers from other containers that are not having the same value\n // + new answer\n answersToStore = [\n ...answersInThisContainer, // shifted\n // TODO allow duplicates case Question: should we remove answer from a container if dragged to another container?\n // if yes, this should do it: add a.id !== answer.id instead of 'true'\n ...answersInOtherContainers.filter((a) => (duplicateResponses ? true : a.value !== answer.value)), // un-shifted\n {\n ...answer,\n containerIndex: responseContainerIndex,\n ...(duplicateResponses ? { id: generateId() } : {}),\n },\n ];\n } else {\n // answers will be:\n // + if duplicatesAllowed, all the other answers, except the one that was dragged\n // else: all the answers that are not having the same value\n // + new answer\n answersToStore = [\n // TODO allow duplicates case Question: should we remove answer from a container if dragged to another container?\n // if yes, this should do it: add a.id !== answer.id instead of 'true'\n ...answers.filter((a) => (duplicateResponses ? a.id !== answer.id : a.value !== answer.value)),\n {\n ...answer,\n containerIndex: responseContainerIndex,\n ...(duplicateResponses ? { id: generateId() } : {}),\n },\n ];\n }\n this.setState({\n maxResponsePerZoneWarning: false,\n answers: answersToStore,\n possibleResponses:\n // for single response per container remove answer from possible responses\n duplicateResponses ? possibleResponses : this.filterPossibleAnswers(possibleResponses, answer),\n });\n updateAnswer(answersToStore);\n };\n\n handleOnAnswerRemove = (answer) => {\n const {\n model: { duplicateResponses },\n updateAnswer,\n } = this.props;\n const { answers, possibleResponses } = this.state;\n const answersToStore = answers.filter((a) => a.id !== answer.id);\n const shouldNotPushInPossibleResponses = answer.containerIndex === undefined; // don't duplicate possible responses\n\n this.setState({\n maxResponsePerZoneWarning: false,\n answers: answersToStore,\n // push back into possible responses the removed answer if responses cannot be duplicated\n possibleResponses:\n duplicateResponses || shouldNotPushInPossibleResponses\n ? possibleResponses\n : [\n ...possibleResponses,\n {\n ...answer,\n containerIndex: undefined,\n },\n ],\n });\n updateAnswer(answersToStore);\n };\n\n toggleCorrect = (showCorrect) => this.setState({ showCorrect });\n\n render() {\n const {\n model: {\n disabled,\n duplicateResponses,\n extraCSSRules,\n image,\n responseAreaFill,\n stimulus,\n responseCorrect,\n validation,\n teacherInstructions,\n prompt,\n autoplayAudioEnabled,\n showDashedBorder,\n mode,\n rationale,\n language,\n uiStyle = {},\n answerChoiceTransparency,\n responseContainerPadding,\n imageDropTargetPadding,\n fontSizeFactor,\n customAudioButton,\n },\n } = this.props;\n const {\n answers,\n draggingElement,\n possibleResponses,\n responseContainers,\n maxResponsePerZone,\n maxResponsePerZoneWarning,\n showCorrect,\n isValidDrop,\n } = this.state;\n const isEvaluateMode = mode === 'evaluate';\n const showToggle = isEvaluateMode && !responseCorrect;\n const { possibilityListPosition = 'bottom' } = uiStyle || {};\n const isVertical = possibilityListPosition === 'left' || possibilityListPosition === 'right';\n\n const { validResponse } = validation || {};\n const correctAnswers = [];\n const showRationale = rationale && (hasText(rationale) || hasMedia(rationale));\n const showTeacherInstructions =\n teacherInstructions && (hasText(teacherInstructions) || hasMedia(teacherInstructions));\n\n if (validResponse) {\n (validResponse.value || []).forEach((container, i) => {\n (container.images || []).forEach((v) => {\n correctAnswers.push({\n value: v,\n containerIndex: i,\n isCorrect: true,\n });\n });\n });\n }\n\n const warningMessage = translator.t('imageClozeAssociation.reachedLimit_other', {\n lng: language,\n count: maxResponsePerZone,\n });\n\n let answersToShow =\n responseCorrect !== undefined ? getAnswersCorrectness(answers, validation, duplicateResponses) : answers;\n\n if (responseCorrect === false && maxResponsePerZone === 1) {\n answersToShow = [...answersToShow, ...getUnansweredAnswers(answersToShow, validation)];\n }\n\n const sharedImageProps = {\n draggingElement,\n duplicateResponses,\n image,\n onAnswerSelect: this.handleOnAnswerSelect,\n onDragAnswerBegin: this.onDragStart,\n onDragAnswerEnd: this.onDragEnd,\n responseContainers,\n showDashedBorder,\n responseAreaFill,\n responseContainerPadding,\n imageDropTargetPadding,\n maxResponsePerZone,\n };\n\n const renderImage = () => (\n <Image\n {...sharedImageProps}\n canDrag={showCorrect && showToggle ? false : !disabled}\n answers={showCorrect && showToggle ? correctAnswers : answersToShow}\n answerChoiceTransparency={!(showCorrect && showToggle) ? answerChoiceTransparency : undefined}\n />\n );\n\n const renderPossibleResponses = () => {\n if (showCorrect && showToggle) return null;\n\n return (\n <React.Fragment>\n {maxResponsePerZoneWarning && <WarningInfo message={warningMessage} />}\n <PossibleResponses\n canDrag={!disabled}\n data={possibleResponses}\n onAnswerRemove={this.handleOnAnswerRemove}\n onDragBegin={this.onDragStart}\n answerChoiceTransparency={answerChoiceTransparency}\n customStyle={{\n minWidth: isVertical ? '130px' : image?.width || 'fit-content',\n }}\n isVertical={isVertical}\n minHeight={isVertical ? image?.height : undefined}\n />\n </React.Fragment>\n );\n };\n\n return (\n <DragProvider onDragStart={this.onDragStart} onDragEnd={this.onDragEnd}>\n <StyledUiLayout extraCSSRules={extraCSSRules} id={'main-container'} fontSizeFactor={fontSizeFactor}>\n {showTeacherInstructions && (\n <StyledTeacherInstructions\n labels={{\n hidden: 'Show Teacher Instructions',\n visible: 'Hide Teacher Instructions',\n }}\n >\n <PreviewPrompt prompt={teacherInstructions} />\n </StyledTeacherInstructions>\n )}\n\n <PreviewPrompt\n className=\"prompt\"\n prompt={prompt}\n autoplayAudioEnabled={autoplayAudioEnabled}\n customAudioButton={customAudioButton}\n />\n\n <PreviewPrompt prompt={stimulus} />\n\n <CorrectAnswerToggle\n show={showToggle}\n toggled={showCorrect}\n onToggle={this.toggleCorrect}\n language={language}\n />\n\n <InteractiveSection responseCorrect={showCorrect && showToggle ? true : responseCorrect} uiStyle={uiStyle}>\n {renderImage()}\n {renderPossibleResponses()}\n </InteractiveSection>\n\n {showRationale && (\n <StyledRationale\n labels={{\n hidden: 'Show Rationale',\n visible: 'Hide Rationale',\n }}\n >\n <PreviewPrompt prompt={rationale} />\n </StyledRationale>\n )}\n </StyledUiLayout>\n {/* Disable drop animation for valid drops to prevent visual snap-back */}\n {/* Keep default animation for invalid drops to show visual feedback */}\n <DragOverlay dropAnimation={isValidDrop ? null : undefined}>\n {this.renderDragOverlay()}\n </DragOverlay>\n </DragProvider>\n );\n }\n}\n\nconst WarningContainer = styled('div')(({ theme }) => ({\n margin: `0 ${theme.spacing(2)}`,\n backgroundColor: '#dddddd',\n padding: theme.spacing(1),\n display: 'flex',\n alignItems: 'center',\n '& svg': {\n height: '30px',\n },\n '& h1': {\n padding: '0px',\n margin: '0px',\n },\n}));\n\nconst WarningMessage = styled('span')(({ theme }) => ({\n paddingLeft: theme.spacing(0.5),\n userSelect: 'none',\n}));\n\nconst WarningInfo = ({ message }) => {\n const nodeRef = React.useRef(null);\n\n return (\n <TransitionGroup>\n <CSSTransition classNames={'fb'} key=\"fb\" timeout={300} nodeRef={nodeRef}>\n <WarningContainer ref={nodeRef} key=\"panel\">\n <NotInterestedIcon color={'secondary'} fontSize={'small'} />\n <WarningMessage dangerouslySetInnerHTML={{ __html: message }} />\n </WarningContainer>\n </CSSTransition>\n </TransitionGroup>\n );\n};\n\nWarningInfo.propTypes = {\n message: PropTypes.string,\n};\n\nImageClozeAssociationComponent.propTypes = {\n model: PropTypes.object.isRequired,\n session: PropTypes.object,\n updateAnswer: PropTypes.func.isRequired,\n};\n\nexport default ImageClozeAssociationComponent;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
10
|
+
class StaticHTMLSpan extends _react.default.PureComponent {
|
|
11
|
+
shouldComponentUpdate() {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
render() {
|
|
15
|
+
const {
|
|
16
|
+
html,
|
|
17
|
+
className
|
|
18
|
+
} = this.props;
|
|
19
|
+
return /*#__PURE__*/_react.default.createElement("span", {
|
|
20
|
+
className: className,
|
|
21
|
+
dangerouslySetInnerHTML: {
|
|
22
|
+
__html: html
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
StaticHTMLSpan.propTypes = {
|
|
28
|
+
html: _propTypes.default.string.isRequired,
|
|
29
|
+
className: _propTypes.default.string
|
|
30
|
+
};
|
|
31
|
+
StaticHTMLSpan.defaultProps = {
|
|
32
|
+
className: ''
|
|
33
|
+
};
|
|
34
|
+
var _default = exports.default = StaticHTMLSpan;
|
|
35
|
+
//# sourceMappingURL=static-html-span.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-html-span.js","names":["_react","_interopRequireDefault","require","_propTypes","StaticHTMLSpan","React","PureComponent","shouldComponentUpdate","render","html","className","props","default","createElement","dangerouslySetInnerHTML","__html","propTypes","PropTypes","string","isRequired","defaultProps","_default","exports"],"sources":["../src/static-html-span.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\n\nclass StaticHTMLSpan extends React.PureComponent {\n shouldComponentUpdate() {\n return false;\n }\n\n render() {\n const { html, className } = this.props;\n\n return (\n <span\n className={className}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n }\n}\n\nStaticHTMLSpan.propTypes = {\n html: PropTypes.string.isRequired,\n className: PropTypes.string,\n};\n\nStaticHTMLSpan.defaultProps = {\n className: '',\n};\n\nexport default StaticHTMLSpan;\n"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,UAAA,GAAAF,sBAAA,CAAAC,OAAA;AAEA,MAAME,cAAc,SAASC,cAAK,CAACC,aAAa,CAAC;EAC/CC,qBAAqBA,CAAA,EAAG;IACtB,OAAO,KAAK;EACd;EAEAC,MAAMA,CAAA,EAAG;IACP,MAAM;MAAEC,IAAI;MAAEC;IAAU,CAAC,GAAG,IAAI,CAACC,KAAK;IAEtC,oBACEX,MAAA,CAAAY,OAAA,CAAAC,aAAA;MACEH,SAAS,EAAEA,SAAU;MACrBI,uBAAuB,EAAE;QAAEC,MAAM,EAAEN;MAAK;IAAE,CAC3C,CAAC;EAEN;AACF;AAEAL,cAAc,CAACY,SAAS,GAAG;EACzBP,IAAI,EAAEQ,kBAAS,CAACC,MAAM,CAACC,UAAU;EACjCT,SAAS,EAAEO,kBAAS,CAACC;AACvB,CAAC;AAEDd,cAAc,CAACgB,YAAY,GAAG;EAC5BV,SAAS,EAAE;AACb,CAAC;AAAC,IAAAW,QAAA,GAAAC,OAAA,CAAAV,OAAA,GAEaR,cAAc","ignoreList":[]}
|