@instructure/quiz-core 20.20.1-snapshot.3 → 20.20.1-snapshot.34

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 (36) hide show
  1. package/CHANGELOG.md +115 -0
  2. package/es/banks/components/AddToBankModal/presenter.js +10 -11
  3. package/es/building/components/resources/ActionButtons/presenter.js +3 -2
  4. package/es/building/components/resources/quiz/instructions/Edit/presenter.js +5 -5
  5. package/es/building/components/resources/quizEntry/QuizEntryEdit/presenter.js +5 -7
  6. package/es/common/components/layout/sidebar/Sidebar/index.js +5 -3
  7. package/es/common/components/layout/sidebar/SidebarItem/presenter.js +5 -2
  8. package/es/common/components/layout/sidebar/Stimulus/presenter.js +3 -1
  9. package/es/common/components/resources/quiz/AddContent/Button/index.js +2 -0
  10. package/es/common/components/resources/stimulus/StimulusEdit/presenter.js +5 -7
  11. package/es/common/components/shared/overlay/index.js +3 -1
  12. package/es/common/kinesis/StreamQueue.js +8 -2
  13. package/es/common/util/clickHandlers.js +19 -0
  14. package/es/moderating/components/resources/AccommodationsModal/ReduceAnswerChoicesSettings/index.js +78 -0
  15. package/es/moderating/components/resources/ModerateTableRow/presenter.js +0 -3
  16. package/es/moderating/components/sidebar/ModerateTray/presenter.js +2 -1
  17. package/es/moderating/components/sidebar/ResetQuiz/index.js +15 -8
  18. package/es/moderating/components/sidebar/ResetQuiz/presenter.js +20 -4
  19. package/lib/banks/components/AddToBankModal/presenter.js +9 -10
  20. package/lib/building/components/resources/ActionButtons/presenter.js +2 -1
  21. package/lib/building/components/resources/quiz/instructions/Edit/presenter.js +5 -5
  22. package/lib/building/components/resources/quizEntry/QuizEntryEdit/presenter.js +5 -7
  23. package/lib/common/components/layout/sidebar/Sidebar/index.js +4 -2
  24. package/lib/common/components/layout/sidebar/SidebarItem/presenter.js +5 -2
  25. package/lib/common/components/layout/sidebar/Stimulus/presenter.js +3 -1
  26. package/lib/common/components/resources/quiz/AddContent/Button/index.js +2 -0
  27. package/lib/common/components/resources/stimulus/StimulusEdit/presenter.js +5 -7
  28. package/lib/common/components/shared/overlay/index.js +3 -1
  29. package/lib/common/kinesis/StreamQueue.js +8 -2
  30. package/lib/common/util/clickHandlers.js +26 -0
  31. package/lib/moderating/components/resources/AccommodationsModal/ReduceAnswerChoicesSettings/index.js +88 -0
  32. package/lib/moderating/components/resources/ModerateTableRow/presenter.js +0 -3
  33. package/lib/moderating/components/sidebar/ModerateTray/presenter.js +2 -1
  34. package/lib/moderating/components/sidebar/ResetQuiz/index.js +15 -8
  35. package/lib/moderating/components/sidebar/ResetQuiz/presenter.js +20 -4
  36. package/package.json +10 -10
@@ -9,6 +9,8 @@ import PropTypes from 'prop-types';
9
9
  import t from '@instructure/quiz-i18n/es/format-message';
10
10
  import { Button } from '@instructure/ui-buttons';
11
11
  import { Heading } from '@instructure/ui-heading';
12
+ import { Tooltip } from '@instructure/ui-tooltip';
13
+ import { AccessibleContent } from '@instructure/ui-a11y-content';
12
14
  export var ResetQuiz = /*#__PURE__*/function (_Component) {
13
15
  _inherits(ResetQuiz, _Component);
14
16
  var _super = _createSuper(ResetQuiz);
@@ -57,18 +59,31 @@ export var ResetQuiz = /*#__PURE__*/function (_Component) {
57
59
  key: "render",
58
60
  value: function render() {
59
61
  if (!this.props.reopenOn) return null;
60
- if (!this.props.sessionId) {
62
+ var _this$props = this.props,
63
+ reopenOverride = _this$props.reopenOverride,
64
+ sessionId = _this$props.sessionId;
65
+ if (!sessionId) {
61
66
  return /*#__PURE__*/React.createElement("span", null, t('No attempts have been recorded yet.'));
62
67
  }
63
- return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Heading, {
68
+ var reOpen = /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Heading, {
64
69
  level: "h3"
65
70
  }, t('Manage current attempt')), this.props.reopenOn ? /*#__PURE__*/React.createElement(Button, {
66
71
  ref: this.reopenButtonRef,
67
72
  onClick: this.reopenQuizSession,
68
- disabled: !this.props.isComplete,
73
+ disabled: !this.props.isComplete || reopenOverride,
69
74
  margin: "small none",
70
75
  "data-automation": "sdk-reopen-quiz-button"
71
76
  }, t('Reopen')) : null);
77
+ if (reopenOverride) {
78
+ var text = t('One Question at Time Quizzes with Backtracking disabled cannot be reopened.');
79
+ return /*#__PURE__*/React.createElement(AccessibleContent, {
80
+ alt: text
81
+ }, /*#__PURE__*/React.createElement(Tooltip, {
82
+ renderTip: text,
83
+ placement: "start"
84
+ }, reOpen));
85
+ }
86
+ return reOpen;
72
87
  }
73
88
  }]);
74
89
  ResetQuiz.displayName = "ResetQuiz";
@@ -81,6 +96,7 @@ ResetQuiz.propTypes = {
81
96
  reopenQuizSession: PropTypes.func.isRequired,
82
97
  reopenOn: PropTypes.bool.isRequired,
83
98
  screenreaderNotification: PropTypes.func.isRequired,
84
- withConfirm: PropTypes.func.isRequired
99
+ withConfirm: PropTypes.func.isRequired,
100
+ reopenOverride: PropTypes.bool.isRequired
85
101
  };
86
102
  export default ResetQuiz;
@@ -30,19 +30,16 @@ var _uiFlex = require("@instructure/ui-flex");
30
30
  var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
31
31
  var _quizCommon = require("@instructure/quiz-common");
32
32
  var _featureCheck = require("../../../common/util/featureCheck.js");
33
- var _ref2 = /*#__PURE__*/_react.default.createElement(_uiIcons.IconCheckLine, {
34
- color: "success"
35
- });
36
- var _ref3 = /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
33
+ var _ref2 = /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
37
34
  padding: "0 small 0 0"
38
35
  }, /*#__PURE__*/_react.default.createElement(_uiIcons.IconNoLine, {
39
36
  color: "error",
40
37
  size: "small"
41
38
  }));
42
- var _ref4 = /*#__PURE__*/_react.default.createElement(_uiIcons.IconWarningLine, {
39
+ var _ref3 = /*#__PURE__*/_react.default.createElement(_uiIcons.IconWarningLine, {
43
40
  color: "warning"
44
41
  });
45
- var _ref5 = /*#__PURE__*/_react.default.createElement("br", null);
42
+ var _ref4 = /*#__PURE__*/_react.default.createElement("br", null);
46
43
  var AddToBankModal = /*#__PURE__*/function (_Component) {
47
44
  (0, _inherits2.default)(AddToBankModal, _Component);
48
45
  var _super = (0, _createSuper2.default)(AddToBankModal);
@@ -219,9 +216,11 @@ var AddToBankModal = /*#__PURE__*/function (_Component) {
219
216
  renderTitle: (0, _formatMessage.default)('Checking content shareability...')
220
217
  }), "\xA0", (0, _formatMessage.default)('Validating content...'));
221
218
  } else if (this.state.contentShareable === 'true') {
222
- content = /*#__PURE__*/_react.default.createElement(_uiText.Text, null, _ref2, "\xA0", (0, _formatMessage.default)('Good to go!'));
219
+ // No message needed. The API call to check shareability is very fast in most cases,
220
+ // so the user may be distracted by a message here.
221
+ content = null;
223
222
  } else if (this.state.contentShareable === 'false') {
224
- content = /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, null, _ref3, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
223
+ content = /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, null, _ref2, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
225
224
  shouldShrink: true
226
225
  }, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
227
226
  color: "danger"
@@ -229,7 +228,7 @@ var AddToBankModal = /*#__PURE__*/function (_Component) {
229
228
  } else {
230
229
  content = /*#__PURE__*/_react.default.createElement(_uiText.Text, {
231
230
  color: "warning"
232
- }, _ref4, "\xA0", (0, _formatMessage.default)('There was an error attempting to validate shareability.'));
231
+ }, _ref3, "\xA0", (0, _formatMessage.default)('There was an error attempting to validate shareability.'));
233
232
  }
234
233
  return /*#__PURE__*/_react.default.createElement(_uiView.View, {
235
234
  as: "div",
@@ -251,7 +250,7 @@ var AddToBankModal = /*#__PURE__*/function (_Component) {
251
250
  }), /*#__PURE__*/_react.default.createElement(_uiRadioInput.RadioInput, {
252
251
  value: "new",
253
252
  label: (0, _formatMessage.default)('New item bank')
254
- })), _ref5, this.renderBankTypeContent(), this.renderContentShareabilityMessage());
253
+ })), _ref4, this.renderBankTypeContent(), this.renderContentShareabilityMessage());
255
254
  }
256
255
  }, {
257
256
  key: "render",
@@ -78,8 +78,9 @@ var ActionButtons = (_dec = (0, _emotion.withStyle)(_styles.default, _theme.defa
78
78
  key: "render",
79
79
  value: function render() {
80
80
  var hideClass = !this.props.shouldRenderEdit ? 'hide' : '';
81
+ var parentDivClass = "buttons ".concat(_quizCommon.END_EDITING_TRIGGER_CLASSNAME);
81
82
  return (0, _emotion.jsx)("div", {
82
- className: "buttons",
83
+ className: parentDivClass,
83
84
  tabIndex: "-1",
84
85
  onFocus: this.onButtonFocus,
85
86
  css: this.props.styles.buttons
@@ -15,7 +15,7 @@ var _uiButtons = require("@instructure/ui-buttons");
15
15
  var _emotion = require("@instructure/emotion");
16
16
  var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
17
17
  var _CustomPropTypes = _interopRequireDefault(require("../../../../../../common/util/CustomPropTypes.js"));
18
- var _ElementsForSelectors = _interopRequireDefault(require("../../../../../../common/util/ElementsForSelectors.js"));
18
+ var _clickHandlers = require("../../../../../../common/util/clickHandlers.js");
19
19
  var _quizCommon = require("@instructure/quiz-common");
20
20
  var _quizRce = require("@instructure/quiz-rce");
21
21
  var _styles = _interopRequireDefault(require("./styles.js"));
@@ -44,10 +44,10 @@ var QuizInstructionsEdit = (_dec = (0, _emotion.withStyle)(_styles.default, _the
44
44
  }, {
45
45
  key: "ignoreClickOutsideIf",
46
46
  value: function ignoreClickOutsideIf(e) {
47
- var appNodes = (0, _ElementsForSelectors.default)(this.props.appContainer);
48
- return appNodes.every(function (node) {
49
- return node && !node.contains(e.target);
50
- });
47
+ var _checkClickedNode = (0, _clickHandlers.checkClickedNode)(e, this.props.appContainer),
48
+ isEndEditingTrigger = _checkClickedNode.isEndEditingTrigger,
49
+ outsideApp = _checkClickedNode.outsideApp;
50
+ return outsideApp || !isEndEditingTrigger;
51
51
  }
52
52
  }, {
53
53
  key: "render",
@@ -21,10 +21,10 @@ var _first = _interopRequireDefault(require("lodash/first"));
21
21
  var _emotion = require("@instructure/emotion");
22
22
  var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
23
23
  var _CustomPropTypes = _interopRequireDefault(require("../../../../../common/util/CustomPropTypes.js"));
24
- var _ElementsForSelectors = _interopRequireDefault(require("../../../../../common/util/ElementsForSelectors.js"));
25
24
  var _index = _interopRequireDefault(require("../../../../../banks/components/AddToBankModal/index.js"));
26
25
  var _index2 = _interopRequireDefault(require("../../../../../common/components/shared/drag_and_drop/DragAndDropZone/index.js"));
27
26
  var _componentWithOutsideClickEmotion = _interopRequireDefault(require("../../../../../common/components/shared/functionality/componentWithOutsideClickEmotion.js"));
27
+ var _clickHandlers = require("../../../../../common/util/clickHandlers.js");
28
28
  var _index3 = _interopRequireDefault(require("./Header/index.js"));
29
29
  var _index4 = _interopRequireDefault(require("./Footer/index.js"));
30
30
  var _quizCommon = require("@instructure/quiz-common");
@@ -302,12 +302,10 @@ var QuizEntryEdit = (_dec = (0, _emotion.withStyle)(_styles.default, _theme.defa
302
302
  }, {
303
303
  key: "ignoreClickOutsideIf",
304
304
  value: function ignoreClickOutsideIf(e) {
305
- // Need to iterate over the appNodes since Gauge and lti have a different index for the sdk node
306
- var appNodes = (0, _ElementsForSelectors.default)(this.props.appContainer);
307
- var outsideApp = appNodes.every(function (node) {
308
- return node && !node.contains(e.target);
309
- });
310
- return this.props.isOccluded || outsideApp;
305
+ var _checkClickedNode = (0, _clickHandlers.checkClickedNode)(e, this.props.appContainer),
306
+ isEndEditingTrigger = _checkClickedNode.isEndEditingTrigger,
307
+ outsideApp = _checkClickedNode.outsideApp;
308
+ return this.props.isOccluded || outsideApp || !isEndEditingTrigger;
311
309
  }
312
310
  }, {
313
311
  key: "isValid",
@@ -112,7 +112,8 @@ var Sidebar = (_dec = (0, _emotion.withStyle)(_styles.default, _theme.default),
112
112
  return;
113
113
  }
114
114
  return (0, _emotion.jsx)("div", {
115
- css: this.props.styles.sidebar.actionableInfo
115
+ css: this.props.styles.sidebar.actionableInfo,
116
+ className: _quizCommon.END_EDITING_TRIGGER_CLASSNAME
116
117
  }, (0, _emotion.jsx)(_uiLink.Link, {
117
118
  href: "#",
118
119
  margin: "small",
@@ -134,7 +135,8 @@ var Sidebar = (_dec = (0, _emotion.withStyle)(_styles.default, _theme.default),
134
135
  return;
135
136
  }
136
137
  return (0, _emotion.jsx)("div", {
137
- css: this.props.styles.sidebar.actionableInfo
138
+ css: this.props.styles.sidebar.actionableInfo,
139
+ className: _quizCommon.END_EDITING_TRIGGER_CLASSNAME
138
140
  }, (0, _emotion.jsx)(_uiLink.Link, {
139
141
  href: "#",
140
142
  margin: "small",
@@ -21,6 +21,7 @@ var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/f
21
21
  var _quizRce = require("@instructure/quiz-rce");
22
22
  var _styles = _interopRequireDefault(require("./styles.js"));
23
23
  var _theme = _interopRequireDefault(require("./theme.js"));
24
+ var _quizCommon = require("@instructure/quiz-common");
24
25
  var _dec, _class, _SidebarItem;
25
26
  /** @jsx jsx */
26
27
  var SidebarItem = (_dec = (0, _emotion.withStyle)(_styles.default, _theme.default), _dec(_class = (_SidebarItem = /*#__PURE__*/function (_Component) {
@@ -117,7 +118,8 @@ var SidebarItem = (_dec = (0, _emotion.withStyle)(_styles.default, _theme.defaul
117
118
  key: "renderClosed",
118
119
  value: function renderClosed() {
119
120
  return (0, _emotion.jsx)("div", {
120
- css: this.props.styles.sidebarItem
121
+ css: this.props.styles.sidebarItem,
122
+ className: _quizCommon.END_EDITING_TRIGGER_CLASSNAME
121
123
  }, this.renderButton());
122
124
  }
123
125
  }, {
@@ -128,8 +130,9 @@ var SidebarItem = (_dec = (0, _emotion.withStyle)(_styles.default, _theme.defaul
128
130
  itemName = _this$props3.itemName,
129
131
  pointsPossible = _this$props3.pointsPossible,
130
132
  styles = _this$props3.styles;
133
+ var parentDivClass = "sidebarIsOpen ".concat(_quizCommon.END_EDITING_TRIGGER_CLASSNAME);
131
134
  return (0, _emotion.jsx)("div", {
132
- className: "sidebarIsOpen",
135
+ className: parentDivClass,
133
136
  css: styles.sidebarItem
134
137
  }, (0, _emotion.jsx)(_uiFlex.Flex, {
135
138
  justifyItems: "space-between"
@@ -23,6 +23,7 @@ var _index3 = _interopRequireDefault(require("./Summary/index.js"));
23
23
  var _styles = _interopRequireDefault(require("./styles.js"));
24
24
  var _theme = _interopRequireDefault(require("./theme.js"));
25
25
  var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
26
+ var _quizCommon = require("@instructure/quiz-common");
26
27
  var _dec, _class, _SidebarStimulus;
27
28
  /** @jsx jsx */
28
29
  var DISPLAY_AS_SUMMARY_LIMIT = 5;
@@ -90,7 +91,8 @@ var SidebarStimulus = (_dec = (0, _emotion.withStyle)(_styles.default, _theme.de
90
91
  margin: "small",
91
92
  forceButtonRole: false,
92
93
  onClick: this.scrollToItem,
93
- renderIcon: _ref
94
+ renderIcon: _ref,
95
+ className: _quizCommon.END_EDITING_TRIGGER_CLASSNAME
94
96
  }, (0, _emotion.jsx)(_uiA11yContent.ScreenReaderContent, null, (0, _formatMessage.default)('Navigate to stimulus at position { displayPosition }', {
95
97
  displayPosition: displayPosition
96
98
  })));
@@ -18,6 +18,7 @@ var _emotion = require("@instructure/emotion");
18
18
  var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
19
19
  var _styles = _interopRequireDefault(require("./styles.js"));
20
20
  var _theme = _interopRequireDefault(require("./theme.js"));
21
+ var _quizCommon = require("@instructure/quiz-common");
21
22
  var _dec, _class, _AddContentButton;
22
23
  /** @jsx jsx */
23
24
  var AddContentButton = (_dec = (0, _emotion.withStyle)(_styles.default, _theme.default), _dec(_class = (_AddContentButton = /*#__PURE__*/function (_Component) {
@@ -67,6 +68,7 @@ var AddContentButton = (_dec = (0, _emotion.withStyle)(_styles.default, _theme.d
67
68
  key: "renderNonStimulus",
68
69
  value: function renderNonStimulus() {
69
70
  return (0, _emotion.jsx)("div", {
71
+ className: _quizCommon.END_EDITING_TRIGGER_CLASSNAME,
70
72
  css: this.props.styles.newItemButtonHolder
71
73
  }, (0, _emotion.jsx)("button", {
72
74
  ref: this.storeButtonElemRef,
@@ -26,7 +26,7 @@ var _index = _interopRequireDefault(require("../../../../../banks/components/Add
26
26
  var _index2 = _interopRequireDefault(require("../../../../../building/components/resources/AddToBankOptions/index.js"));
27
27
  var _index3 = _interopRequireDefault(require("../../WarningWrapper/index.js"));
28
28
  var _CustomPropTypes = _interopRequireDefault(require("../../../../../common/util/CustomPropTypes.js"));
29
- var _ElementsForSelectors = _interopRequireDefault(require("../../../../../common/util/ElementsForSelectors.js"));
29
+ var _clickHandlers = require("../../../../../common/util/clickHandlers.js");
30
30
  var _index4 = _interopRequireDefault(require("../StimulusShowInfo/index.js"));
31
31
  var _index5 = _interopRequireDefault(require("../StimulusEditInfo/index.js"));
32
32
  var _componentWithOutsideClickEmotion = _interopRequireDefault(require("../../../shared/functionality/componentWithOutsideClickEmotion.js"));
@@ -293,12 +293,10 @@ var StimulusEdit = (_dec = (0, _emotion.withStyle)(_styles.default, _theme.defau
293
293
  }, {
294
294
  key: "ignoreClickOutsideIf",
295
295
  value: function ignoreClickOutsideIf(e) {
296
- // Need to iterate over the appNodes since Gauge and lti have a different index for the sdk node
297
- var appNodes = (0, _ElementsForSelectors.default)(this.props.appContainer);
298
- var outsideApp = appNodes.every(function (node) {
299
- return node && !node.contains(e.target);
300
- });
301
- return outsideApp;
296
+ var _checkClickedNode = (0, _clickHandlers.checkClickedNode)(e, this.props.appContainer),
297
+ isEndEditingTrigger = _checkClickedNode.isEndEditingTrigger,
298
+ outsideApp = _checkClickedNode.outsideApp;
299
+ return outsideApp || !isEndEditingTrigger;
302
300
  }
303
301
  }, {
304
302
  key: "afterSubmit",
@@ -15,6 +15,7 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
15
15
  var _emotion = require("@instructure/emotion");
16
16
  var _styles = _interopRequireDefault(require("./styles.js"));
17
17
  var _theme = _interopRequireDefault(require("./theme.js"));
18
+ var _quizCommon = require("@instructure/quiz-common");
18
19
  var _dec, _class, _Overlay;
19
20
  /** @jsx jsx */
20
21
  /* eslint "jsx-a11y/click-events-have-key-events": "warn" */
@@ -37,9 +38,10 @@ var Overlay = (_dec = (0, _emotion.withStyle)(_styles.default, _theme.default),
37
38
  if (this.props.hideOverlay) {
38
39
  return null;
39
40
  }
41
+ var overlayClass = "overlay ".concat(_quizCommon.END_EDITING_TRIGGER_CLASSNAME);
40
42
  return (0, _emotion.jsx)("div", {
41
43
  role: "presentation",
42
- className: "overlay",
44
+ className: overlayClass,
43
45
  css: this.props.styles.overlay,
44
46
  onClick: this.props.onClick,
45
47
  "data-automation": "sdk-overlay"
@@ -12,6 +12,8 @@ var ERROR_STATE = 'error';
12
12
  var WAITING_STATE = 'waiting';
13
13
  var SENDING_STATE = 'sending';
14
14
  var SENT_STATE = 'sent';
15
+ var REACHED_MAX_FAILURES = 'reached_max_failures';
16
+ var MAX_FAILED_ATTEMPTS = 3;
15
17
  var StreamQueue = /*#__PURE__*/function () {
16
18
  function StreamQueue(_ref) {
17
19
  var config = _ref.config,
@@ -27,7 +29,7 @@ var StreamQueue = /*#__PURE__*/function () {
27
29
  accessKeyId: kinesis.config.credentials.accessKeyId,
28
30
  secretAccessKey: kinesis.config.credentials.secretAccessKey,
29
31
  sessionToken: kinesis.config.credentials.sessionToken,
30
- region: kinesis.config.client_configuration.region,
32
+ region: kinesis.config.region,
31
33
  service: 'execute-api'
32
34
  });
33
35
  this._addPage();
@@ -122,9 +124,13 @@ var StreamQueue = /*#__PURE__*/function () {
122
124
  _this.kinesis.putRecords(params, function (err, data) {
123
125
  if (err) {
124
126
  _this.pageQueue[i].status = ERROR_STATE;
127
+ _this.pageQueue[i].errorCount = (_this.pageQueue[i].errorCount || 0) + 1;
125
128
  // eslint-disable-next-line no-console
126
129
  console.error("KINESIS STREAM ".concat(_this.config.stream, " ERROR: "), err);
127
- _this._sendRecordsViaProxy(params);
130
+ if (_this.pageQueue[i].errorCount >= MAX_FAILED_ATTEMPTS) {
131
+ _this.pageQueue[i].status = REACHED_MAX_FAILURES;
132
+ _this._sendRecordsViaProxy(params);
133
+ }
128
134
  } else {
129
135
  _this.pageQueue[i].status = SENT_STATE;
130
136
  // eslint-disable-next-line no-console
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.checkClickedNode = checkClickedNode;
8
+ var _ElementsForSelectors = _interopRequireDefault(require("./ElementsForSelectors.js"));
9
+ var _quizCommon = require("@instructure/quiz-common");
10
+ function checkClickedNode(e, appContainer) {
11
+ // Need to iterate over the appNodes since Gauge and lti have a different index for the sdk node
12
+ var appNodes = (0, _ElementsForSelectors.default)(appContainer);
13
+ var outsideApp = appNodes.every(function (node) {
14
+ return node && !node.contains(e.target);
15
+ });
16
+
17
+ // checking if the click was on an element that should end editing
18
+ var endEditingNodes = (0, _ElementsForSelectors.default)(".".concat(_quizCommon.END_EDITING_TRIGGER_CLASSNAME));
19
+ var isEndEditingTrigger = endEditingNodes.some(function (node) {
20
+ return node && node.contains(e.target);
21
+ });
22
+ return {
23
+ isEndEditingTrigger: isEndEditingTrigger,
24
+ outsideApp: outsideApp
25
+ };
26
+ }
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = exports.ReduceAnswerChoicesSettings = void 0;
9
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
10
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
12
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
13
+ var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
14
+ var _react = _interopRequireWildcard(require("react"));
15
+ var _propTypes = _interopRequireDefault(require("prop-types"));
16
+ var _uiCheckbox = require("@instructure/ui-checkbox");
17
+ var _uiButtons = require("@instructure/ui-buttons");
18
+ var _uiIcons = require("@instructure/ui-icons");
19
+ var _uiTooltip = require("@instructure/ui-tooltip");
20
+ var _uiView = require("@instructure/ui-view");
21
+ var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
22
+ var ReduceAnswerChoicesSettings = /*#__PURE__*/function (_Component) {
23
+ (0, _inherits2.default)(ReduceAnswerChoicesSettings, _Component);
24
+ var _super = (0, _createSuper2.default)(ReduceAnswerChoicesSettings);
25
+ function ReduceAnswerChoicesSettings() {
26
+ var _this;
27
+ (0, _classCallCheck2.default)(this, ReduceAnswerChoicesSettings);
28
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
29
+ args[_key] = arguments[_key];
30
+ }
31
+ _this = _super.call.apply(_super, [this].concat(args));
32
+ _this.onChangeReduceChoices = function () {
33
+ var update = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, _this.props.courseAccommodationSettings), {}, {
34
+ reduceChoicesEnabled: !_this.props.courseAccommodationSettings.reduceChoicesEnabled
35
+ });
36
+ _this.props.onChange(update);
37
+ };
38
+ _this.renderSettingLabel = function (label, tooltip) {
39
+ return /*#__PURE__*/_react.default.createElement("span", null, label, /*#__PURE__*/_react.default.createElement(_uiTooltip.Tooltip, {
40
+ color: "primary-inverse",
41
+ renderTip: tooltip,
42
+ placement: "bottom",
43
+ on: ['click', 'hover', 'focus']
44
+ }, /*#__PURE__*/_react.default.createElement(_uiButtons.IconButton, {
45
+ renderIcon: _uiIcons.IconInfoLine,
46
+ color: "secondary",
47
+ size: "small",
48
+ shape: "circle",
49
+ withBackground: false,
50
+ withBorder: false,
51
+ interaction: "readonly",
52
+ screenReaderLabel: tooltip
53
+ })));
54
+ };
55
+ return _this;
56
+ }
57
+ (0, _createClass2.default)(ReduceAnswerChoicesSettings, [{
58
+ key: "render",
59
+ value: function render() {
60
+ return /*#__PURE__*/_react.default.createElement(_uiView.View, {
61
+ display: "block",
62
+ margin: "medium none"
63
+ }, /*#__PURE__*/_react.default.createElement(_uiCheckbox.Checkbox, {
64
+ variant: "toggle",
65
+ checked: this.props.courseAccommodationSettings.reduceChoicesEnabled || false,
66
+ label: this.renderSettingLabel((0, _formatMessage.default)('Reduced answer choices'), (0, _formatMessage.default)('Removes one incorrect answer from all multiple-choice questions that have 4 or more answer choices.')),
67
+ onChange: this.onChangeReduceChoices,
68
+ value: "reduce_choices_enabled"
69
+ }));
70
+ }
71
+ }]);
72
+ ReduceAnswerChoicesSettings.displayName = "ReduceAnswerChoicesSettings";
73
+ return ReduceAnswerChoicesSettings;
74
+ }(_react.Component);
75
+ exports.ReduceAnswerChoicesSettings = ReduceAnswerChoicesSettings;
76
+ ReduceAnswerChoicesSettings.propTypes = {
77
+ courseAccommodationSettings: _propTypes.default.shape({
78
+ reduceChoicesEnabled: _propTypes.default.bool
79
+ }).isRequired,
80
+ onChange: _propTypes.default.func.isRequired
81
+ };
82
+ ReduceAnswerChoicesSettings.defaultProps = {
83
+ courseAccommodationSettings: {
84
+ reduceChoicesEnabled: false
85
+ }
86
+ };
87
+ var _default = ReduceAnswerChoicesSettings;
88
+ exports.default = _default;
@@ -268,9 +268,6 @@ var ModerateTableRow = (_dec = (0, _emotion.withStyle)(_styles.default, _theme.d
268
268
  }, (0, _formatMessage.default)('{ name }: { value }', elem)));
269
269
  }));
270
270
  }
271
-
272
- // Display the Accommodations and the button in a flex container with reverse order
273
- // so that the screen reader will read the accommodations first, and then the button
274
271
  return (0, _emotion.jsx)(_uiTable.Table.Cell, {
275
272
  "data-automation": "sdk-moderate-accommodations-text"
276
273
  }, displayContent);
@@ -22,6 +22,7 @@ var _uiTruncateText = require("@instructure/ui-truncate-text");
22
22
  var _uiModal = require("@instructure/ui-modal");
23
23
  var _quizCommon = require("@instructure/quiz-common");
24
24
  var _uiA11yContent = require("@instructure/ui-a11y-content");
25
+ var _featureCheck = require("../../../../common/util/featureCheck.js");
25
26
  var ModerateTray = /*#__PURE__*/function (_Component) {
26
27
  (0, _inherits2.default)(ModerateTray, _Component);
27
28
  var _super = (0, _createSuper2.default)(ModerateTray);
@@ -158,7 +159,7 @@ var ModerateTray = /*#__PURE__*/function (_Component) {
158
159
  }, this.renderTitleAndCloseButton()), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
159
160
  shouldGrow: true,
160
161
  padding: "0 medium"
161
- }, this.renderChildren()), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, null, this.renderFooter())));
162
+ }, this.renderChildren()), (0, _featureCheck.featureOn)('add_time_to_existing_quiz_sessions') && /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, null, this.renderFooter())));
162
163
  }
163
164
  }]);
164
165
  ModerateTray.displayName = "ModerateTray";
@@ -15,20 +15,27 @@ var _quizSessions = require("../../../api/quizSessions.js");
15
15
  var _quizSessions2 = require("../../../../common/selectors/quizSessions.js");
16
16
  function mapStateToProps(state) {
17
17
  var quizSessionIds = state.getIn(['moderation', 'selectedSessions']);
18
- var sessions = (0, _quizSessions2.getQuizSessionsByIds)(state, quizSessionIds).filter(function (qs) {
18
+ var quizSessions = (0, _quizSessions2.getQuizSessionsByIds)(state, quizSessionIds).filter(function (qs) {
19
19
  return qs.isLoaded() && !qs.pending();
20
20
  }).sort(function (qs1, qs2) {
21
21
  return qs2.id - qs1.id;
22
22
  });
23
- var sessionId, session;
24
- if (sessions.size > 0) {
25
- session = sessions.get(0);
26
- sessionId = session.id;
23
+ var quizSessionId,
24
+ quizSession,
25
+ reopenOverride = false;
26
+ if (quizSessions.size > 0) {
27
+ quizSession = quizSessions.get(0);
28
+ var _ref = [quizSession.allowBacktracking, quizSession.isOneQuestionAtATime()],
29
+ allowBacktracking = _ref[0],
30
+ isOneQuestionAtATime = _ref[1];
31
+ quizSessionId = quizSession.id;
32
+ reopenOverride = !allowBacktracking && isOneQuestionAtATime;
27
33
  }
28
34
  return {
29
- sessionId: sessionId || null,
30
- isComplete: session ? !(session.inProgress() || session.reopeningGraded()) : false,
31
- reopenOn: (0, _featureCheck.featureOn)('reopen_session')
35
+ sessionId: quizSessionId || null,
36
+ isComplete: quizSession ? !(quizSession.inProgress() || quizSession.reopeningGraded()) : false,
37
+ reopenOn: (0, _featureCheck.featureOn)('reopen_session'),
38
+ reopenOverride: reopenOverride
32
39
  };
33
40
  }
34
41
  var _default = (0, _reactRedux.connect)(mapStateToProps, {
@@ -17,6 +17,8 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
17
17
  var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
18
18
  var _uiButtons = require("@instructure/ui-buttons");
19
19
  var _uiHeading = require("@instructure/ui-heading");
20
+ var _uiTooltip = require("@instructure/ui-tooltip");
21
+ var _uiA11yContent = require("@instructure/ui-a11y-content");
20
22
  var ResetQuiz = /*#__PURE__*/function (_Component) {
21
23
  (0, _inherits2.default)(ResetQuiz, _Component);
22
24
  var _super = (0, _createSuper2.default)(ResetQuiz);
@@ -65,18 +67,31 @@ var ResetQuiz = /*#__PURE__*/function (_Component) {
65
67
  key: "render",
66
68
  value: function render() {
67
69
  if (!this.props.reopenOn) return null;
68
- if (!this.props.sessionId) {
70
+ var _this$props = this.props,
71
+ reopenOverride = _this$props.reopenOverride,
72
+ sessionId = _this$props.sessionId;
73
+ if (!sessionId) {
69
74
  return /*#__PURE__*/_react.default.createElement("span", null, (0, _formatMessage.default)('No attempts have been recorded yet.'));
70
75
  }
71
- return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
76
+ var reOpen = /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
72
77
  level: "h3"
73
78
  }, (0, _formatMessage.default)('Manage current attempt')), this.props.reopenOn ? /*#__PURE__*/_react.default.createElement(_uiButtons.Button, {
74
79
  ref: this.reopenButtonRef,
75
80
  onClick: this.reopenQuizSession,
76
- disabled: !this.props.isComplete,
81
+ disabled: !this.props.isComplete || reopenOverride,
77
82
  margin: "small none",
78
83
  "data-automation": "sdk-reopen-quiz-button"
79
84
  }, (0, _formatMessage.default)('Reopen')) : null);
85
+ if (reopenOverride) {
86
+ var text = (0, _formatMessage.default)('One Question at Time Quizzes with Backtracking disabled cannot be reopened.');
87
+ return /*#__PURE__*/_react.default.createElement(_uiA11yContent.AccessibleContent, {
88
+ alt: text
89
+ }, /*#__PURE__*/_react.default.createElement(_uiTooltip.Tooltip, {
90
+ renderTip: text,
91
+ placement: "start"
92
+ }, reOpen));
93
+ }
94
+ return reOpen;
80
95
  }
81
96
  }]);
82
97
  ResetQuiz.displayName = "ResetQuiz";
@@ -90,7 +105,8 @@ ResetQuiz.propTypes = {
90
105
  reopenQuizSession: _propTypes.default.func.isRequired,
91
106
  reopenOn: _propTypes.default.bool.isRequired,
92
107
  screenreaderNotification: _propTypes.default.func.isRequired,
93
- withConfirm: _propTypes.default.func.isRequired
108
+ withConfirm: _propTypes.default.func.isRequired,
109
+ reopenOverride: _propTypes.default.bool.isRequired
94
110
  };
95
111
  var _default = ResetQuiz;
96
112
  exports.default = _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instructure/quiz-core",
3
- "version": "20.20.1-snapshot.3+5e4f10e06",
3
+ "version": "20.20.1-snapshot.34+5767d10b6",
4
4
  "license": "MIT",
5
5
  "description": "The Quiz React SDK by Instructure Inc.",
6
6
  "author": "Instructure, Inc. Engineering and Product Design",
@@ -44,11 +44,11 @@
44
44
  "@instructure/emotion": "^8.51.0",
45
45
  "@instructure/grading-utils": "^1.0.0",
46
46
  "@instructure/outcomes-ui": "^3.2.2",
47
- "@instructure/quiz-common": "20.20.1-snapshot.3+5e4f10e06",
48
- "@instructure/quiz-i18n": "20.20.1-snapshot.3+5e4f10e06",
49
- "@instructure/quiz-interactions": "20.20.1-snapshot.3+5e4f10e06",
50
- "@instructure/quiz-number-input": "20.20.1-snapshot.3+5e4f10e06",
51
- "@instructure/quiz-rce": "20.20.1-snapshot.3+5e4f10e06",
47
+ "@instructure/quiz-common": "20.20.1-snapshot.34+5767d10b6",
48
+ "@instructure/quiz-i18n": "20.20.1-snapshot.34+5767d10b6",
49
+ "@instructure/quiz-interactions": "20.20.1-snapshot.34+5767d10b6",
50
+ "@instructure/quiz-number-input": "20.20.1-snapshot.34+5767d10b6",
51
+ "@instructure/quiz-rce": "20.20.1-snapshot.34+5767d10b6",
52
52
  "@instructure/ui-a11y-content": "^8.51.0",
53
53
  "@instructure/ui-alerts": "^8.51.0",
54
54
  "@instructure/ui-avatar": "^8.51.0",
@@ -112,7 +112,7 @@
112
112
  "file-saver": "~2.0.5",
113
113
  "humps": "^2.0.0",
114
114
  "immutable": "^3.8.1",
115
- "instructure-validations": "20.20.1-snapshot.3+5e4f10e06",
115
+ "instructure-validations": "20.20.1-snapshot.34+5767d10b6",
116
116
  "ipaddr.js": "^1.5.4",
117
117
  "isomorphic-fetch": "^2.2.0",
118
118
  "isuuid": "^0.1.0",
@@ -143,7 +143,7 @@
143
143
  "uuid": "^3.2.1"
144
144
  },
145
145
  "devDependencies": {
146
- "@instructure/quiz-scripts": "20.20.0",
146
+ "@instructure/quiz-scripts": "20.26.0",
147
147
  "@instructure/ui-axe-check": "^8.51.0",
148
148
  "@instructure/ui-babel-preset": "^7.22.1",
149
149
  "@instructure/ui-test-utils": "^7.22.1",
@@ -161,7 +161,7 @@
161
161
  "jquery": "^2.2.3",
162
162
  "karma-junit-reporter": "^2.0.1",
163
163
  "most-subject": "^5.3.0",
164
- "quiz-presets": "20.20.1-snapshot.3+5e4f10e06",
164
+ "quiz-presets": "20.20.1-snapshot.34+5767d10b6",
165
165
  "react": "^16.8.6",
166
166
  "react-addons-test-utils": "^15.6.2",
167
167
  "react-dom": "^16.8.6",
@@ -177,5 +177,5 @@
177
177
  "publishConfig": {
178
178
  "access": "public"
179
179
  },
180
- "gitHead": "5e4f10e0603589e25fbc4a4c0a24c2b993bc3d69"
180
+ "gitHead": "5767d10b6eeea6b5a63c1b8e0311aca7892cc31b"
181
181
  }