@pie-element/placement-ordering 12.3.4-next.0 → 13.0.0-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.
@@ -1,470 +1,420 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
- exports["default"] = exports.PlacementOrdering = void 0;
9
-
10
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
-
12
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
-
14
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
15
-
16
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
17
-
18
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
19
-
20
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
21
-
7
+ exports.default = exports.PlacementOrdering = void 0;
22
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
23
-
24
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
25
-
26
- var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
27
-
28
- var _tiler = require("./tiler");
29
-
30
- var _ordering = require("./ordering");
31
-
32
- var _renderUi = require("@pie-lib/render-ui");
33
-
34
- var _correctAnswerToggle = _interopRequireDefault(require("@pie-lib/correct-answer-toggle"));
35
-
36
- var _propTypes = _interopRequireDefault(require("prop-types"));
37
-
38
10
  var _react = _interopRequireDefault(require("react"));
39
-
11
+ var _reactDom = _interopRequireDefault(require("react-dom"));
12
+ var _propTypes = _interopRequireDefault(require("prop-types"));
40
13
  var _debug = _interopRequireDefault(require("debug"));
41
-
42
14
  var _uniqueId = _interopRequireDefault(require("lodash/uniqueId"));
43
-
44
- var _styles = require("@material-ui/core/styles");
45
-
46
- var _reactDom = _interopRequireDefault(require("react-dom"));
47
-
48
- var _mathRendering = require("@pie-lib/math-rendering");
49
-
50
15
  var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
51
-
52
16
  var _difference = _interopRequireDefault(require("lodash/difference"));
53
-
17
+ var _styles = require("@mui/material/styles");
18
+ var _renderUi = require("@pie-lib/render-ui");
19
+ var _mathRendering = require("@pie-lib/math-rendering");
54
20
  var _translator = _interopRequireDefault(require("@pie-lib/translator"));
55
-
21
+ var _correctAnswerToggle = _interopRequireDefault(require("@pie-lib/correct-answer-toggle"));
22
+ var _drag = require("@pie-lib/drag");
23
+ var _tiler = require("./tiler");
24
+ var _ordering = require("./ordering");
56
25
  var _utils = require("./utils");
57
-
58
- var _excluded = ["tiler", "ordering", "onDropChoice", "onRemoveChoice"];
59
-
60
- 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; }
61
-
62
- 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; }
63
-
64
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
65
-
66
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
67
-
68
- var translator = _translator["default"].translator;
69
- var log = (0, _debug["default"])('pie-elements:placement-ordering');
70
-
71
- var OrderingTiler = function OrderingTiler(props) {
72
- var Comp = props.tiler,
73
- ordering = props.ordering,
74
- _onDropChoice = props.onDropChoice,
75
- _onRemoveChoice = props.onRemoveChoice,
76
- compProps = (0, _objectWithoutProperties2["default"])(props, _excluded);
77
- return /*#__PURE__*/_react["default"].createElement(Comp, (0, _extends2["default"])({}, compProps, {
26
+ const {
27
+ translator
28
+ } = _translator.default;
29
+ const log = (0, _debug.default)('pie-elements:placement-ordering');
30
+ const PlacementOrderingContainer = (0, _styles.styled)('div')({
31
+ color: _renderUi.color.text(),
32
+ backgroundColor: _renderUi.color.background(),
33
+ display: 'flex',
34
+ flexDirection: 'column',
35
+ alignItems: 'center',
36
+ boxSizing: 'border-box'
37
+ });
38
+ const StyledPrompt = (0, _styles.styled)('div')(({
39
+ theme
40
+ }) => ({
41
+ paddingBottom: theme.spacing(1)
42
+ }));
43
+ const StyledNote = (0, _styles.styled)('div')(({
44
+ theme
45
+ }) => ({
46
+ paddingBottom: theme.spacing(2)
47
+ }));
48
+ const StyledToggle = (0, _styles.styled)(_correctAnswerToggle.default)(({
49
+ theme
50
+ }) => ({
51
+ paddingBottom: theme.spacing(1)
52
+ }));
53
+ const StyledCollapsible = (0, _styles.styled)(_renderUi.Collapsible)(({
54
+ theme
55
+ }) => ({
56
+ marginBottom: theme.spacing(2),
57
+ alignSelf: 'flex-start'
58
+ }));
59
+ const OrderingTiler = props => {
60
+ const {
61
+ tiler: Comp,
62
+ ordering,
63
+ onDropChoice,
64
+ onRemoveChoice,
65
+ ...compProps
66
+ } = props;
67
+ return /*#__PURE__*/_react.default.createElement(Comp, (0, _extends2.default)({}, compProps, {
78
68
  tiles: ordering.tiles,
79
- onDropChoice: function onDropChoice(t, s) {
80
- return _onDropChoice(t, s, ordering);
81
- },
82
- onRemoveChoice: function onRemoveChoice(t) {
83
- return _onRemoveChoice(t, ordering);
84
- }
69
+ onDropChoice: (t, s) => onDropChoice(t, s, ordering),
70
+ onRemoveChoice: t => onRemoveChoice(t, ordering)
85
71
  }));
86
72
  };
87
-
88
73
  OrderingTiler.propTypes = {
89
- tiler: _propTypes["default"].func,
90
- ordering: _propTypes["default"].any,
91
- onDropChoice: _propTypes["default"].func,
92
- onRemoveChoice: _propTypes["default"].func
74
+ tiler: _propTypes.default.func,
75
+ ordering: _propTypes.default.any,
76
+ onDropChoice: _propTypes.default.func,
77
+ onRemoveChoice: _propTypes.default.func
93
78
  };
94
-
95
- var PlacementOrdering = /*#__PURE__*/function (_React$Component) {
96
- (0, _inherits2["default"])(PlacementOrdering, _React$Component);
97
-
98
- var _super = _createSuper(PlacementOrdering);
99
-
100
- function PlacementOrdering(props) {
101
- var _this;
102
-
103
- (0, _classCallCheck2["default"])(this, PlacementOrdering);
104
- _this = _super.call(this, props);
105
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "toggleCorrect", function (showingCorrect) {
106
- return _this.setState({
107
- showingCorrect: showingCorrect
108
- });
109
- });
110
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "validateSession", function (_ref) {
111
- var model = _ref.model,
112
- session = _ref.session;
113
- var areChoicesShuffled = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
114
-
115
- var _ref2 = model || {},
116
- config = _ref2.config,
117
- choices = _ref2.choices;
118
-
119
- var _ref3 = config || {},
120
- includeTargets = _ref3.includeTargets;
121
-
122
- var choicesIds = choices.map(function (c) {
123
- return c.id;
124
- });
125
-
126
- var _ref4 = session || {},
127
- value = _ref4.value;
128
-
129
- var needsReset;
130
-
79
+ class PlacementOrdering extends _react.default.Component {
80
+ constructor(props) {
81
+ super(props);
82
+ (0, _defineProperty2.default)(this, "toggleCorrect", showingCorrect => this.setState({
83
+ showingCorrect
84
+ }));
85
+ (0, _defineProperty2.default)(this, "validateSession", ({
86
+ model,
87
+ session
88
+ }, areChoicesShuffled = false) => {
89
+ const {
90
+ config,
91
+ choices
92
+ } = model || {};
93
+ const {
94
+ includeTargets
95
+ } = config || {};
96
+ const choicesIds = choices.map(c => c.id);
97
+ let {
98
+ value
99
+ } = session || {};
100
+ let needsReset;
131
101
  if (!includeTargets) {
132
102
  // Use all choice IDs if choices were shuffled or session is missing/invalid
133
- var sessionMissing = !value || !value.length;
134
-
103
+ const sessionMissing = !value || !value.length;
135
104
  if (sessionMissing || areChoicesShuffled) {
136
105
  // if there's no value on session in No Targets Mode, we need to set an initial session
137
106
  value = choicesIds;
138
107
  } else {
139
108
  // in No Targets Mode, all choice ids need to be used
140
- var missingChoiceIds = (0, _difference["default"])(choicesIds, value); // this is the case that handles extra choice ids in session
141
-
142
- var extraChoiceIds = (0, _difference["default"])(value, choicesIds);
143
-
109
+ const missingChoiceIds = (0, _difference.default)(choicesIds, value);
110
+ // this is the case that handles extra choice ids in session
111
+ const extraChoiceIds = (0, _difference.default)(value, choicesIds);
144
112
  if (missingChoiceIds.length || extraChoiceIds.length) {
145
113
  value = choicesIds;
146
114
  }
147
115
  }
148
-
149
- needsReset = !(0, _isEqual["default"])(session.value, value);
116
+ needsReset = !(0, _isEqual.default)(session.value, value);
150
117
  } else {
151
118
  // in Targets Area selected, it's important to check the length of session
152
- var sessionIsMismatched = value && value.length !== choicesIds.length;
153
-
119
+ const sessionIsMismatched = value && value.length !== choicesIds.length;
154
120
  if (sessionIsMismatched) {
155
- needsReset = true; // if choices were added, add value in session
121
+ needsReset = true;
156
122
 
123
+ // if choices were added, add value in session
157
124
  if (value.length < choicesIds.length) {
158
125
  value = value.concat(new Array(choicesIds.length - value.length));
159
126
  } else {
160
127
  // if choices were removed, make sure to remove from session as well
161
- value = value.filter(function (cId) {
162
- return choicesIds.includes(cId);
163
- });
128
+ value = value.filter(cId => choicesIds.includes(cId));
164
129
  }
165
130
  }
166
131
  }
167
-
168
132
  if (needsReset) {
169
133
  // eslint-disable-next-line no-console
170
134
  console.warn('This session is not valid anymore. It will be reset.');
171
135
  }
172
-
173
136
  return {
174
- value: value,
175
- needsReset: needsReset
137
+ value,
138
+ needsReset
176
139
  };
177
140
  });
178
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onDropChoice", function (target, source, ordering) {
179
- var _this$props = _this.props,
180
- onSessionChange = _this$props.onSessionChange,
181
- session = _this$props.session;
182
- var from = ordering.tiles.find(function (t) {
183
- return t.id === source.id && t.type === source.type;
184
- });
185
- var to = target;
141
+ (0, _defineProperty2.default)(this, "onDropChoice", (target, source, ordering) => {
142
+ const {
143
+ onSessionChange,
144
+ session
145
+ } = this.props;
146
+ const from = ordering.tiles.find(t => t.id === source.id && t.type === source.type);
147
+ const to = target;
186
148
  log('[onDropChoice] ', from, to);
187
- var update = (0, _ordering.reducer)({
149
+ const update = (0, _ordering.reducer)({
188
150
  type: 'move',
189
- from: from,
190
- to: to
151
+ from,
152
+ to
191
153
  }, ordering);
192
- var sessionUpdate = Object.assign({}, session, {
154
+ const sessionUpdate = Object.assign({}, session, {
193
155
  value: update.response
194
156
  });
195
157
  onSessionChange(sessionUpdate);
196
158
  });
197
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onRemoveChoice", function (target, ordering) {
198
- var _this$props2 = _this.props,
199
- onSessionChange = _this$props2.onSessionChange,
200
- session = _this$props2.session;
159
+ (0, _defineProperty2.default)(this, "onRemoveChoice", (target, ordering) => {
160
+ const {
161
+ onSessionChange,
162
+ session
163
+ } = this.props;
201
164
  log('[onRemoveChoice]', target);
202
- var update = (0, _ordering.reducer)({
165
+ const update = (0, _ordering.reducer)({
203
166
  type: 'remove',
204
- target: target
167
+ target
205
168
  }, ordering);
206
- var sessionUpdate = Object.assign({}, session, {
169
+ const sessionUpdate = Object.assign({}, session, {
207
170
  value: update.response
208
171
  });
209
172
  onSessionChange(sessionUpdate);
210
173
  });
211
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "createOrdering", function () {
212
- var _this$props3 = _this.props,
213
- model = _this$props3.model,
214
- session = _this$props3.session;
215
- var showingCorrect = _this.state.showingCorrect;
216
- var config = model.config || {
174
+ (0, _defineProperty2.default)(this, "createOrdering", () => {
175
+ const {
176
+ model,
177
+ session
178
+ } = this.props;
179
+ const {
180
+ showingCorrect
181
+ } = this.state;
182
+ const config = model.config || {
217
183
  orientation: 'vertical',
218
184
  includeTargets: true
219
185
  };
220
- var includeTargets = config.includeTargets;
221
- return showingCorrect ? (0, _ordering.buildState)(model.choices, model.correctResponse, model.correctResponse.map(function (id) {
222
- return {
223
- id: id,
224
- outcome: 'correct'
225
- };
226
- }), {
227
- includeTargets: includeTargets,
186
+ const {
187
+ includeTargets
188
+ } = config;
189
+ return showingCorrect ? (0, _ordering.buildState)(model.choices, model.correctResponse, model.correctResponse.map(id => ({
190
+ id,
191
+ outcome: 'correct'
192
+ })), {
193
+ includeTargets,
228
194
  allowSameChoiceInTargets: model.config.allowSameChoiceInTargets
229
195
  }) : (0, _ordering.buildState)(model.choices, session.value, model.outcomes, {
230
- includeTargets: includeTargets,
196
+ includeTargets,
231
197
  allowSameChoiceInTargets: model.config.allowSameChoiceInTargets
232
198
  });
233
199
  });
234
- _this.instanceId = (0, _uniqueId["default"])();
235
-
236
- var _this$validateSession = _this.validateSession(props),
237
- _value = _this$validateSession.value,
238
- _needsReset = _this$validateSession.needsReset;
239
-
240
- _this.state = {
200
+ (0, _defineProperty2.default)(this, "onDragEnd", event => {
201
+ const {
202
+ over,
203
+ active
204
+ } = event;
205
+ const ordering = this.createOrdering();
206
+ if (over && active) {
207
+ const draggedItem = active.data.current;
208
+ const droppedOnItem = over.data.current;
209
+ if (draggedItem && droppedOnItem && droppedOnItem.type === 'target') {
210
+ this.onDropChoice(droppedOnItem, draggedItem, ordering);
211
+ return;
212
+ }
213
+ if (draggedItem && droppedOnItem) {
214
+ this.onDropChoice(droppedOnItem, draggedItem, ordering);
215
+ }
216
+ } else if (!over && active) {
217
+ const draggedItem = active.data.current;
218
+ if (draggedItem && draggedItem.type === 'target') {
219
+ this.onRemoveChoice(draggedItem, ordering);
220
+ }
221
+ }
222
+ });
223
+ this.instanceId = (0, _uniqueId.default)();
224
+ const {
225
+ value: _value,
226
+ needsReset: _needsReset
227
+ } = this.validateSession(props);
228
+ this.state = {
241
229
  showingCorrect: false
242
230
  };
243
-
244
- var _ref5 = props || {},
245
- _model = _ref5.model;
246
-
247
- var _ref6 = _model || {},
248
- env = _ref6.env;
249
-
250
- var _ref7 = env || {},
251
- mode = _ref7.mode;
252
-
231
+ const {
232
+ model: _model
233
+ } = props || {};
234
+ const {
235
+ env
236
+ } = _model || {};
237
+ const {
238
+ mode
239
+ } = env || {};
253
240
  if (_needsReset && mode === 'gather') {
254
- _this.props.onSessionChange(_objectSpread(_objectSpread({}, props.session), {}, {
241
+ this.props.onSessionChange({
242
+ ...props.session,
255
243
  value: _value
256
- }));
244
+ });
257
245
  }
258
-
259
- return _this;
260
246
  }
247
+ componentDidUpdate() {
248
+ //eslint-disable-next-line
249
+ const domNode = _reactDom.default.findDOMNode(this);
250
+ (0, _mathRendering.renderMath)(domNode);
251
+ }
252
+ UNSAFE_componentWillReceiveProps(nextProps) {
253
+ const {
254
+ model: nextModel = {}
255
+ } = nextProps || {};
256
+ const {
257
+ model: currentModel = {}
258
+ } = this.props || {};
259
+ const {
260
+ correctResponse,
261
+ config,
262
+ choices: nextChoices = [],
263
+ env
264
+ } = nextModel;
265
+ const {
266
+ includeTargets
267
+ } = config || {};
268
+ const newState = {};
269
+ const isLanguageChanged = currentModel.language && currentModel.language !== nextModel.language;
270
+ const isDefaultNote = currentModel.note && currentModel.note === translator.t('common:commonCorrectAnswerWithAlternates', {
271
+ lng: currentModel.language
272
+ });
261
273
 
262
- (0, _createClass2["default"])(PlacementOrdering, [{
263
- key: "componentDidUpdate",
264
- value: function componentDidUpdate() {
265
- //eslint-disable-next-line
266
- var domNode = _reactDom["default"].findDOMNode(this);
267
-
268
- (0, _mathRendering.renderMath)(domNode);
269
- }
270
- }, {
271
- key: "UNSAFE_componentWillReceiveProps",
272
- value: function UNSAFE_componentWillReceiveProps(nextProps) {
273
- var _currentModel$config,
274
- _this2 = this;
275
-
276
- var _ref8 = nextProps || {},
277
- _ref8$model = _ref8.model,
278
- nextModel = _ref8$model === void 0 ? {} : _ref8$model;
279
-
280
- var _ref9 = this.props || {},
281
- _ref9$model = _ref9.model,
282
- currentModel = _ref9$model === void 0 ? {} : _ref9$model;
283
-
284
- var correctResponse = nextModel.correctResponse,
285
- config = nextModel.config,
286
- _nextModel$choices = nextModel.choices,
287
- nextChoices = _nextModel$choices === void 0 ? [] : _nextModel$choices,
288
- env = nextModel.env;
289
-
290
- var _ref10 = config || {},
291
- includeTargets = _ref10.includeTargets;
292
-
293
- var newState = {};
294
- var isLanguageChanged = currentModel.language && currentModel.language !== nextModel.language;
295
- var isDefaultNote = currentModel.note && currentModel.note === translator.t('common:commonCorrectAnswerWithAlternates', {
296
- lng: currentModel.language
297
- }); // check if the note is the default one for prev language and change to the default one for new language
298
- // this check is necessary in order to diferanciate between default and authour defined note
299
- // and only change between languages for default ones
300
-
301
- if (isLanguageChanged && isDefaultNote) {
302
- currentModel.note = translator.t('common:commonCorrectAnswerWithAlternates', {
303
- lng: nextModel.language
304
- });
305
- }
306
-
307
- if (!correctResponse) {
308
- newState.showingCorrect = false;
309
- } //PD-4924
310
- // show student choices same order as in model when teacher changes student choices order
311
- // for cases when student view and instructor view are on same page
312
-
313
-
314
- var areChoicesShuffled = (0, _utils.haveSameValuesButDifferentOrder)(nextChoices, currentModel.choices);
315
- var validatedSession = this.validateSession(nextProps, areChoicesShuffled);
316
- var value = validatedSession.value,
317
- needsReset = validatedSession.needsReset;
318
-
319
- var newSession = _objectSpread(_objectSpread({}, nextProps.session), {}, {
320
- value: value
321
- });
322
-
323
- var includeTargetsChanged = ((_currentModel$config = currentModel.config) === null || _currentModel$config === void 0 ? void 0 : _currentModel$config.includeTargets) !== includeTargets;
324
-
325
- if (includeTargets && includeTargetsChanged) {
326
- needsReset = true;
327
- delete newSession.value;
328
- }
329
-
330
- this.setState(newState, function () {
331
- var _ref11 = env || {},
332
- mode = _ref11.mode;
333
-
334
- if (needsReset && mode === 'gather') {
335
- _this2.props.onSessionChange(newSession);
336
- }
274
+ // check if the note is the default one for prev language and change to the default one for new language
275
+ // this check is necessary in order to diferanciate between default and authour defined note
276
+ // and only change between languages for default ones
277
+ if (isLanguageChanged && isDefaultNote) {
278
+ currentModel.note = translator.t('common:commonCorrectAnswerWithAlternates', {
279
+ lng: nextModel.language
337
280
  });
338
281
  }
339
- }, {
340
- key: "render",
341
- value: function render() {
342
- var _this$props4 = this.props,
343
- classes = _this$props4.classes,
344
- model = _this$props4.model;
345
- var correctResponse = model.correctResponse,
346
- correctness = model.correctness,
347
- extraCSSRules = model.extraCSSRules,
348
- prompt = model.prompt,
349
- rationale = model.rationale,
350
- feedback = model.feedback,
351
- configs = model.config,
352
- note = model.note,
353
- showNote = model.showNote,
354
- env = model.env,
355
- disabled = model.disabled,
356
- teacherInstructions = model.teacherInstructions,
357
- language = model.language;
358
- var showToggle = correctResponse && correctResponse.length > 0;
359
- var showingCorrect = this.state.showingCorrect;
360
- var config = configs || {
361
- orientation: 'vertical',
362
- includeTargets: true
363
- };
364
- var orientation = config.orientation,
365
- includeTargets = config.includeTargets;
366
- var vertical = orientation === 'vertical';
367
- var ordering = this.createOrdering();
368
-
369
- var _ref12 = env || {},
370
- mode = _ref12.mode,
371
- role = _ref12.role;
372
-
373
- var Tiler = vertical ? _tiler.VerticalTiler : _tiler.HorizontalTiler;
374
- var displayNote = (showingCorrect || mode === 'view' && role === 'instructor') && showNote && note;
375
- var showRationale = rationale && ((0, _renderUi.hasText)(rationale) || (0, _renderUi.hasMedia)(rationale));
376
- var showTeacherInstructions = teacherInstructions && ((0, _renderUi.hasText)(teacherInstructions) || (0, _renderUi.hasMedia)(teacherInstructions));
377
- return /*#__PURE__*/_react["default"].createElement(_renderUi.UiLayout, {
378
- extraCSSRules: extraCSSRules,
379
- className: classes.placementOrdering
380
- }, showTeacherInstructions && /*#__PURE__*/_react["default"].createElement(_renderUi.Collapsible, {
381
- labels: {
382
- hidden: 'Show Teacher Instructions',
383
- visible: 'Hide Teacher Instructions'
384
- },
385
- className: classes.collapsible
386
- }, /*#__PURE__*/_react["default"].createElement(_renderUi.PreviewPrompt, {
387
- prompt: teacherInstructions
388
- })), /*#__PURE__*/_react["default"].createElement("div", {
389
- className: classes.prompt
390
- }, /*#__PURE__*/_react["default"].createElement(_renderUi.PreviewPrompt, {
391
- prompt: prompt
392
- })), /*#__PURE__*/_react["default"].createElement(_correctAnswerToggle["default"], {
393
- className: classes.toggle,
394
- show: showToggle,
395
- toggled: showingCorrect,
396
- onToggle: this.toggleCorrect,
397
- language: language
398
- }), /*#__PURE__*/_react["default"].createElement(OrderingTiler, {
399
- instanceId: this.instanceId,
400
- choiceLabel: config.choiceLabel,
401
- targetLabel: config.targetLabel,
402
- ordering: ordering,
403
- tiler: Tiler,
404
- disabled: disabled,
405
- addGuide: config.showOrdering,
406
- tileSize: config.tileSize,
407
- includeTargets: includeTargets,
408
- choiceLabelEnabled: model.config && model.config.choiceLabelEnabled,
409
- onDropChoice: this.onDropChoice,
410
- onRemoveChoice: this.onRemoveChoice
411
- }), displayNote && /*#__PURE__*/_react["default"].createElement("div", {
412
- className: classes.note,
413
- dangerouslySetInnerHTML: {
414
- __html: note
415
- }
416
- }), showRationale && /*#__PURE__*/_react["default"].createElement(_renderUi.Collapsible, {
417
- labels: {
418
- hidden: 'Show Rationale',
419
- visible: 'Hide Rationale'
420
- },
421
- className: classes.collapsible
422
- }, /*#__PURE__*/_react["default"].createElement(_renderUi.PreviewPrompt, {
423
- prompt: rationale
424
- })), !showingCorrect && /*#__PURE__*/_react["default"].createElement(_renderUi.Feedback, {
425
- correctness: correctness,
426
- feedback: feedback
427
- }));
282
+ if (!correctResponse) {
283
+ newState.showingCorrect = false;
428
284
  }
429
- }]);
430
- return PlacementOrdering;
431
- }(_react["default"].Component);
432
-
433
- exports.PlacementOrdering = PlacementOrdering;
434
- (0, _defineProperty2["default"])(PlacementOrdering, "propTypes", {
435
- onSessionChange: _propTypes["default"].func.isRequired,
436
- model: _propTypes["default"].object.isRequired,
437
- session: _propTypes["default"].oneOfType([_propTypes["default"].array.isRequired, _propTypes["default"].object.isRequired]),
438
- classes: _propTypes["default"].object.isRequired
439
- });
440
285
 
441
- var styles = function styles(theme) {
442
- return {
443
- placementOrdering: {
286
+ //PD-4924
287
+ // show student choices same order as in model when teacher changes student choices order
288
+ // for cases when student view and instructor view are on same page
289
+ const areChoicesShuffled = (0, _utils.haveSameValuesButDifferentOrder)(nextChoices, currentModel.choices);
290
+ const validatedSession = this.validateSession(nextProps, areChoicesShuffled);
291
+ let {
292
+ value,
293
+ needsReset
294
+ } = validatedSession;
295
+ const newSession = {
296
+ ...nextProps.session,
297
+ value
298
+ };
299
+ const includeTargetsChanged = currentModel.config?.includeTargets !== includeTargets;
300
+ if (includeTargets && includeTargetsChanged) {
301
+ needsReset = true;
302
+ delete newSession.value;
303
+ }
304
+ this.setState(newState, () => {
305
+ const {
306
+ mode
307
+ } = env || {};
308
+ if (needsReset && mode === 'gather') {
309
+ this.props.onSessionChange(newSession);
310
+ }
311
+ });
312
+ }
313
+ render() {
314
+ const {
315
+ model
316
+ } = this.props;
317
+ const {
318
+ correctResponse,
319
+ correctness,
320
+ extraCSSRules,
321
+ prompt,
322
+ rationale,
323
+ feedback,
324
+ config: configs,
325
+ note,
326
+ showNote,
327
+ env,
328
+ disabled,
329
+ teacherInstructions,
330
+ language
331
+ } = model;
332
+ const showToggle = correctResponse && correctResponse.length > 0;
333
+ const {
334
+ showingCorrect
335
+ } = this.state;
336
+ const config = configs || {
337
+ orientation: 'vertical',
338
+ includeTargets: true
339
+ };
340
+ const {
341
+ orientation,
342
+ includeTargets
343
+ } = config;
344
+ const vertical = orientation === 'vertical';
345
+ const ordering = this.createOrdering();
346
+ const {
347
+ mode,
348
+ role
349
+ } = env || {};
350
+ const Tiler = vertical ? _tiler.VerticalTiler : _tiler.HorizontalTiler;
351
+ const displayNote = (showingCorrect || mode === 'view' && role === 'instructor') && showNote && note;
352
+ const showRationale = rationale && ((0, _renderUi.hasText)(rationale) || (0, _renderUi.hasMedia)(rationale));
353
+ const showTeacherInstructions = teacherInstructions && ((0, _renderUi.hasText)(teacherInstructions) || (0, _renderUi.hasMedia)(teacherInstructions));
354
+ const containerStyle = {
444
355
  color: _renderUi.color.text(),
445
356
  backgroundColor: _renderUi.color.background(),
446
357
  display: 'flex',
447
358
  flexDirection: 'column',
448
359
  alignItems: 'center',
449
360
  boxSizing: 'border-box'
450
- },
451
- prompt: {
452
- paddingBottom: theme.spacing.unit
453
- },
454
- toggle: {
455
- paddingBottom: theme.spacing.unit
456
- },
457
- note: {
458
- paddingBottom: theme.spacing.unit * 2
459
- },
460
- collapsible: {
461
- marginBottom: theme.spacing.unit * 2,
462
- alignSelf: 'flex-start'
463
- }
464
- };
465
- };
466
-
467
- var _default = (0, _styles.withStyles)(styles)(PlacementOrdering);
468
-
469
- exports["default"] = _default;
361
+ };
362
+ return /*#__PURE__*/_react.default.createElement(_drag.DragProvider, {
363
+ onDragStart: () => {},
364
+ onDragEnd: this.onDragEnd
365
+ }, /*#__PURE__*/_react.default.createElement(PlacementOrderingContainer, null, /*#__PURE__*/_react.default.createElement(_renderUi.UiLayout, {
366
+ extraCSSRules: extraCSSRules,
367
+ style: containerStyle
368
+ }, showTeacherInstructions && /*#__PURE__*/_react.default.createElement(StyledCollapsible, {
369
+ labels: {
370
+ hidden: 'Show Teacher Instructions',
371
+ visible: 'Hide Teacher Instructions'
372
+ },
373
+ className: "collapsible"
374
+ }, /*#__PURE__*/_react.default.createElement(_renderUi.PreviewPrompt, {
375
+ prompt: teacherInstructions
376
+ })), /*#__PURE__*/_react.default.createElement(StyledPrompt, null, /*#__PURE__*/_react.default.createElement(_renderUi.PreviewPrompt, {
377
+ prompt: prompt
378
+ })), /*#__PURE__*/_react.default.createElement(StyledToggle, {
379
+ className: "toggle",
380
+ show: showToggle,
381
+ toggled: showingCorrect,
382
+ onToggle: this.toggleCorrect,
383
+ language: language
384
+ }), /*#__PURE__*/_react.default.createElement(OrderingTiler, {
385
+ instanceId: this.instanceId,
386
+ choiceLabel: config.choiceLabel,
387
+ targetLabel: config.targetLabel,
388
+ ordering: ordering,
389
+ tiler: Tiler,
390
+ disabled: disabled,
391
+ addGuide: config.showOrdering,
392
+ tileSize: config.tileSize,
393
+ includeTargets: includeTargets,
394
+ choiceLabelEnabled: model.config && model.config.choiceLabelEnabled
395
+ }), displayNote && /*#__PURE__*/_react.default.createElement(StyledNote, {
396
+ dangerouslySetInnerHTML: {
397
+ __html: note
398
+ }
399
+ }), showRationale && /*#__PURE__*/_react.default.createElement(StyledCollapsible, {
400
+ labels: {
401
+ hidden: 'Show Rationale',
402
+ visible: 'Hide Rationale'
403
+ },
404
+ className: "collapsible"
405
+ }, /*#__PURE__*/_react.default.createElement(_renderUi.PreviewPrompt, {
406
+ prompt: rationale
407
+ })), !showingCorrect && /*#__PURE__*/_react.default.createElement(_renderUi.Feedback, {
408
+ correctness: correctness,
409
+ feedback: feedback
410
+ }))));
411
+ }
412
+ }
413
+ exports.PlacementOrdering = PlacementOrdering;
414
+ (0, _defineProperty2.default)(PlacementOrdering, "propTypes", {
415
+ onSessionChange: _propTypes.default.func.isRequired,
416
+ model: _propTypes.default.object.isRequired,
417
+ session: _propTypes.default.oneOfType([_propTypes.default.array.isRequired, _propTypes.default.object.isRequired])
418
+ });
419
+ var _default = exports.default = PlacementOrdering;
470
420
  //# sourceMappingURL=placement-ordering.js.map