@instructure/quiz-core 22.1.0 → 22.2.1

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.
Files changed (45) hide show
  1. package/es/banks/components/AddBankEntryModal/presenter.js +4 -1
  2. package/es/banks/components/BankEntry/presenter.js +110 -12
  3. package/es/banks/components/BankEntryRow/presenter.js +52 -8
  4. package/es/building/components/resources/DeleteStimulusModal/presenter.js +13 -7
  5. package/es/common/components/layout/sidebar/Stimulus/Collection/presenter.js +2 -2
  6. package/es/common/components/layout/sidebar/Stimulus/presenter.js +9 -6
  7. package/es/common/components/resources/stimulus/Stimulus/presenter.js +2 -2
  8. package/es/common/components/resources/stimulus/StimulusEdit/presenter.js +11 -10
  9. package/es/common/components/resources/stimulus/StimulusEditInfo/presenter.js +5 -5
  10. package/es/common/components/resources/stimulus/StimulusShow/index.js +1 -1
  11. package/es/common/components/resources/stimulus/StimulusShowInfo/index.js +1 -1
  12. package/es/common/components/shared/InteractionTypes/presenter.js +3 -2
  13. package/es/common/components/shared/drag_and_drop/dragAndDropUtils.js +7 -0
  14. package/es/common/records/BankEntry.js +9 -1
  15. package/es/common/records/QuizEntry.js +1 -1
  16. package/es/common/reducers/modifications.js +21 -12
  17. package/es/common/util/warningHelpers.js +13 -3
  18. package/es/moderating/components/resources/EventDetails.js +3 -3
  19. package/es/moderating/components/resources/SessionBreachAlert.js +1 -1
  20. package/es/moderating/components/resources/util/checkIsBreach.js +1 -1
  21. package/es/moderating/components/resources/util/extractSessionData.js +7 -3
  22. package/es/moderating/components/sidebar/ModerateTray/presenter.js +5 -5
  23. package/lib/banks/components/AddBankEntryModal/presenter.js +4 -1
  24. package/lib/banks/components/BankEntry/presenter.js +110 -12
  25. package/lib/banks/components/BankEntryRow/presenter.js +52 -8
  26. package/lib/building/components/resources/DeleteStimulusModal/presenter.js +13 -7
  27. package/lib/common/components/layout/sidebar/Stimulus/Collection/presenter.js +2 -2
  28. package/lib/common/components/layout/sidebar/Stimulus/presenter.js +9 -6
  29. package/lib/common/components/resources/stimulus/Stimulus/presenter.js +2 -2
  30. package/lib/common/components/resources/stimulus/StimulusEdit/presenter.js +11 -10
  31. package/lib/common/components/resources/stimulus/StimulusEditInfo/presenter.js +5 -5
  32. package/lib/common/components/resources/stimulus/StimulusShow/index.js +1 -1
  33. package/lib/common/components/resources/stimulus/StimulusShowInfo/index.js +1 -1
  34. package/lib/common/components/shared/InteractionTypes/presenter.js +3 -2
  35. package/lib/common/components/shared/drag_and_drop/dragAndDropUtils.js +7 -0
  36. package/lib/common/records/BankEntry.js +9 -1
  37. package/lib/common/records/QuizEntry.js +1 -1
  38. package/lib/common/reducers/modifications.js +21 -12
  39. package/lib/common/util/warningHelpers.js +13 -3
  40. package/lib/moderating/components/resources/EventDetails.js +3 -3
  41. package/lib/moderating/components/resources/SessionBreachAlert.js +1 -1
  42. package/lib/moderating/components/resources/util/checkIsBreach.js +1 -1
  43. package/lib/moderating/components/resources/util/extractSessionData.js +7 -3
  44. package/lib/moderating/components/sidebar/ModerateTray/presenter.js +5 -5
  45. package/package.json +9 -9
@@ -74,7 +74,15 @@ var BankEntry = exports.BankEntry = /*#__PURE__*/function (_ReduxRecord) {
74
74
  }, {
75
75
  key: "isStimulus",
76
76
  get: function get() {
77
- return this.entryType === 'Stimulus';
77
+ var _this$getEntry;
78
+ return this.entryType === 'Stimulus' && !((_this$getEntry = this.getEntry()) !== null && _this$getEntry !== void 0 && _this$getEntry.isPassage);
79
+ }
80
+ }, {
81
+ key: "isPassage",
82
+ get: function get() {
83
+ var _this$getEntry2;
84
+ if (!this.isStimulus) return false;
85
+ return (_this$getEntry2 = this.getEntry()) === null || _this$getEntry2 === void 0 ? void 0 : _this$getEntry2.isPassage;
78
86
  }
79
87
  }]);
80
88
  }((0, _reduxRecord["default"])({
@@ -376,7 +376,7 @@ var QuizEntry = exports.QuizEntry = (_dec = (0, _withStateCache["default"])(func
376
376
  var type;
377
377
  if (this.hasStimulus || this.isBank) {
378
378
  if (this.isPassage) {
379
- type = (0, _formatMessage["default"])('Passage');
379
+ type = (0, _formatMessage["default"])('Text Block');
380
380
  var opts = {
381
381
  type: type,
382
382
  start: displayPosition - 1
@@ -144,19 +144,28 @@ var _default = exports["default"] = function _default() {
144
144
  entryType: action.payload.bankEntryType
145
145
  };
146
146
  var stateWithBankEntryMods = updateObjectOfType(stateWithBankMods, _quizCommon.TEMPORARY_BANK_ENTRY_ID, bankEntryMods, 'bankEntries');
147
- var bankItemMods = action.payload.bankEntryType === 'Item' ? {
148
- interactionData: action.payload.interactionTypeData.interactionData,
149
- interactionType: action.payload.interactionTypeData.id,
150
- itemBody: action.payload.interactionTypeData.itemBody,
151
- properties: action.payload.interactionTypeData.properties,
152
- scoringData: action.payload.interactionTypeData.scoringData,
153
- title: null
154
- } : {
155
- title: ''
156
- };
147
+ var bankItemMods;
148
+ if (action.payload.bankEntryType === 'Item') {
149
+ bankItemMods = {
150
+ interactionData: action.payload.interactionTypeData.interactionData,
151
+ interactionType: action.payload.interactionTypeData.id,
152
+ itemBody: action.payload.interactionTypeData.itemBody,
153
+ properties: action.payload.interactionTypeData.properties,
154
+ scoringData: action.payload.interactionTypeData.scoringData,
155
+ title: null
156
+ };
157
+ } else {
158
+ var isPassage = action.payload.interactionTypeData.passage;
159
+ bankItemMods = isPassage ? {
160
+ title: '',
161
+ passage: true,
162
+ orientation: 'top'
163
+ } : {
164
+ title: ''
165
+ };
166
+ }
157
167
  var collection = action.payload.bankEntryType === 'Item' ? 'items' : 'stimuli';
158
- var stateWithMods = updateObjectOfType(stateWithBankEntryMods, tempId, bankItemMods, collection);
159
- return stateWithMods;
168
+ return updateObjectOfType(stateWithBankEntryMods, tempId, bankItemMods, collection);
160
169
  }();
161
170
  case _quizCommon.CLEAR_NEXT_QUIZ_ENTRY:
162
171
  return state["delete"]('nextQuizEntry');
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.propsForStimulusVersioningWrapper = exports.propsForStimulusBankEntryEditPrompt = exports.propsForItemVersioningWrapper = exports.propsForItemBankEntryEditPrompt = exports.propsForBankEntryVersioningWrapper = exports.propsForBankEntryUnauthorizedEdit = exports.propsForBankEntryEditPrompt = void 0;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
8
9
  var _react = _interopRequireDefault(require("react"));
9
10
  var _partial = _interopRequireDefault(require("lodash/partial"));
10
11
  var _uiText = require("@instructure/ui-text");
@@ -52,11 +53,20 @@ var propsForStimulusVersioningWrapper = exports.propsForStimulusVersioningWrappe
52
53
  for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
53
54
  args[_key2] = arguments[_key2];
54
55
  }
56
+ var isPassage = args[args.length - 1];
57
+ var restArgs = args.slice(0, -1);
58
+ var itemName = isPassage ? 'text block' : 'stimulus';
59
+ var title = (0, _formatMessage["default"])('Some students have already submitted answers for this {itemName}!', {
60
+ itemName: itemName
61
+ });
62
+ var content = (0, _formatMessage["default"])('You can apply your edits to a copy of this {itemName}' + ' which will only be seen by students that have not taken the assessment.' + ' Attached questions will be copied as well.', {
63
+ itemName: itemName
64
+ });
55
65
  return propsForVersioningWrapper.apply(void 0, [/*#__PURE__*/_react["default"].createElement(_uiText.Text, {
56
66
  color: "primary"
57
67
  }, /*#__PURE__*/_react["default"].createElement("b", null, (0, _formatMessage["default"])('Editing a copy.')), "\xA0", (0, _formatMessage["default"])('Statistics from this new copy will appear separate from the previous version.')), /*#__PURE__*/_react["default"].createElement(_uiText.Text, {
58
68
  color: "primary"
59
- }, /*#__PURE__*/_react["default"].createElement("b", null, (0, _formatMessage["default"])('Some students have already submitted answers for this stimulus!')), "\xA0", (0, _formatMessage["default"])('You can apply your edits to a copy of this stimulus' + ' which will only be seen by students that have not taken the assessment.' + ' Attached questions will be copied as well.'))].concat(args));
69
+ }, /*#__PURE__*/_react["default"].createElement("b", null, title), "\xA0", content)].concat((0, _toConsumableArray2["default"])(restArgs)));
60
70
  };
61
71
  var propsForBankEntryVersioningWrapper = exports.propsForBankEntryVersioningWrapper = function propsForBankEntryVersioningWrapper() {
62
72
  for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
@@ -91,8 +101,8 @@ var propsForItemBankEntryEditPrompt = exports.propsForItemBankEntryEditPrompt =
91
101
  };
92
102
  var propsForStimulusBankEntryEditPrompt = exports.propsForStimulusBankEntryEditPrompt = function propsForStimulusBankEntryEditPrompt() {
93
103
  var isPassage = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
94
- var title = isPassage ? (0, _formatMessage["default"])('Banked Passage.') : (0, _formatMessage["default"])('Banked Stimulus.');
95
- var content = isPassage ? (0, _formatMessage["default"])('Editing of this passage must take place within the bank.') : (0, _formatMessage["default"])('Editing of this stimulus must take place within the bank.');
104
+ var title = isPassage ? (0, _formatMessage["default"])('Banked Text Block.') : (0, _formatMessage["default"])('Banked Stimulus.');
105
+ var content = isPassage ? (0, _formatMessage["default"])('Editing of this text block must take place within the bank.') : (0, _formatMessage["default"])('Editing of this stimulus must take place within the bank.');
96
106
  var promptComponent = /*#__PURE__*/_react["default"].createElement(_uiView.View, {
97
107
  as: "div",
98
108
  "data-automation": "sdk-editInBanks-warning"
@@ -37,13 +37,13 @@ var EventDetails = exports.EventDetails = function EventDetails(_ref) {
37
37
  id: "system-details-attribute"
38
38
  }, (0, _formatMessage["default"])('Attribute')), /*#__PURE__*/_react["default"].createElement(_uiTable.Table.ColHeader, {
39
39
  id: "system-details-value"
40
- }, (0, _formatMessage["default"])('Value')))), /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Body, null, /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Row, null, /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Cell, null, (0, _formatMessage["default"])('Client IP address')), /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Cell, null, /*#__PURE__*/_react["default"].createElement(_uiText.Text, {
40
+ }, (0, _formatMessage["default"])('Value')))), /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Body, null, currentEventData.ipAddress && /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Row, null, /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Cell, null, (0, _formatMessage["default"])('Client IP address')), /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Cell, null, /*#__PURE__*/_react["default"].createElement(_uiText.Text, {
41
41
  color: validationErrors.ipAddress ? 'danger' : 'primary'
42
42
  }, currentEventData.ipAddress), validationErrors.ipAddress && renderTooltip(validationErrors.ipAddress))), /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Row, null, /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Cell, null, (0, _formatMessage["default"])('Browser session ID')), /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Cell, null, /*#__PURE__*/_react["default"].createElement(_uiText.Text, {
43
43
  color: validationErrors.browserSessionID ? 'danger' : 'primary'
44
- }, currentEventData.browserSessionID), validationErrors.browserSessionID && renderTooltip(validationErrors.browserSessionID))), /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Row, null, /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Cell, null, (0, _formatMessage["default"])('Browser')), /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Cell, null, /*#__PURE__*/_react["default"].createElement(_uiText.Text, {
44
+ }, currentEventData.browserSessionID), validationErrors.browserSessionID && renderTooltip(validationErrors.browserSessionID))), currentEventData.browserString && /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Row, null, /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Cell, null, (0, _formatMessage["default"])('Browser')), /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Cell, null, /*#__PURE__*/_react["default"].createElement(_uiText.Text, {
45
45
  color: validationErrors.browserString ? 'danger' : 'primary'
46
- }, currentEventData.browserString), validationErrors.browserString && renderTooltip(validationErrors.browserString))), /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Row, null, /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Cell, null, (0, _formatMessage["default"])('Operating System')), /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Cell, null, /*#__PURE__*/_react["default"].createElement(_uiText.Text, {
46
+ }, currentEventData.browserString), renderTooltip(validationErrors.browserString))), currentEventData.userPlatform && /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Row, null, /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Cell, null, (0, _formatMessage["default"])('Operating System')), /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Cell, null, /*#__PURE__*/_react["default"].createElement(_uiText.Text, {
47
47
  color: validationErrors.userPlatform ? 'danger' : 'primary'
48
48
  }, currentEventData.userPlatform), validationErrors.userPlatform && renderTooltip(validationErrors.userPlatform))), answerValue && /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Row, null, /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Cell, null, (0, _formatMessage["default"])('Answer value')), /*#__PURE__*/_react["default"].createElement(_uiTable.Table.Cell, null, answerValue)))));
49
49
  };
@@ -12,5 +12,5 @@ var SessionBreachAlert = exports.SessionBreachAlert = function SessionBreachAler
12
12
  return /*#__PURE__*/_react["default"].createElement(_uiAlerts.Alert, {
13
13
  variant: "warning",
14
14
  margin: "small"
15
- }, (0, _formatMessage["default"])('Potential breach: This Quiz appears to have been accessed from multiple devices or browsers.'), /*#__PURE__*/_react["default"].createElement("br", null), (0, _formatMessage["default"])('Review the activity log and take appropriate action.'));
15
+ }, (0, _formatMessage["default"])('This Quiz appears to have been accessed from multiple devices or browsers.'), /*#__PURE__*/_react["default"].createElement("br", null), (0, _formatMessage["default"])('Review the activity log and take appropriate action.'));
16
16
  };
@@ -26,7 +26,7 @@ var checkIsBreach = exports.checkIsBreach = function checkIsBreach(firstEventDat
26
26
  checks.forEach(function (_ref) {
27
27
  var key = _ref.key,
28
28
  message = _ref.message;
29
- if (currentEventData[key] !== firstEventData[key]) {
29
+ if (currentEventData[key] && currentEventData[key] !== firstEventData[key]) {
30
30
  result.isBreach = true;
31
31
  result[key] = message;
32
32
  }
@@ -16,12 +16,16 @@ var extractSessionData = exports.extractSessionData = function extractSessionDat
16
16
  userPlatform: ''
17
17
  };
18
18
  var clientTimestamp = sourceData.getIn(['eventData', 'clientTimestamp']);
19
- var userPlatform = _platform["default"].parse(sourceData.getIn(['eventData', 'userAgent']));
19
+ var userAgent = sourceData.getIn(['eventData', 'userAgent']);
20
+ var userPlatform = null;
21
+ if (userAgent) {
22
+ userPlatform = _platform["default"].parse(userAgent);
23
+ }
20
24
  return {
21
25
  ipAddress: sourceData.getIn(['eventData', 'ipAddress']),
22
26
  browserSessionID: sourceData.getIn(['eventData', 'browserSessionId']),
23
27
  eventDate: clientTimestamp ? (0, _quizI18n.formatDateTimeSeconds)(clientTimestamp) : '',
24
- browserString: "".concat(userPlatform.name, " ").concat(userPlatform.version),
25
- userPlatform: userPlatform.os.toString()
28
+ browserString: userPlatform ? "".concat(userPlatform.name, " ").concat(userPlatform.version) : null,
29
+ userPlatform: userPlatform ? userPlatform.os.toString() : null
26
30
  };
27
31
  };
@@ -229,14 +229,14 @@ var ModerateTray = exports.ModerateTray = /*#__PURE__*/function (_Component) {
229
229
  as: "div",
230
230
  direction: "column",
231
231
  height: "100vh"
232
- }, this.renderTitleAndCloseButton(), this.props.atteqApplyChangesToCurrentQuizAttemptsEnabled && /*#__PURE__*/_react["default"].createElement(_quizCommon.Flex.Item, {
232
+ }, this.renderTitleAndCloseButton(), this.props.atteqApplyChangesToCurrentQuizAttemptsEnabled && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_quizCommon.Flex.Item, {
233
233
  padding: "medium medium 0 medium"
234
234
  }, this.renderNameWithTooltip()), /*#__PURE__*/_react["default"].createElement(_quizCommon.Flex.Item, {
235
- padding: "medium"
236
- }, (0, _formatMessage["default"])('These settings apply to current and all future attempts.')), /*#__PURE__*/_react["default"].createElement(_quizCommon.Flex.Item, {
235
+ padding: "medium medium 0"
236
+ }, (0, _formatMessage["default"])('These settings apply to current and all future attempts.'))), /*#__PURE__*/_react["default"].createElement(_quizCommon.Flex.Item, {
237
237
  shouldGrow: true,
238
- padding: "0 medium"
239
- }, this.renderChildren()), this.props.atteqApplyChangesToCurrentQuizAttemptsEnabled && /*#__PURE__*/_react["default"].createElement(_quizCommon.Flex.Item, null, this.renderFooter())));
238
+ padding: "medium medium 0"
239
+ }, this.renderChildren()), /*#__PURE__*/_react["default"].createElement(_quizCommon.Flex.Item, null, this.renderFooter())));
240
240
  }
241
241
  }]);
242
242
  }(_react.Component);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instructure/quiz-core",
3
- "version": "22.1.0",
3
+ "version": "22.2.1",
4
4
  "license": "MIT",
5
5
  "description": "The Quiz React SDK by Instructure Inc.",
6
6
  "author": "Instructure, Inc. Engineering and Product Design",
@@ -111,12 +111,12 @@
111
111
  "store": "^1.3.20",
112
112
  "striptags": "^2.0.0",
113
113
  "uuid": "^3.2.1",
114
- "@instructure/quiz-common": "22.1.0",
115
- "@instructure/quiz-i18n": "22.1.0",
116
- "@instructure/quiz-interactions": "22.1.0",
117
- "@instructure/quiz-rce": "22.1.0",
118
- "@instructure/quiz-number-input": "22.1.0",
119
- "instructure-validations": "22.1.0"
114
+ "@instructure/quiz-i18n": "22.2.1",
115
+ "@instructure/quiz-common": "22.2.1",
116
+ "@instructure/quiz-interactions": "22.2.1",
117
+ "@instructure/quiz-number-input": "22.2.1",
118
+ "@instructure/quiz-rce": "22.2.1",
119
+ "instructure-validations": "22.2.1"
120
120
  },
121
121
  "devDependencies": {
122
122
  "@instructure/ui-axe-check": "10.14.0",
@@ -144,8 +144,8 @@
144
144
  "request": "^2.74.0",
145
145
  "sinon": "^6.1.3",
146
146
  "sinon-chai": "^3.3.0",
147
- "quiz-presets": "22.1.0",
148
- "@instructure/quiz-scripts": "21.0.0"
147
+ "@instructure/quiz-scripts": "21.0.0",
148
+ "quiz-presets": "22.2.1"
149
149
  },
150
150
  "peerDependencies": {
151
151
  "react": "^15 || ^16"