@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.
- package/es/banks/api/banks.js +26 -2
- package/es/banks/components/AddToBankModal/presenter.js +3 -1
- package/es/banks/components/Bank/presenter.js +3 -2
- package/es/banks/components/BankEntry/presenter.js +2 -1
- package/es/banks/components/Banks/presenter.js +5 -5
- package/es/banks/components/CreateBankModal/index.js +3 -1
- package/es/banks/components/CreateBankModal/presenter.js +48 -2
- package/es/building/components/resources/quiz/instructions/Show/index.js +3 -2
- package/es/building/components/resources/quizEntry/QuizEntryBank/QuizEntryBankEdit/presenter.js +3 -1
- package/es/building/components/resources/quizEntry/QuizEntryBank/QuizEntryBankShow/index.js +1 -1
- package/es/common/actions/grading.js +13 -0
- package/es/common/components/RceConfigProvider/presenter.js +7 -1
- package/es/common/components/RceConfigProvider/rceConfigMapper.js +11 -3
- package/es/common/components/RceConfigProvider/rceConfigUtils.js +3 -0
- package/es/common/components/SDKApp/index.js +11 -0
- package/es/common/components/layout/sidebar/Sidebar/index.js +49 -6
- package/es/common/components/layout/sidebar/SidebarItem/presenter.js +1 -1
- package/es/common/components/resources/item/ItemEdit/presenter.js +2 -1
- package/es/common/components/resources/quiz/info/QuizInfo.js +3 -2
- package/es/common/components/shared/PrintTrigger/presenter.js +2 -1
- package/es/common/reducers/grading.js +17 -0
- package/es/configureStore.js +2 -0
- package/es/index.js +2 -0
- package/es/moderating/components/events/Event.js +2 -6
- package/es/moderating/components/resources/AccommodationsModal/ExtraTimeMultiplier/index.js +1 -1
- package/es/moderating/components/resources/AccommodationsModal/ExtraTimeSettings/index.js +1 -1
- package/es/moderating/components/resources/AccommodationsModal/index.js +28 -15
- package/es/moderating/components/resources/ModerateTable/presenter.js +3 -6
- package/es/moderating/components/resources/ModerateTableRow/presenter.js +1 -1
- package/es/moderating/components/resources/OutstandingQuizzesModal/presenter.js +2 -5
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/index.js +14 -0
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/presenter.js +79 -0
- package/lib/banks/api/banks.js +26 -2
- package/lib/banks/components/AddToBankModal/presenter.js +3 -1
- package/lib/banks/components/Bank/presenter.js +3 -2
- package/lib/banks/components/BankEntry/presenter.js +2 -1
- package/lib/banks/components/Banks/presenter.js +5 -5
- package/lib/banks/components/CreateBankModal/index.js +4 -1
- package/lib/banks/components/CreateBankModal/presenter.js +50 -2
- package/lib/building/components/resources/quiz/instructions/Show/index.js +3 -2
- package/lib/building/components/resources/quizEntry/QuizEntryBank/QuizEntryBankEdit/presenter.js +3 -1
- package/lib/building/components/resources/quizEntry/QuizEntryBank/QuizEntryBankShow/index.js +1 -1
- package/lib/common/actions/grading.js +23 -0
- package/lib/common/components/RceConfigProvider/presenter.js +7 -1
- package/lib/common/components/RceConfigProvider/rceConfigMapper.js +10 -2
- package/lib/common/components/RceConfigProvider/rceConfigUtils.js +7 -1
- package/lib/common/components/SDKApp/index.js +12 -0
- package/lib/common/components/layout/sidebar/Sidebar/index.js +50 -7
- package/lib/common/components/layout/sidebar/SidebarItem/presenter.js +1 -1
- package/lib/common/components/resources/item/ItemEdit/presenter.js +2 -1
- package/lib/common/components/resources/quiz/info/QuizInfo.js +4 -2
- package/lib/common/components/shared/PrintTrigger/presenter.js +2 -1
- package/lib/common/reducers/grading.js +28 -0
- package/lib/configureStore.js +3 -0
- package/lib/index.js +123 -98
- package/lib/moderating/components/events/Event.js +2 -6
- package/lib/moderating/components/resources/AccommodationsModal/ExtraTimeMultiplier/index.js +1 -1
- package/lib/moderating/components/resources/AccommodationsModal/ExtraTimeSettings/index.js +1 -1
- package/lib/moderating/components/resources/AccommodationsModal/index.js +28 -15
- package/lib/moderating/components/resources/ModerateTable/presenter.js +4 -6
- package/lib/moderating/components/resources/ModerateTableRow/presenter.js +1 -1
- package/lib/moderating/components/resources/OutstandingQuizzesModal/presenter.js +3 -5
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/index.js +29 -0
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/presenter.js +101 -0
- package/package.json +9 -9
package/es/banks/api/banks.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
-
}),
|
|
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
|
|
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.
|
|
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
|
|
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);
|
package/es/building/components/resources/quizEntry/QuizEntryBank/QuizEntryBankEdit/presenter.js
CHANGED
|
@@ -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
|
|
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: "
|
|
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(
|
|
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)(
|
|
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)(
|
|
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
|
-
},
|
|
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
|
|
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:
|
|
24
|
+
scrollKey: TITLE_SCROLL_KEY
|
|
24
25
|
})), /*#__PURE__*/React.createElement(ScrollableQuizInstructions, Object.assign({}, this.props, {
|
|
25
|
-
scrollKey:
|
|
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
|
|
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: [],
|