@instructure/quiz-core 17.49.1-rc.0 → 17.49.1-rc.10

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 (65) hide show
  1. package/es/banks/api/banks.js +26 -2
  2. package/es/banks/components/AddToBankModal/presenter.js +3 -1
  3. package/es/banks/components/Bank/presenter.js +3 -2
  4. package/es/banks/components/BankEntry/presenter.js +2 -1
  5. package/es/banks/components/Banks/presenter.js +5 -5
  6. package/es/banks/components/CreateBankModal/index.js +3 -1
  7. package/es/banks/components/CreateBankModal/presenter.js +48 -2
  8. package/es/building/components/resources/quiz/instructions/Show/index.js +3 -2
  9. package/es/building/components/resources/quizEntry/QuizEntryBank/QuizEntryBankEdit/presenter.js +3 -1
  10. package/es/building/components/resources/quizEntry/QuizEntryBank/QuizEntryBankShow/index.js +1 -1
  11. package/es/common/actions/grading.js +13 -0
  12. package/es/common/components/RceConfigProvider/presenter.js +7 -1
  13. package/es/common/components/RceConfigProvider/rceConfigMapper.js +11 -3
  14. package/es/common/components/RceConfigProvider/rceConfigUtils.js +3 -0
  15. package/es/common/components/SDKApp/index.js +11 -0
  16. package/es/common/components/layout/sidebar/Sidebar/index.js +49 -6
  17. package/es/common/components/layout/sidebar/SidebarItem/presenter.js +1 -1
  18. package/es/common/components/resources/item/ItemEdit/presenter.js +2 -1
  19. package/es/common/components/resources/quiz/info/QuizInfo.js +3 -2
  20. package/es/common/components/shared/PrintTrigger/presenter.js +2 -1
  21. package/es/common/reducers/grading.js +17 -0
  22. package/es/configureStore.js +2 -0
  23. package/es/index.js +2 -0
  24. package/es/moderating/components/events/Event.js +2 -6
  25. package/es/moderating/components/resources/AccommodationsModal/ExtraTimeMultiplier/index.js +1 -1
  26. package/es/moderating/components/resources/AccommodationsModal/ExtraTimeSettings/index.js +1 -1
  27. package/es/moderating/components/resources/AccommodationsModal/index.js +28 -15
  28. package/es/moderating/components/resources/ModerateTable/presenter.js +3 -6
  29. package/es/moderating/components/resources/ModerateTableRow/presenter.js +1 -1
  30. package/es/moderating/components/resources/OutstandingQuizzesModal/presenter.js +2 -5
  31. package/es/reporting/components/resources/NewQuizAndItemAnalysis/index.js +14 -0
  32. package/es/reporting/components/resources/NewQuizAndItemAnalysis/presenter.js +79 -0
  33. package/lib/banks/api/banks.js +26 -2
  34. package/lib/banks/components/AddToBankModal/presenter.js +3 -1
  35. package/lib/banks/components/Bank/presenter.js +3 -2
  36. package/lib/banks/components/BankEntry/presenter.js +2 -1
  37. package/lib/banks/components/Banks/presenter.js +5 -5
  38. package/lib/banks/components/CreateBankModal/index.js +4 -1
  39. package/lib/banks/components/CreateBankModal/presenter.js +50 -2
  40. package/lib/building/components/resources/quiz/instructions/Show/index.js +3 -2
  41. package/lib/building/components/resources/quizEntry/QuizEntryBank/QuizEntryBankEdit/presenter.js +3 -1
  42. package/lib/building/components/resources/quizEntry/QuizEntryBank/QuizEntryBankShow/index.js +1 -1
  43. package/lib/common/actions/grading.js +23 -0
  44. package/lib/common/components/RceConfigProvider/presenter.js +7 -1
  45. package/lib/common/components/RceConfigProvider/rceConfigMapper.js +10 -2
  46. package/lib/common/components/RceConfigProvider/rceConfigUtils.js +7 -1
  47. package/lib/common/components/SDKApp/index.js +12 -0
  48. package/lib/common/components/layout/sidebar/Sidebar/index.js +50 -7
  49. package/lib/common/components/layout/sidebar/SidebarItem/presenter.js +1 -1
  50. package/lib/common/components/resources/item/ItemEdit/presenter.js +2 -1
  51. package/lib/common/components/resources/quiz/info/QuizInfo.js +4 -2
  52. package/lib/common/components/shared/PrintTrigger/presenter.js +2 -1
  53. package/lib/common/reducers/grading.js +28 -0
  54. package/lib/configureStore.js +3 -0
  55. package/lib/index.js +123 -98
  56. package/lib/moderating/components/events/Event.js +2 -6
  57. package/lib/moderating/components/resources/AccommodationsModal/ExtraTimeMultiplier/index.js +1 -1
  58. package/lib/moderating/components/resources/AccommodationsModal/ExtraTimeSettings/index.js +1 -1
  59. package/lib/moderating/components/resources/AccommodationsModal/index.js +28 -15
  60. package/lib/moderating/components/resources/ModerateTable/presenter.js +4 -6
  61. package/lib/moderating/components/resources/ModerateTableRow/presenter.js +1 -1
  62. package/lib/moderating/components/resources/OutstandingQuizzesModal/presenter.js +3 -5
  63. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/index.js +29 -0
  64. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/presenter.js +101 -0
  65. package/package.json +9 -9
@@ -10,7 +10,7 @@ import { removeSharedBank, updateSharedBankPermission as updateSharedBankPermiss
10
10
  import { clear, newActiveBankEntry, newActiveBank } from "../../common/actions/ui.js";
11
11
  import t from '@instructure/quiz-i18n/es/format-message';
12
12
  import { handleError } from "../../common/api/helpers.js";
13
- import { BANKS_BANK_PAGINATION, BANKS_BANK_ENTRY_PAGINATION, DELETE_BANK_CALL, UPDATE_BANK_CALL, CAN_EDIT, REMOVED_ACCESS, SHARED_WITH_USER, SHARED_WITH_COURSE } from '@instructure/quiz-common';
13
+ import { BANKS_BANK_PAGINATION, BANKS_BANK_ENTRY_PAGINATION, DELETE_BANK_CALL, UPDATE_BANK_CALL, CAN_EDIT, READ_ONLY, REMOVED_ACCESS, SHARED_WITH_USER, SHARED_WITH_COURSE } from '@instructure/quiz-common';
14
14
  var banksApiEndpoint = '/api/banks';
15
15
  var DEFAULT_PAGE_SIZE = 100;
16
16
 
@@ -71,7 +71,7 @@ export var getBank = function getBank(bankId) {
71
71
  });
72
72
  };
73
73
  };
74
- export var createBank = function createBank(newBank) {
74
+ export var createBank = function createBank(newBank, shareWithCourseUuid) {
75
75
  return function (dispatch, getState) {
76
76
  var newBankData = JSON.stringify({
77
77
  bank: {
@@ -84,10 +84,34 @@ export var createBank = function createBank(newBank) {
84
84
  body: newBankData
85
85
  }).then(function (bankData) {
86
86
  dispatch([handleBankResponse(bankData), clear(BANKS_BANK_PAGINATION)]);
87
+
88
+ if (shareWithCourseUuid) {
89
+ simpleShareWithCourse(dispatch, bankData.id, shareWithCourseUuid);
90
+ }
91
+
87
92
  return bankData;
88
93
  });
89
94
  };
95
+ }; // not an action creator
96
+
97
+ var simpleShareWithCourse = function simpleShareWithCourse(dispatch, bankId, courseUuid) {
98
+ var url = "".concat(banksApiEndpoint, "/").concat(bankId, "/shared_banks");
99
+ var shareBankData = JSON.stringify({
100
+ shared_bank: {
101
+ entity_id: courseUuid,
102
+ entityType: SHARED_WITH_COURSE,
103
+ bank_id: bankId,
104
+ permission: READ_ONLY
105
+ }
106
+ });
107
+ var fetcher = new Fetcher({
108
+ onError: handleError(dispatch, t('Failed to share bank.'))
109
+ });
110
+ return fetcher.post(url, {
111
+ body: shareBankData
112
+ });
90
113
  };
114
+
91
115
  export function getExistingBankAndEntries(bankId) {
92
116
  return function (dispatch, getState) {
93
117
  return dispatch([clear("".concat(BANKS_BANK_ENTRY_PAGINATION, ":").concat(bankId)), getBank(bankId)]);
@@ -310,7 +310,8 @@ AddToBankModal.propTypes = {
310
310
  entryType: PropTypes.string.isRequired,
311
311
  // Resolve to the bank entry's entry, or create it if it does not yet exist.
312
312
  getEntry: PropTypes.func.isRequired,
313
- handleValidationErrorsFromApi: PropTypes.func.isRequired,
313
+ handleValidationErrorsFromApi: PropTypes.func,
314
+ // not required for stimuli
314
315
  label: PropTypes.string.isRequired,
315
316
  modalOpen: PropTypes.bool.isRequired,
316
317
  onAdd: PropTypes.func,
@@ -322,6 +323,7 @@ AddToBankModal.propTypes = {
322
323
  AddToBankModal.defaultProps = {
323
324
  canvasOrigin: '',
324
325
  checkBankedContentShareabilityEnabled: false,
326
+ handleValidationErrorsFromApi: function handleValidationErrorsFromApi() {},
325
327
  onAdd: function onAdd() {},
326
328
  onContinue: function onContinue() {},
327
329
  selectedBank: null
@@ -205,7 +205,7 @@ export var Bank = (_dec = themeable(theme, styles), _dec(_class = (_temp = _clas
205
205
  className: styles.bankName
206
206
  }, /*#__PURE__*/React.createElement(Heading, {
207
207
  level: "h1"
208
- }, this.props.bank.title));
208
+ }, this.props.bank.title || t('Bank')));
209
209
  }
210
210
  }, {
211
211
  key: "renderAddBankEntryModal",
@@ -312,7 +312,7 @@ export var Bank = (_dec = themeable(theme, styles), _dec(_class = (_temp = _clas
312
312
  bankId: PropTypes.string.isRequired,
313
313
  bank: PropTypes.instanceOf(BankRecord).isRequired,
314
314
  useBankSearch: PropTypes.bool,
315
- closeTray: PropTypes.func.isRequired,
315
+ closeTray: PropTypes.func,
316
316
  getBank: PropTypes.func.isRequired,
317
317
  getBankEntries: PropTypes.func.isRequired,
318
318
  isCompact: PropTypes.bool,
@@ -340,6 +340,7 @@ export var Bank = (_dec = themeable(theme, styles), _dec(_class = (_temp = _clas
340
340
  }, _class2.defaultProps = {
341
341
  activeQuizId: null,
342
342
  addEntryToQuiz: null,
343
+ closeTray: function closeTray() {},
343
344
  useBankSearch: false,
344
345
  isCompact: false,
345
346
  minSearchRefreshInterval: 100,
@@ -663,7 +663,7 @@ export var BankEntry = (_dec = themeable(theme, styles), _dec(_class = (_temp =
663
663
  clearModifications: PropTypes.func.isRequired,
664
664
  clearTemporaryBankItem: PropTypes.func.isRequired,
665
665
  createEntryAndBankEntry: PropTypes.func.isRequired,
666
- closeTray: PropTypes.func.isRequired,
666
+ closeTray: PropTypes.func,
667
667
  createTagAssociations: PropTypes.func.isRequired,
668
668
  deleteTagAssociations: PropTypes.func.isRequired,
669
669
  getBankEntry: PropTypes.func.isRequired,
@@ -697,6 +697,7 @@ export var BankEntry = (_dec = themeable(theme, styles), _dec(_class = (_temp =
697
697
  updateStimulus: PropTypes.func.isRequired,
698
698
  useBankTags: PropTypes.bool
699
699
  }, _class2.defaultProps = {
700
+ closeTray: function closeTray() {},
700
701
  entry: null,
701
702
  isCompact: false,
702
703
  navigateToBuild: null,
@@ -44,9 +44,6 @@ var sortOrderIcons = {
44
44
  ASC: IconArrowUpLine,
45
45
  DESC: IconArrowDownLine
46
46
  };
47
-
48
- var _ref4 = /*#__PURE__*/React.createElement(CreateBankModal, null);
49
-
50
47
  export var Banks = (_dec = themeable(theme, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
51
48
  _inherits(Banks, _Component);
52
49
 
@@ -366,14 +363,16 @@ export var Banks = (_dec = themeable(theme, styles), _dec(_class = (_temp = _cla
366
363
  getPage: this.getPage,
367
364
  renderRecords: this.renderRecords,
368
365
  stateKey: BANKS_BANK_PAGINATION
369
- }), _ref4));
366
+ }), /*#__PURE__*/React.createElement(CreateBankModal, {
367
+ itemBanksScope: this.props.scope
368
+ })));
370
369
  }
371
370
  }]);
372
371
 
373
372
  Banks.displayName = "Banks";
374
373
  return Banks;
375
374
  }(Component), _class2.propTypes = {
376
- closeTray: PropTypes.func.isRequired,
375
+ closeTray: PropTypes.func,
377
376
  createBank: PropTypes.func.isRequired,
378
377
  currentUser: PropTypes.shape({
379
378
  email: PropTypes.string,
@@ -420,6 +419,7 @@ export var Banks = (_dec = themeable(theme, styles), _dec(_class = (_temp = _cla
420
419
  newItemBankFilterNamesEnabled: PropTypes.bool,
421
420
  usedByCourseEnabled: PropTypes.bool
422
421
  }, _class2.defaultProps = {
422
+ closeTray: function closeTray() {},
423
423
  currentUser: null,
424
424
  getCourseInfo: null,
425
425
  getUserInfo: null,
@@ -10,6 +10,7 @@ import Bank from "../../../common/records/Bank.js";
10
10
  import { showError, hideError } from "../../../common/actions/errorsShowing.js";
11
11
  import { getModalTrigger } from "../../../common/util/modalHelpers.js";
12
12
  import { screenreaderNotification } from "../../../common/actions/alerts.js";
13
+ import { featureOn } from "../../../common/util/featureCheck.js";
13
14
 
14
15
  function mapStateToProps(state) {
15
16
  var temporaryBank = new Bank(state.getIn(['modifications', 'banks', TEMPORARY_BANK_ID]));
@@ -21,7 +22,8 @@ function mapStateToProps(state) {
21
22
  onCreateBank: state.getIn(['modal', 'options', 'onCreateBank']),
22
23
  temporaryBank: temporaryBank,
23
24
  errorKey: errorKey,
24
- displayError: errorsMap.get(errorKey)
25
+ displayError: errorsMap.get(errorKey),
26
+ showShareBankOnCreate: featureOn('share_bank_on_create')
25
27
  };
26
28
  }
27
29
 
@@ -8,6 +8,8 @@ var _dec, _class, _class2, _temp;
8
8
  import React, { Component } from 'react';
9
9
  import PropTypes from 'prop-types';
10
10
  import { Button, CloseButton } from '@instructure/ui-buttons';
11
+ import { Checkbox } from '@instructure/ui-checkbox';
12
+ import { View } from '@instructure/ui-view';
11
13
  import { TextInput } from '@instructure/ui-text-input';
12
14
  import { Heading } from '@instructure/ui-heading';
13
15
  import { themeable } from '@instructure/ui-themeable';
@@ -39,12 +41,17 @@ export var CreateBankModal = (_dec = themeable(theme, styles), _dec(_class = (_t
39
41
  }
40
42
 
41
43
  _this = _super.call.apply(_super, [this].concat(args));
44
+ _this.state = {
45
+ shareWithCourse: false
46
+ };
42
47
 
43
48
  _this.continueAction = function () {
44
49
  _this.props.showError(_this.props.errorKey);
45
50
 
46
51
  if (_this.props.temporaryBank.isValid()) {
47
- _this.props.createBank(_this.props.temporaryBank);
52
+ var courseUuid = _this.state.shareWithCourse ? _this.props.itemBanksScope.uuid : null;
53
+
54
+ _this.props.createBank(_this.props.temporaryBank, courseUuid);
48
55
 
49
56
  _this.props.onCreateBank();
50
57
 
@@ -57,6 +64,10 @@ export var CreateBankModal = (_dec = themeable(theme, styles), _dec(_class = (_t
57
64
  _this.closeAction = function () {
58
65
  _this.props.hideError(_this.props.errorKey);
59
66
 
67
+ _this.setState({
68
+ shareWithCourse: false
69
+ });
70
+
60
71
  _this.props.clearModifications('banks', _this.props.temporaryBank.id);
61
72
 
62
73
  if (_this.props.modalTrigger) {
@@ -80,6 +91,12 @@ export var CreateBankModal = (_dec = themeable(theme, styles), _dec(_class = (_t
80
91
  }
81
92
  };
82
93
 
94
+ _this.toggleCheckbox = function (event) {
95
+ _this.setState({
96
+ shareWithCourse: event.target.checked
97
+ });
98
+ };
99
+
83
100
  return _this;
84
101
  }
85
102
 
@@ -117,6 +134,27 @@ export var CreateBankModal = (_dec = themeable(theme, styles), _dec(_class = (_t
117
134
  type: "text",
118
135
  placeholder: t('Enter a name...'),
119
136
  "data-automation": "sdk-create-bank-name-textinput"
137
+ }), this.renderCheckbox());
138
+ }
139
+ }, {
140
+ key: "renderCheckbox",
141
+ value: function renderCheckbox() {
142
+ var hide = !this.props.showShareBankOnCreate || this.props.itemBanksScope.type !== 'course' || !this.props.itemBanksScope.title || !this.props.itemBanksScope.uuid;
143
+
144
+ if (hide) {
145
+ return null;
146
+ }
147
+
148
+ var label = t('Share with { courseName }', {
149
+ courseName: this.props.itemBanksScope.title
150
+ });
151
+ return /*#__PURE__*/React.createElement(View, {
152
+ margin: "medium 0 0 0",
153
+ as: "div"
154
+ }, /*#__PURE__*/React.createElement(Checkbox, {
155
+ label: label,
156
+ checked: this.state.shareWithCourse,
157
+ onChange: this.toggleCheckbox
120
158
  }));
121
159
  }
122
160
  }, {
@@ -155,10 +193,18 @@ export var CreateBankModal = (_dec = themeable(theme, styles), _dec(_class = (_t
155
193
  hideError: PropTypes.func.isRequired,
156
194
  closeModal: PropTypes.func.isRequired,
157
195
  screenreaderNotification: PropTypes.func.isRequired,
158
- onCreateBank: PropTypes.func
196
+ onCreateBank: PropTypes.func,
197
+ showShareBankOnCreate: PropTypes.bool,
198
+ itemBanksScope: PropTypes.shape({
199
+ type: PropTypes.string,
200
+ uuid: PropTypes.string,
201
+ title: PropTypes.string
202
+ })
159
203
  }, _class2.defaultProps = {
160
204
  displayError: false,
161
205
  modalTrigger: null,
206
+ showShareBankOnCreate: false,
207
+ itemBanksScope: {},
162
208
  onCreateBank: function onCreateBank() {}
163
209
  }, _temp)) || _class);
164
210
  export default CreateBankModal;
@@ -71,10 +71,11 @@ export var QuizInstructionsShow = (_dec = themeable(theme, styles), _dec(_class
71
71
  QuizInstructionsShow.displayName = "QuizInstructionsShow";
72
72
  return QuizInstructionsShow;
73
73
  }(Component), _class2.propTypes = {
74
- instructions: PropTypes.string.isRequired,
74
+ instructions: PropTypes.string,
75
75
  switchOnEditing: PropTypes.func.isRequired,
76
76
  contentLocked: PropTypes.bool
77
77
  }, _class2.defaultProps = {
78
- contentLocked: false
78
+ contentLocked: false,
79
+ instructions: null
79
80
  }, _temp)) || _class);
80
81
  export default makeScrollable(QuizInstructionsShow);
@@ -252,9 +252,11 @@ export var QuizEntryBankEdit = (_dec = themeable(theme, styles), _dec(_class = (
252
252
  questionSelection: PropTypes.string.isRequired,
253
253
  quizEntry: PropTypes.instanceOf(QuizEntry).isRequired,
254
254
  quizId: PropTypes.string.isRequired,
255
- sampleNum: PropTypes.string.isRequired,
255
+ sampleNum: PropTypes.string,
256
256
  updateQuizEntry: PropTypes.func.isRequired,
257
257
  workingBank: PropTypes.instanceOf(Bank).isRequired,
258
258
  workingQuizEntry: PropTypes.instanceOf(QuizEntry).isRequired
259
+ }, _class2.defaultProps = {
260
+ sampleNum: void 0
259
261
  }, _temp)) || _class);
260
262
  export default QuizEntryBankEdit;
@@ -100,7 +100,7 @@ export var QuizEntryBank = (_dec = themeable(theme, styles), _dec(_class = (_tem
100
100
  }, /*#__PURE__*/React.createElement(View, {
101
101
  size: "medium",
102
102
  textAlign: "center",
103
- margin: "large auto",
103
+ margin: "0 auto",
104
104
  padding: "small"
105
105
  }, this.renderErrors(), this.renderContent()));
106
106
  }
@@ -0,0 +1,13 @@
1
+ import { GRADE_BY_QUESTION_ENABLED, GBQ_SET_ACTIVE_ITEM } from '@instructure/quiz-common';
2
+ export function setGradeByQuestionEnabled(enabled) {
3
+ return {
4
+ type: GRADE_BY_QUESTION_ENABLED,
5
+ payload: enabled
6
+ };
7
+ }
8
+ export function setActiveItem(itemId) {
9
+ return {
10
+ type: GBQ_SET_ACTIVE_ITEM,
11
+ payload: itemId
12
+ };
13
+ }
@@ -67,6 +67,7 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(_ref2) {
67
67
  contextId = _ref2.contextId,
68
68
  contextType = _ref2.contextType,
69
69
  canvasUserId = _ref2.canvasUserId,
70
+ canvasToolId = _ref2.canvasToolId,
70
71
  rcsHost = _ref2.rcsHost,
71
72
  rcsJwt = _ref2.rcsJwt,
72
73
  rcsJwtRefreshFn = _ref2.rcsJwtRefreshFn,
@@ -101,6 +102,9 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(_ref2) {
101
102
  isNewRCERendererEnabled: isNewRCERendererEnabled,
102
103
  isNewRCEAppsEnabled: isNewRCEAppsEnabled
103
104
  };
105
+ var ltiAppParams = {
106
+ canvasToolId: canvasToolId
107
+ };
104
108
  var rendererParams = {
105
109
  canvasOrigin: canvasOrigin
106
110
  };
@@ -169,7 +173,7 @@ var RceConfigProviderComponent = function RceConfigProviderComponent(_ref2) {
169
173
  }
170
174
 
171
175
  return /*#__PURE__*/React.createElement(RceConfigContext.Provider, {
172
- value: mapParamsToRceConfigContext(flags, rcsParams, rendererParams, canvasConfig)
176
+ value: mapParamsToRceConfigContext(flags, rcsParams, rendererParams, canvasConfig, ltiAppParams)
173
177
  }, children);
174
178
  };
175
179
 
@@ -181,6 +185,7 @@ RceConfigProviderComponent.propTypes = {
181
185
  contextId: PropTypes.string,
182
186
  contextType: PropTypes.string,
183
187
  canvasUserId: PropTypes.string,
188
+ canvasToolId: PropTypes.string,
184
189
  rcsHost: PropTypes.string,
185
190
  rcsJwt: PropTypes.string,
186
191
  rcsJwtRefreshFn: PropTypes.func,
@@ -190,6 +195,7 @@ RceConfigProviderComponent.defaultProps = {
190
195
  contextId: null,
191
196
  contextType: null,
192
197
  canvasUserId: null,
198
+ canvasToolId: null,
193
199
  rcsHost: null,
194
200
  rcsJwt: null,
195
201
  rcsJwtRefreshFn: null,
@@ -1,6 +1,6 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
2
  import { RceConfigKeys } from '@instructure/quiz-common';
3
- import { hasAllPropsForRcs } from "./rceConfigUtils.js";
3
+ import { hasAllPropsForRcs, areLtiAppsConfigured } from "./rceConfigUtils.js";
4
4
 
5
5
  var mapFeatureFlags = function mapFeatureFlags(flags) {
6
6
  var _ref;
@@ -18,14 +18,22 @@ var mapRcs = function mapRcs(rcsParams, canvasConfig) {
18
18
  }
19
19
  };
20
20
 
21
+ var mapLtiApps = function mapLtiApps(flags, canvasConfig, ltiAppParams) {
22
+ var _ref3;
23
+
24
+ if (!areLtiAppsConfigured(flags, canvasConfig, ltiAppParams)) return null;
25
+ return _ref3 = {}, _defineProperty(_ref3, RceConfigKeys.canvasToolId, ltiAppParams.canvasToolId), _defineProperty(_ref3, RceConfigKeys.editorButtons, canvasConfig.editorButtons), _ref3;
26
+ };
27
+
21
28
  var rendererEnhancement = function rendererEnhancement(rendererParams) {
22
29
  return _defineProperty({}, RceConfigKeys.canvasOrigin, (rendererParams === null || rendererParams === void 0 ? void 0 : rendererParams.canvasOrigin) || null);
23
30
  };
24
31
 
25
- export var mapParamsToRceConfigContext = function mapParamsToRceConfigContext(flags, rcsParams, rendererParams, canvasConfig) {
32
+ export var mapParamsToRceConfigContext = function mapParamsToRceConfigContext(flags, rcsParams, rendererParams, canvasConfig, ltiAppParams) {
26
33
  return {
27
34
  featureFlags: mapFeatureFlags(flags),
28
35
  rcs: mapRcs(rcsParams, canvasConfig),
29
- rendererEnhancement: rendererEnhancement(rendererParams)
36
+ rendererEnhancement: rendererEnhancement(rendererParams),
37
+ ltiApps: mapLtiApps(flags, canvasConfig, ltiAppParams)
30
38
  };
31
39
  };
@@ -1,6 +1,9 @@
1
1
  export var hasAllPropsForRcs = function hasAllPropsForRcs(rcsParams) {
2
2
  return !!((rcsParams === null || rcsParams === void 0 ? void 0 : rcsParams.contextId) && (rcsParams === null || rcsParams === void 0 ? void 0 : rcsParams.contextType) && (rcsParams === null || rcsParams === void 0 ? void 0 : rcsParams.canvasUserId) && (rcsParams === null || rcsParams === void 0 ? void 0 : rcsParams.rcsHost) && (rcsParams === null || rcsParams === void 0 ? void 0 : rcsParams.refreshToken) && (rcsParams === null || rcsParams === void 0 ? void 0 : rcsParams.jwt));
3
3
  };
4
+ export var areLtiAppsConfigured = function areLtiAppsConfigured(flags, canvasConfig, ltiAppParams) {
5
+ return !!((flags === null || flags === void 0 ? void 0 : flags.isNewRCEAppsEnabled) && (ltiAppParams === null || ltiAppParams === void 0 ? void 0 : ltiAppParams.canvasToolId) && (canvasConfig === null || canvasConfig === void 0 ? void 0 : canvasConfig.editorButtons) && Array.isArray(canvasConfig.editorButtons) && canvasConfig.editorButtons.length > 0);
6
+ };
4
7
  export var isRce5Disabled = function isRce5Disabled(flags) {
5
8
  return !(flags === null || flags === void 0 ? void 0 : flags.isNewRCEEnabled) && !(flags === null || flags === void 0 ? void 0 : flags.isNewRCERendererEnabled);
6
9
  };
@@ -21,6 +21,7 @@ import { set } from "../../actions/ui.js";
21
21
  import { setAPIEndpoint, setCanvasOrigin, setUserToken } from "../../actions/config.js";
22
22
  import { setContextUuid, setOutcomesEndpoint, setOutcomesToken } from "../../actions/outcomes.js";
23
23
  import { addFeatures, removeFeatures } from "../../actions/features.js";
24
+ import { setGradeByQuestionEnabled } from "../../actions/grading.js";
24
25
  import renderAlerts from "../../util/renderAlerts.js";
25
26
  var styles = {
26
27
  componentId: 'fzweS',
@@ -85,6 +86,10 @@ export var SDKApp = (_dec = themeable(theme, styles), _dec(_class = (_temp = _cl
85
86
  if (this.props.itemBankSharingEnabled) {
86
87
  this.store.dispatch(addFeatures('item_bank_sharing'));
87
88
  }
89
+
90
+ if (this.props.gradeByQuestionEnabled !== null) {
91
+ this.store.dispatch(setGradeByQuestionEnabled(this.props.gradeByQuestionEnabled));
92
+ }
88
93
  }
89
94
  }, {
90
95
  key: "componentDidMount",
@@ -130,6 +135,10 @@ export var SDKApp = (_dec = themeable(theme, styles), _dec(_class = (_temp = _cl
130
135
  var toggleFeature = newProps.itemBankSharingEnabled ? addFeatures : removeFeatures;
131
136
  this.store.dispatch(toggleFeature('item_bank_sharing'));
132
137
  }
138
+
139
+ if (newProps.gradeByQuestionEnabled !== this.props.gradeByQuestionEnabled && this.props.gradeByQuestionEnabled !== null) {
140
+ this.store.dispatch(setGradeByQuestionEnabled(newProps.gradeByQuestionEnabled));
141
+ }
133
142
  }
134
143
  }, {
135
144
  key: "render",
@@ -156,6 +165,7 @@ export var SDKApp = (_dec = themeable(theme, styles), _dec(_class = (_temp = _cl
156
165
  appContainer: CustomPropTypes.selectors.isRequired,
157
166
  children: PropTypes.node.isRequired,
158
167
  contextUuid: PropTypes.string,
168
+ gradeByQuestionEnabled: PropTypes.bool,
159
169
  itemBankSharingEnabled: PropTypes.bool,
160
170
  // ESLint seems to this the "locale" prop is unused even though it definitely is
161
171
  locale: PropTypes.string,
@@ -182,6 +192,7 @@ export var SDKApp = (_dec = themeable(theme, styles), _dec(_class = (_temp = _cl
182
192
  locale: PropTypes.string
183
193
  }, _class2.defaultProps = {
184
194
  contextUuid: '',
195
+ gradeByQuestionEnabled: null,
185
196
  itemBankSharingEnabled: false,
186
197
  locale: null,
187
198
  outcomesEndpoint: null,
@@ -21,9 +21,9 @@ import { View } from '@instructure/ui-view';
21
21
  import { themeable } from '@instructure/ui-themeable';
22
22
  import { Heading } from '@instructure/ui-heading';
23
23
  import t from '@instructure/quiz-i18n/es/format-message';
24
+ import { INSTRUCTIONS_SCROLL_KEY, RESULTS_SCROLL_KEY, SIDEBAR_NAV_ID, TITLE_SCROLL_KEY } from '@instructure/quiz-common';
24
25
  import { onPhone } from "../../../../util/windowChecks.js";
25
26
  import CustomPropTypes from "../../../../util/CustomPropTypes.js";
26
- import { SIDEBAR_NAV_ID } from '@instructure/quiz-common';
27
27
  import noop from "../../../../util/noop.js";
28
28
  import Pin from "./Pin.js";
29
29
  var styles = {
@@ -55,7 +55,11 @@ var _ref2 = /*#__PURE__*/React.createElement(IconQuizInstructionsLine, {
55
55
  color: "primary"
56
56
  });
57
57
 
58
- var _ref3 = /*#__PURE__*/React.createElement(IconPinSolid, null);
58
+ var _ref3 = /*#__PURE__*/React.createElement(IconQuizInstructionsLine, {
59
+ color: "primary"
60
+ });
61
+
62
+ var _ref4 = /*#__PURE__*/React.createElement(IconPinSolid, null);
59
63
 
60
64
  export var Sidebar = (_dec = themeable(theme, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
61
65
  _inherits(Sidebar, _Component);
@@ -76,13 +80,19 @@ export var Sidebar = (_dec = themeable(theme, styles), _dec(_class = (_temp = _c
76
80
  _this.scrollToTitle = function (e) {
77
81
  e.preventDefault(); // prevent default link navigation
78
82
 
79
- _this.props.scrollToItem(null)('title');
83
+ _this.props.scrollToItem(null)(TITLE_SCROLL_KEY);
80
84
  };
81
85
 
82
86
  _this.scrollToInfo = function (e) {
83
87
  e.preventDefault(); // prevent default link navigation
84
88
 
85
- _this.props.scrollToItem(null)('instructions');
89
+ _this.props.scrollToItem(null)(INSTRUCTIONS_SCROLL_KEY);
90
+ };
91
+
92
+ _this.scrollToResults = function (e) {
93
+ e.preventDefault(); // prevent default link navigation
94
+
95
+ _this.props.scrollToItem(null)(RESULTS_SCROLL_KEY);
86
96
  };
87
97
 
88
98
  _this.toggleSidebar = function () {
@@ -126,6 +136,10 @@ export var Sidebar = (_dec = themeable(theme, styles), _dec(_class = (_temp = _c
126
136
  }, {
127
137
  key: "renderTitle",
128
138
  value: function renderTitle() {
139
+ if (this.props.grading) {
140
+ return;
141
+ }
142
+
129
143
  return /*#__PURE__*/React.createElement("div", {
130
144
  className: styles.actionableInfo
131
145
  }, /*#__PURE__*/React.createElement(Link, {
@@ -143,6 +157,10 @@ export var Sidebar = (_dec = themeable(theme, styles), _dec(_class = (_temp = _c
143
157
  }, {
144
158
  key: "renderInstructions",
145
159
  value: function renderInstructions() {
160
+ if (this.props.grading) {
161
+ return;
162
+ }
163
+
146
164
  return /*#__PURE__*/React.createElement("div", {
147
165
  className: styles.actionableInfo
148
166
  }, /*#__PURE__*/React.createElement(Link, {
@@ -159,6 +177,29 @@ export var Sidebar = (_dec = themeable(theme, styles), _dec(_class = (_temp = _c
159
177
  tabIndex: "-1"
160
178
  }, t('Instructions'))));
161
179
  }
180
+ }, {
181
+ key: "renderResults",
182
+ value: function renderResults() {
183
+ if (!this.props.grading) {
184
+ return;
185
+ }
186
+
187
+ return /*#__PURE__*/React.createElement("div", {
188
+ className: styles.actionableInfo
189
+ }, /*#__PURE__*/React.createElement(Link, {
190
+ href: "#",
191
+ margin: "small",
192
+ forceButtonRole: false,
193
+ onClick: this.scrollToResults,
194
+ renderIcon: _ref3,
195
+ "data-automation": "sidebar-results-button"
196
+ }, /*#__PURE__*/React.createElement(ScreenReaderContent, null, t('Navigate to results'))), /*#__PURE__*/React.createElement(PresentationContent, null, /*#__PURE__*/React.createElement("span", {
197
+ className: styles.description,
198
+ "data-automation": "sidebar-results-text",
199
+ onClick: this.scrollToResults,
200
+ tabIndex: "-1"
201
+ }, t('Results'))));
202
+ }
162
203
  }, {
163
204
  key: "renderSidebarHeader",
164
205
  value: function renderSidebarHeader() {
@@ -256,7 +297,7 @@ export var Sidebar = (_dec = themeable(theme, styles), _dec(_class = (_temp = _c
256
297
  size: "x-small",
257
298
  "aria-label": t('Pinned Questions'),
258
299
  role: "img"
259
- }, _ref3))), /*#__PURE__*/React.createElement("div", {
300
+ }, _ref4))), /*#__PURE__*/React.createElement("div", {
260
301
  className: closedClasses
261
302
  }, pinnedItems.map(function (pin) {
262
303
  return /*#__PURE__*/React.createElement(Pin, {
@@ -286,7 +327,7 @@ export var Sidebar = (_dec = themeable(theme, styles), _dec(_class = (_temp = _c
286
327
  ,
287
328
  onClick: noop,
288
329
  id: SIDEBAR_NAV_ID
289
- }, this.renderSidebarHeader(), this.renderTotalPointsPossible(), this.renderPinned(), this.renderTitle(), this.renderInstructions(), /*#__PURE__*/React.createElement("div", {
330
+ }, this.renderSidebarHeader(), this.renderTotalPointsPossible(), this.renderPinned(), this.renderTitle(), this.renderInstructions(), this.renderResults(), /*#__PURE__*/React.createElement("div", {
290
331
  className: styles.sidebarContent
291
332
  }, this.props.children)))));
292
333
  }
@@ -296,6 +337,7 @@ export var Sidebar = (_dec = themeable(theme, styles), _dec(_class = (_temp = _c
296
337
  return Sidebar;
297
338
  }(Component), _class2.propTypes = {
298
339
  children: PropTypes.oneOfType([PropTypes.element, PropTypes.arrayOf(PropTypes.element), PropTypes.node]).isRequired,
340
+ grading: PropTypes.bool,
299
341
  taking: PropTypes.bool,
300
342
  scrollToItem: CustomPropTypes.higherOrderFunction.isRequired,
301
343
  sidebarOpen: PropTypes.bool.isRequired,
@@ -310,6 +352,7 @@ export var Sidebar = (_dec = themeable(theme, styles), _dec(_class = (_temp = _c
310
352
  totalPointsPossible: PropTypes.number,
311
353
  shouldCloseOnBlur: PropTypes.bool
312
354
  }, _class2.defaultProps = {
355
+ grading: false,
313
356
  taking: false,
314
357
  title: null,
315
358
  pinnedItems: List(),
@@ -110,7 +110,7 @@ export var SidebarItem = (_dec = themeable(theme, styles), _dec(_class = (_temp
110
110
  return /*#__PURE__*/React.createElement(Link, {
111
111
  href: "#",
112
112
  size: "small",
113
- margin: "small",
113
+ margin: "0 small",
114
114
  isWithinText: false,
115
115
  forceButtonRole: false,
116
116
  onClick: this.scrollToItem,
@@ -174,7 +174,7 @@ ItemEdit.propTypes = {
174
174
  parentType: PropTypes.string.isRequired,
175
175
  partialDeepScoringEnabled: PropTypes.bool,
176
176
  partialScoringEnabled: PropTypes.bool,
177
- quizId: PropTypes.string.isRequired,
177
+ quizId: PropTypes.string,
178
178
  screenreaderNotification: PropTypes.func.isRequired,
179
179
  setOneQuestionAtATime: PropTypes.func.isRequired,
180
180
  setUploadStatus: PropTypes.func.isRequired,
@@ -196,6 +196,7 @@ ItemEdit.defaultProps = {
196
196
  outcomesToken: null,
197
197
  partialDeepScoringEnabled: false,
198
198
  partialScoringEnabled: false,
199
+ quizId: null,
199
200
  initialFocusId: null,
200
201
  showCalculator: false,
201
202
  validationErrorsFromApi: {}
@@ -3,6 +3,7 @@ import _createClass from "@babel/runtime/helpers/esm/createClass";
3
3
  import _inherits from "@babel/runtime/helpers/esm/inherits";
4
4
  import _createSuper from "@babel/runtime/helpers/esm/createSuper";
5
5
  import React, { Component } from 'react';
6
+ import { INSTRUCTIONS_SCROLL_KEY, TITLE_SCROLL_KEY } from '@instructure/quiz-common';
6
7
  import ScrollableQuizTitle from "../title/Title.js";
7
8
  import ScrollableQuizInstructions from "../instructions/Instructions.js";
8
9
  export var QuizInfo = /*#__PURE__*/function (_Component) {
@@ -20,9 +21,9 @@ export var QuizInfo = /*#__PURE__*/function (_Component) {
20
21
  key: "render",
21
22
  value: function render() {
22
23
  return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(ScrollableQuizTitle, Object.assign({}, this.props, {
23
- scrollKey: "title"
24
+ scrollKey: TITLE_SCROLL_KEY
24
25
  })), /*#__PURE__*/React.createElement(ScrollableQuizInstructions, Object.assign({}, this.props, {
25
- scrollKey: "instructions"
26
+ scrollKey: INSTRUCTIONS_SCROLL_KEY
26
27
  })));
27
28
  }
28
29
  }]);
@@ -128,7 +128,7 @@ export var PrintTrigger = /*#__PURE__*/function (_Component) {
128
128
  return PrintTrigger;
129
129
  }(Component);
130
130
  PrintTrigger.propTypes = {
131
- activeQuizId: PropTypes.string.isRequired,
131
+ activeQuizId: PropTypes.string,
132
132
  appContainer: CustomPropTypes.selectors,
133
133
  asyncSampleItemsEnabled: PropTypes.bool,
134
134
  bankQuizEntryIds: PropTypes.arrayOf(PropTypes.string),
@@ -144,6 +144,7 @@ PrintTrigger.propTypes = {
144
144
  setPrintFontSize: PropTypes.func.isRequired
145
145
  };
146
146
  PrintTrigger.defaultProps = {
147
+ activeQuizId: null,
147
148
  appContainer: null,
148
149
  asyncSampleItemsEnabled: false,
149
150
  bankQuizEntryIds: [],