@instructure/quiz-core 21.0.0 → 21.0.1-rc.11
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/components/BankEntry/presenter.js +2 -2
- package/es/banks/components/BanksList/presenter.js +1 -1
- package/es/banks/components/SharingModal/presenter.js +2 -2
- package/es/building/components/layout/header/BuildingButtons/theme.js +1 -1
- package/es/building/components/resources/quizEntry/QuizEntryEdit/Footer/presenter.js +2 -2
- package/es/building/components/resources/quizEntry/QuizEntryEdit/presenter.js +2 -2
- package/es/common/actions/taking.js +3 -2
- package/es/common/components/PrintFontSizeModal/presenter.js +2 -2
- package/es/common/components/SDKApp/index.js +4 -4
- package/es/common/components/layout/navbar/theme.js +1 -1
- package/es/common/components/resources/entry/EntrySave/presenter.js +2 -2
- package/es/common/components/resources/stimulus/StimulusEditInfo/index.js +5 -1
- package/es/common/components/resources/stimulus/StimulusEditInfo/presenter.js +15 -2
- package/es/common/components/resources/stimulus/StimulusShow/index.js +1 -1
- package/es/common/components/shared/Card/CardWrapper/theme.js +1 -1
- package/es/common/components/shared/PaginatedCollection/presenter.js +2 -2
- package/es/common/components/shared/TimeUnitsInput/index.js +2 -2
- package/es/common/components/shared/functionality/makeEditable.js +2 -2
- package/es/common/reducers/taking.js +5 -1
- package/es/common/selectors/taking.js +3 -0
- package/es/common/util/getClientIpAddress.js +35 -0
- package/es/common/util/serializeEvent.js +4 -2
- package/es/index.js +2 -3
- package/es/moderating/components/events/Event.js +27 -10
- package/es/moderating/components/events/ResponseEvent.js +24 -7
- package/es/moderating/components/events/SessionStartEvent.js +16 -15
- package/es/moderating/components/events/SessionSubmitEvent.js +42 -0
- package/es/moderating/components/resources/AccommodationsModal/ExtraTimeMultiplier/index.js +2 -2
- package/es/moderating/components/resources/EventDetails.js +43 -0
- package/es/moderating/components/resources/SessionBreachAlert.js +10 -0
- package/es/moderating/components/resources/util/checkIsBreach.js +28 -0
- package/es/moderating/components/resources/util/extractSessionData.js +20 -0
- package/es/reporting/components/resources/QuizAndItemAnalysis/presenter.js +2 -2
- package/es/reporting/components/resources/common/propTypes.js +14 -0
- package/es/taking/api/taking.js +26 -3
- package/lib/banks/components/BankEntry/presenter.js +2 -2
- package/lib/banks/components/BanksList/presenter.js +1 -1
- package/lib/banks/components/SharingModal/presenter.js +2 -2
- package/lib/building/components/layout/header/BuildingButtons/theme.js +1 -1
- package/lib/building/components/resources/quizEntry/QuizEntryEdit/Footer/presenter.js +2 -2
- package/lib/building/components/resources/quizEntry/QuizEntryEdit/presenter.js +2 -2
- package/lib/common/actions/taking.js +3 -2
- package/lib/common/components/PrintFontSizeModal/presenter.js +2 -2
- package/lib/common/components/SDKApp/index.js +4 -4
- package/lib/common/components/layout/navbar/theme.js +1 -1
- package/lib/common/components/resources/entry/EntrySave/presenter.js +2 -2
- package/lib/common/components/resources/stimulus/StimulusEditInfo/index.js +5 -1
- package/lib/common/components/resources/stimulus/StimulusEditInfo/presenter.js +15 -2
- package/lib/common/components/resources/stimulus/StimulusShow/index.js +1 -1
- package/lib/common/components/shared/Card/CardWrapper/theme.js +1 -1
- package/lib/common/components/shared/PaginatedCollection/presenter.js +2 -2
- package/lib/common/components/shared/TimeUnitsInput/index.js +2 -2
- package/lib/common/components/shared/functionality/makeEditable.js +2 -2
- package/lib/common/reducers/taking.js +5 -1
- package/lib/common/selectors/taking.js +5 -1
- package/lib/common/util/getClientIpAddress.js +43 -0
- package/lib/common/util/serializeEvent.js +3 -1
- package/lib/index.js +15 -0
- package/lib/moderating/components/events/Event.js +26 -9
- package/lib/moderating/components/events/ResponseEvent.js +25 -7
- package/lib/moderating/components/events/SessionStartEvent.js +16 -15
- package/lib/moderating/components/events/SessionSubmitEvent.js +52 -0
- package/lib/moderating/components/resources/AccommodationsModal/ExtraTimeMultiplier/index.js +2 -2
- package/lib/moderating/components/resources/EventDetails.js +51 -0
- package/lib/moderating/components/resources/SessionBreachAlert.js +18 -0
- package/lib/moderating/components/resources/util/checkIsBreach.js +36 -0
- package/lib/moderating/components/resources/util/extractSessionData.js +28 -0
- package/lib/reporting/components/resources/QuizAndItemAnalysis/presenter.js +2 -2
- package/lib/reporting/components/resources/common/propTypes.js +18 -2
- package/lib/taking/api/taking.js +26 -3
- package/package.json +34 -33
|
@@ -83,8 +83,8 @@ var ExtraTimeMultiplier = /*#__PURE__*/function (_withI18nSupport) {
|
|
|
83
83
|
return _this;
|
|
84
84
|
}
|
|
85
85
|
_createClass(ExtraTimeMultiplier, [{
|
|
86
|
-
key: "
|
|
87
|
-
value: function
|
|
86
|
+
key: "UNSAFE_componentWillMount",
|
|
87
|
+
value: function UNSAFE_componentWillMount() {
|
|
88
88
|
var multiplierValue = Math.max(this.props.timerMultiplierValue, this.props.minMultiplier);
|
|
89
89
|
var multiplierValueString = this.formatDecimal2FractionDigits(multiplierValue);
|
|
90
90
|
this.setState({
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Table } from '@instructure/ui-table';
|
|
2
|
+
import { Text } from '@instructure/ui-text';
|
|
3
|
+
import { IconButton } from '@instructure/ui-buttons';
|
|
4
|
+
import t from '@instructure/quiz-i18n/es/format-message';
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import { SessionBreachAlert } from "./SessionBreachAlert.js";
|
|
7
|
+
import { IconInfoLine } from '@instructure/ui-icons';
|
|
8
|
+
import { Tooltip } from '@instructure/ui-tooltip';
|
|
9
|
+
var _ref2 = /*#__PURE__*/React.createElement(SessionBreachAlert, null);
|
|
10
|
+
export var EventDetails = function EventDetails(_ref) {
|
|
11
|
+
var currentEventData = _ref.currentEventData,
|
|
12
|
+
validationErrors = _ref.validationErrors,
|
|
13
|
+
_ref$answerValue = _ref.answerValue,
|
|
14
|
+
answerValue = _ref$answerValue === void 0 ? null : _ref$answerValue;
|
|
15
|
+
var eventTimeString = "".concat(t('Event time'), ": ").concat(currentEventData.eventDate);
|
|
16
|
+
var renderTooltip = function renderTooltip(message) {
|
|
17
|
+
return /*#__PURE__*/React.createElement(Tooltip, {
|
|
18
|
+
renderTip: message,
|
|
19
|
+
placement: "end",
|
|
20
|
+
on: ['click', 'hover', 'focus']
|
|
21
|
+
}, /*#__PURE__*/React.createElement(IconButton, {
|
|
22
|
+
screenReaderLabel: message,
|
|
23
|
+
renderIcon: IconInfoLine,
|
|
24
|
+
withBackground: false,
|
|
25
|
+
withBorder: false
|
|
26
|
+
}));
|
|
27
|
+
};
|
|
28
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, validationErrors.isBreach && _ref2, /*#__PURE__*/React.createElement("h4", null, eventTimeString), /*#__PURE__*/React.createElement(Table, {
|
|
29
|
+
caption: t('System details')
|
|
30
|
+
}, /*#__PURE__*/React.createElement(Table.Head, null, /*#__PURE__*/React.createElement(Table.Row, null, /*#__PURE__*/React.createElement(Table.ColHeader, {
|
|
31
|
+
id: "system-details-attribute"
|
|
32
|
+
}, t('Attribute')), /*#__PURE__*/React.createElement(Table.ColHeader, {
|
|
33
|
+
id: "system-details-value"
|
|
34
|
+
}, t('Value')))), /*#__PURE__*/React.createElement(Table.Body, null, /*#__PURE__*/React.createElement(Table.Row, null, /*#__PURE__*/React.createElement(Table.Cell, null, t('Client IP address')), /*#__PURE__*/React.createElement(Table.Cell, null, /*#__PURE__*/React.createElement(Text, {
|
|
35
|
+
color: validationErrors.ipAddress ? 'danger' : 'primary'
|
|
36
|
+
}, currentEventData.ipAddress), validationErrors.ipAddress && renderTooltip(validationErrors.ipAddress))), /*#__PURE__*/React.createElement(Table.Row, null, /*#__PURE__*/React.createElement(Table.Cell, null, t('Browser session ID')), /*#__PURE__*/React.createElement(Table.Cell, null, /*#__PURE__*/React.createElement(Text, {
|
|
37
|
+
color: validationErrors.browserSessionID ? 'danger' : 'primary'
|
|
38
|
+
}, currentEventData.browserSessionID), validationErrors.browserSessionID && renderTooltip(validationErrors.browserSessionID))), /*#__PURE__*/React.createElement(Table.Row, null, /*#__PURE__*/React.createElement(Table.Cell, null, t('Browser')), /*#__PURE__*/React.createElement(Table.Cell, null, /*#__PURE__*/React.createElement(Text, {
|
|
39
|
+
color: validationErrors.browserString ? 'danger' : 'primary'
|
|
40
|
+
}, currentEventData.browserString), validationErrors.browserString && renderTooltip(validationErrors.browserString))), /*#__PURE__*/React.createElement(Table.Row, null, /*#__PURE__*/React.createElement(Table.Cell, null, t('Operating System')), /*#__PURE__*/React.createElement(Table.Cell, null, /*#__PURE__*/React.createElement(Text, {
|
|
41
|
+
color: validationErrors.userPlatform ? 'danger' : 'primary'
|
|
42
|
+
}, currentEventData.userPlatform), validationErrors.userPlatform && renderTooltip(validationErrors.userPlatform))), answerValue && /*#__PURE__*/React.createElement(Table.Row, null, /*#__PURE__*/React.createElement(Table.Cell, null, t('Answer value')), /*#__PURE__*/React.createElement(Table.Cell, null, answerValue)))));
|
|
43
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Alert } from '@instructure/ui-alerts';
|
|
3
|
+
import t from '@instructure/quiz-i18n/es/format-message';
|
|
4
|
+
var _ref = /*#__PURE__*/React.createElement("br", null);
|
|
5
|
+
export var SessionBreachAlert = function SessionBreachAlert() {
|
|
6
|
+
return /*#__PURE__*/React.createElement(Alert, {
|
|
7
|
+
variant: "warning",
|
|
8
|
+
margin: "small"
|
|
9
|
+
}, t('Potential breach: This Quiz appears to have been accessed from multiple devices or browsers.'), _ref, t('Review the activity log and take appropriate action.'));
|
|
10
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import t from '@instructure/quiz-i18n/es/format-message';
|
|
2
|
+
export var checkIsBreach = function checkIsBreach(firstEventData, currentEventData) {
|
|
3
|
+
var result = {
|
|
4
|
+
isBreach: false
|
|
5
|
+
};
|
|
6
|
+
var checks = [{
|
|
7
|
+
key: 'ipAddress',
|
|
8
|
+
message: t('Client IP address is different from initial address')
|
|
9
|
+
}, {
|
|
10
|
+
key: 'browserSessionID',
|
|
11
|
+
message: t('Browser session ID is different from initial id')
|
|
12
|
+
}, {
|
|
13
|
+
key: 'browserString',
|
|
14
|
+
message: t('Browser is different from initial browser')
|
|
15
|
+
}, {
|
|
16
|
+
key: 'userPlatform',
|
|
17
|
+
message: t('Operating system is different from initial system')
|
|
18
|
+
}];
|
|
19
|
+
checks.forEach(function (_ref) {
|
|
20
|
+
var key = _ref.key,
|
|
21
|
+
message = _ref.message;
|
|
22
|
+
if (currentEventData[key] !== firstEventData[key]) {
|
|
23
|
+
result.isBreach = true;
|
|
24
|
+
result[key] = message;
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
return result;
|
|
28
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import platform from 'platform';
|
|
2
|
+
import { formatDateTimeSeconds } from '@instructure/quiz-i18n';
|
|
3
|
+
export var extractSessionData = function extractSessionData(sourceData) {
|
|
4
|
+
if (!sourceData) return {
|
|
5
|
+
ipAddress: '',
|
|
6
|
+
browserSessionID: '',
|
|
7
|
+
eventDate: '',
|
|
8
|
+
browserString: '',
|
|
9
|
+
userPlatform: ''
|
|
10
|
+
};
|
|
11
|
+
var clientTimestamp = sourceData.getIn(['eventData', 'clientTimestamp']);
|
|
12
|
+
var userPlatform = platform.parse(sourceData.getIn(['eventData', 'userAgent']));
|
|
13
|
+
return {
|
|
14
|
+
ipAddress: sourceData.getIn(['eventData', 'ipAddress']),
|
|
15
|
+
browserSessionID: sourceData.getIn(['eventData', 'browserSessionId']),
|
|
16
|
+
eventDate: clientTimestamp ? formatDateTimeSeconds(clientTimestamp) : '',
|
|
17
|
+
browserString: "".concat(userPlatform.name, " ").concat(userPlatform.version),
|
|
18
|
+
userPlatform: userPlatform.os.toString()
|
|
19
|
+
};
|
|
20
|
+
};
|
|
@@ -40,8 +40,8 @@ export var QuizAndItemAnalysis = (_dec = withStyleOverrides(generateStyle, gener
|
|
|
40
40
|
this.getAnalyses(this.props.activeQuizId);
|
|
41
41
|
}
|
|
42
42
|
}, {
|
|
43
|
-
key: "
|
|
44
|
-
value: function
|
|
43
|
+
key: "UNSAFE_componentWillUpdate",
|
|
44
|
+
value: function UNSAFE_componentWillUpdate(nextProps) {
|
|
45
45
|
if (this.props.activeQuizId !== nextProps.activeQuizId) {
|
|
46
46
|
this.getAnalyses(nextProps.activeQuizId);
|
|
47
47
|
}
|
|
@@ -163,4 +163,18 @@ export var afsFlags = PropTypes.shape({
|
|
|
163
163
|
numericEnabled: PropTypes.bool.isRequired,
|
|
164
164
|
essayEnabled: PropTypes.bool.isRequired,
|
|
165
165
|
fileUploadEnabled: PropTypes.bool.isRequired
|
|
166
|
+
});
|
|
167
|
+
export var sessionValidationErrorsPropType = PropTypes.shape({
|
|
168
|
+
isBreach: PropTypes.bool,
|
|
169
|
+
ipAddress: PropTypes.string,
|
|
170
|
+
browserSessionID: PropTypes.string,
|
|
171
|
+
browserString: PropTypes.string,
|
|
172
|
+
userPlatform: PropTypes.string
|
|
173
|
+
});
|
|
174
|
+
export var eventDataPropType = PropTypes.shape({
|
|
175
|
+
ipAddress: PropTypes.string,
|
|
176
|
+
browserSessionID: PropTypes.string,
|
|
177
|
+
eventDate: PropTypes.string,
|
|
178
|
+
browserString: PropTypes.string,
|
|
179
|
+
userPlatform: PropTypes.string
|
|
166
180
|
});
|
package/es/taking/api/taking.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
2
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
1
3
|
// =============================================
|
|
2
4
|
// =============================================
|
|
3
5
|
|
|
@@ -25,6 +27,7 @@ import { getSessionItems, handleQuizSessionFetch } from "../../common/actions/qu
|
|
|
25
27
|
import { handleSessionItemsResponse, handleResumeDataResponse, handleQuizSessionResponse } from "../../common/api/callHandlers.js";
|
|
26
28
|
import * as modalActions from "../../common/actions/modal.js";
|
|
27
29
|
import { backtrackingNextQuestion, sessionStartOrResumeEvent, setCurrentSessionItemPosition, submitQuizSessionEvent, updateQuizSubmitFlag, updateQuizSessionStatusOnPageLoad, updateTimerInfo } from "../../common/actions/taking.js";
|
|
30
|
+
import { getClientIpAddress } from "../../common/util/getClientIpAddress.js";
|
|
28
31
|
var getQuizSessionConfig = function getQuizSessionConfig(quizSession) {
|
|
29
32
|
// these should be handled by existing functions
|
|
30
33
|
var oneQuestionAtATime = quizSession.isOneQuestionAtATime();
|
|
@@ -144,9 +147,29 @@ export function newQuizTakingSession(quizSessionId) {
|
|
|
144
147
|
};
|
|
145
148
|
}
|
|
146
149
|
export function onQuizSessionReadyForTaking(quizSession) {
|
|
147
|
-
return function (
|
|
148
|
-
|
|
149
|
-
|
|
150
|
+
return /*#__PURE__*/function () {
|
|
151
|
+
var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(dispatch) {
|
|
152
|
+
var ipAddress;
|
|
153
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
154
|
+
while (1) {
|
|
155
|
+
switch (_context.prev = _context.next) {
|
|
156
|
+
case 0:
|
|
157
|
+
_context.next = 2;
|
|
158
|
+
return getClientIpAddress(quizSession.id);
|
|
159
|
+
case 2:
|
|
160
|
+
ipAddress = _context.sent;
|
|
161
|
+
dispatch([makeSessionItemCall(quizSession), getResumeData(quizSession.id), sessionStartOrResumeEvent(navigator.userAgent, ipAddress), updateQuizSessionStatusOnPageLoad(quizSession.status)]);
|
|
162
|
+
case 4:
|
|
163
|
+
case "end":
|
|
164
|
+
return _context.stop();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}, _callee);
|
|
168
|
+
}));
|
|
169
|
+
return function (_x) {
|
|
170
|
+
return _ref.apply(this, arguments);
|
|
171
|
+
};
|
|
172
|
+
}();
|
|
150
173
|
}
|
|
151
174
|
|
|
152
175
|
// ====================================
|
|
@@ -219,8 +219,8 @@ var BankEntry = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default, _th
|
|
|
219
219
|
this.props.setShouldClone(false);
|
|
220
220
|
}
|
|
221
221
|
}, {
|
|
222
|
-
key: "
|
|
223
|
-
value: function
|
|
222
|
+
key: "UNSAFE_componentWillMount",
|
|
223
|
+
value: function UNSAFE_componentWillMount() {
|
|
224
224
|
this.props.setShouldClone(false);
|
|
225
225
|
}
|
|
226
226
|
}, {
|
|
@@ -454,7 +454,7 @@ var BanksList = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default, _th
|
|
|
454
454
|
}, (0, _emotion.jsx)(_uiTable.Table.Row, null, this.renderTableSortHeader('name', (0, _formatMessage.default)('Name')), this.renderTableSortHeader('updated_at', (0, _formatMessage.default)('Updated')), (0, _emotion.jsx)(_uiTable.Table.ColHeader, {
|
|
455
455
|
id: "header-num-questions",
|
|
456
456
|
width: "1"
|
|
457
|
-
}, (0, _formatMessage.default)('Questions')), this.renderTableSortHeader('last_used', (0, _formatMessage.default)('Last Used')), this.renderTableSortHeader('created_at', (0, _formatMessage.default)('Created')),
|
|
457
|
+
}, (0, _formatMessage.default)('Questions')), this.renderTableSortHeader('last_used', (0, _formatMessage.default)('Last Used')), this.renderTableSortHeader('created_at', (0, _formatMessage.default)('Created')), (0, _emotion.jsx)(_uiTable.Table.ColHeader, {
|
|
458
458
|
id: "header-option-links",
|
|
459
459
|
width: "1"
|
|
460
460
|
}, (0, _emotion.jsx)(_uiA11yContent.ScreenReaderContent, null, (0, _formatMessage.default)('Bank option links'))))), (0, _emotion.jsx)(_uiTable.Table.Body, null, (this.props.banks.toArray() || []).map(function (bank) {
|
|
@@ -337,8 +337,8 @@ var SharingModalPresenter = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.
|
|
|
337
337
|
});
|
|
338
338
|
}
|
|
339
339
|
}, {
|
|
340
|
-
key: "
|
|
341
|
-
value: function
|
|
340
|
+
key: "UNSAFE_componentWillReceiveProps",
|
|
341
|
+
value: function UNSAFE_componentWillReceiveProps(nextProps) {
|
|
342
342
|
this.setState({
|
|
343
343
|
accountPermission: nextProps.bank.accountPermission,
|
|
344
344
|
shares: nextProps.sharedBanks
|
|
@@ -11,7 +11,7 @@ var generateComponentTheme = function generateComponentTheme(_ref) {
|
|
|
11
11
|
return {
|
|
12
12
|
quizSavingColor: colors.lightGray,
|
|
13
13
|
quizSavingMargin: spacing.large,
|
|
14
|
-
buttonsHolderMargin: spacing.
|
|
14
|
+
buttonsHolderMargin: spacing.mediumSmall,
|
|
15
15
|
menuIconMargin: spacing.xSmall,
|
|
16
16
|
menuIconFontSize: typography.fontSizeLarge
|
|
17
17
|
};
|
|
@@ -94,8 +94,8 @@ var QuizEntryEditFooter = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.de
|
|
|
94
94
|
return _this;
|
|
95
95
|
}
|
|
96
96
|
(0, _createClass2.default)(QuizEntryEditFooter, [{
|
|
97
|
-
key: "
|
|
98
|
-
value: function
|
|
97
|
+
key: "UNSAFE_componentWillReceiveProps",
|
|
98
|
+
value: function UNSAFE_componentWillReceiveProps(nextProps) {
|
|
99
99
|
var points = this.getPoints(nextProps);
|
|
100
100
|
this.setState({
|
|
101
101
|
points: points,
|
|
@@ -284,8 +284,8 @@ var QuizEntryEdit = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default,
|
|
|
284
284
|
this.props.onEditQuizEntryToggle(this.props.quizEntry.id);
|
|
285
285
|
}
|
|
286
286
|
}, {
|
|
287
|
-
key: "
|
|
288
|
-
value: function
|
|
287
|
+
key: "UNSAFE_componentWillMount",
|
|
288
|
+
value: function UNSAFE_componentWillMount() {
|
|
289
289
|
this.props.setUi(_quizCommon.SHOULD_CLONE_ITEM, false);
|
|
290
290
|
}
|
|
291
291
|
}, {
|
|
@@ -122,12 +122,13 @@ var loadResumeData = function loadResumeData(resumeData) {
|
|
|
122
122
|
};
|
|
123
123
|
};
|
|
124
124
|
exports.loadResumeData = loadResumeData;
|
|
125
|
-
var sessionStartOrResumeEvent = function sessionStartOrResumeEvent(userAgent) {
|
|
125
|
+
var sessionStartOrResumeEvent = function sessionStartOrResumeEvent(userAgent, ipAddress) {
|
|
126
126
|
return {
|
|
127
127
|
type: _quizCommon.SESSION_STARTED_OR_RESUMED_EVENT,
|
|
128
128
|
payload: {
|
|
129
129
|
userAgent: userAgent,
|
|
130
|
-
browserSessionId: (0, _uuid.v4)()
|
|
130
|
+
browserSessionId: (0, _uuid.v4)(),
|
|
131
|
+
ipAddress: ipAddress
|
|
131
132
|
}
|
|
132
133
|
};
|
|
133
134
|
};
|
|
@@ -92,8 +92,8 @@ var PrintFontSizeModal = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.def
|
|
|
92
92
|
});
|
|
93
93
|
}
|
|
94
94
|
}, {
|
|
95
|
-
key: "
|
|
96
|
-
value: function
|
|
95
|
+
key: "UNSAFE_componentWillReceiveProps",
|
|
96
|
+
value: function UNSAFE_componentWillReceiveProps(nextProps) {
|
|
97
97
|
this.setState({
|
|
98
98
|
selectedFontSize: nextProps.persistedPrintFontSize || this.state.selectedFontSize,
|
|
99
99
|
rememberTextSizeSetting: !!this.props.persistedPrintFontSize || this.state.rememberTextSizeSetting
|
|
@@ -72,8 +72,8 @@ var SDKApp = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default, null),
|
|
|
72
72
|
return (0, _ui.set)('appContainer', selectors);
|
|
73
73
|
}
|
|
74
74
|
}, {
|
|
75
|
-
key: "
|
|
76
|
-
value: function
|
|
75
|
+
key: "UNSAFE_componentWillMount",
|
|
76
|
+
value: function UNSAFE_componentWillMount() {
|
|
77
77
|
var _this$props$rceConfig;
|
|
78
78
|
this.store.dispatch([(0, _config.setAPIEndpoint)(this.props.apiEndpoint), (0, _config.setCanvasOrigin)((_this$props$rceConfig = this.props.rceConfig) === null || _this$props$rceConfig === void 0 ? void 0 : _this$props$rceConfig.canvasOrigin), this.setAppContainer(this.props.appContainer), (0, _config.setUserToken)(this.props.userToken), (0, _outcomes.setOutcomesEndpoint)(this.props.outcomesEndpoint), (0, _outcomes.setOutcomesToken)(this.props.outcomesToken), (0, _outcomes.setContextUuid)(this.props.contextUuid), (0, _outcomes.setExternalAccountUuid)(this.props.externalAccountUuid)]);
|
|
79
79
|
if (this.props.itemBankSharingEnabled) {
|
|
@@ -91,8 +91,8 @@ var SDKApp = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.default, null),
|
|
|
91
91
|
!this.props.disableAlertLiveRegion && (0, _renderAlerts.renderAlerts)(this.store);
|
|
92
92
|
}
|
|
93
93
|
}, {
|
|
94
|
-
key: "
|
|
95
|
-
value: function
|
|
94
|
+
key: "UNSAFE_componentWillReceiveProps",
|
|
95
|
+
value: function UNSAFE_componentWillReceiveProps(newProps) {
|
|
96
96
|
var _newProps$rceConfig, _this$props$rceConfig2;
|
|
97
97
|
if (newProps.apiEndpoint !== this.props.apiEndpoint) {
|
|
98
98
|
this.store.dispatch((0, _config.setAPIEndpoint)(newProps.apiEndpoint));
|
|
@@ -8,7 +8,7 @@ var generateComponentTheme = function generateComponentTheme(_ref) {
|
|
|
8
8
|
var breakpoints = _ref.breakpoints,
|
|
9
9
|
colors = _ref.colors;
|
|
10
10
|
return {
|
|
11
|
-
backgroundColor: colors.
|
|
11
|
+
backgroundColor: colors.white,
|
|
12
12
|
phoneBreakPoint: breakpoints.medium
|
|
13
13
|
};
|
|
14
14
|
};
|
|
@@ -93,8 +93,8 @@ var EntrySave = /*#__PURE__*/function (_Component) {
|
|
|
93
93
|
return _this;
|
|
94
94
|
}
|
|
95
95
|
(0, _createClass2.default)(EntrySave, [{
|
|
96
|
-
key: "
|
|
97
|
-
value: function
|
|
96
|
+
key: "UNSAFE_componentWillMount",
|
|
97
|
+
value: function UNSAFE_componentWillMount() {
|
|
98
98
|
this.props.switchOnEditing(this.props.initialFocusId);
|
|
99
99
|
}
|
|
100
100
|
}, {
|
|
@@ -10,12 +10,16 @@ var _redux = require("redux");
|
|
|
10
10
|
var _reactRedux = require("../../../../react-redux.js");
|
|
11
11
|
var modificationActions = _interopRequireWildcard(require("../../../../actions/modifications.js"));
|
|
12
12
|
var _featureCheck = require("../../../../../common/util/featureCheck.js");
|
|
13
|
+
var _quizzes = require("../../../../../common/selectors/quizzes.js");
|
|
13
14
|
var _presenter = _interopRequireDefault(require("./presenter.js"));
|
|
14
15
|
function mapStateToProps(state, props) {
|
|
16
|
+
var quizId = (0, _quizzes.getActiveQuizId)(state);
|
|
17
|
+
var quiz = (0, _quizzes.getQuizById)(state, quizId);
|
|
15
18
|
return {
|
|
16
19
|
workingStimulus: props.stimulus.getWorkingInstance(),
|
|
17
20
|
errorsShowing: state.getIn(['errorsShowing', props.guid], props.errorsShowing || false),
|
|
18
|
-
stimulusOrientationEnabled: (0, _featureCheck.featureOn)('customizable_stimulus_orientation')
|
|
21
|
+
stimulusOrientationEnabled: (0, _featureCheck.featureOn)('customizable_stimulus_orientation'),
|
|
22
|
+
shuffleQuestionsEnabled: quiz.shuffleQuestions
|
|
19
23
|
};
|
|
20
24
|
}
|
|
21
25
|
function mapDispatchToProps(dispatch) {
|
|
@@ -23,6 +23,7 @@ var _quizCommon = require("@instructure/quiz-common");
|
|
|
23
23
|
var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
|
|
24
24
|
var _styles = _interopRequireDefault(require("./styles.js"));
|
|
25
25
|
var _theme = _interopRequireDefault(require("./theme.js"));
|
|
26
|
+
var _uiAlerts = require("@instructure/ui-alerts");
|
|
26
27
|
var _dec, _class, _StimulusEditInfo;
|
|
27
28
|
/** @jsx jsx */
|
|
28
29
|
var _ref3 = (0, _emotion.jsx)(_uiIcons.IconUpdownLine, {
|
|
@@ -103,6 +104,16 @@ var StimulusEditInfo = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.defau
|
|
|
103
104
|
value: "top"
|
|
104
105
|
}, (0, _formatMessage.default)('Questions below'))));
|
|
105
106
|
}
|
|
107
|
+
}, {
|
|
108
|
+
key: "renderPassageAlert",
|
|
109
|
+
value: function renderPassageAlert(stimulus) {
|
|
110
|
+
if (!stimulus.passage || !this.props.shuffleQuestionsEnabled) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
return (0, _emotion.jsx)(_uiAlerts.Alert, {
|
|
114
|
+
variant: "warning"
|
|
115
|
+
}, (0, _formatMessage.default)('The passage sections may not appear in their original order due to the shuffle setting.'));
|
|
116
|
+
}
|
|
106
117
|
}, {
|
|
107
118
|
key: "renderInstructions",
|
|
108
119
|
value: function renderInstructions(stimulus) {
|
|
@@ -153,7 +164,7 @@ var StimulusEditInfo = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.defau
|
|
|
153
164
|
}, (0, _emotion.jsx)(_uiHeading.Heading, {
|
|
154
165
|
level: "h3",
|
|
155
166
|
as: "h2"
|
|
156
|
-
}, this.headerText(stimulus)), (0, _emotion.jsx)("div", {
|
|
167
|
+
}, this.headerText(stimulus)), this.renderPassageAlert(stimulus), (0, _emotion.jsx)("div", {
|
|
157
168
|
css: this.props.styles.section
|
|
158
169
|
}, (0, _emotion.jsx)(_quizCommon.TextInput, {
|
|
159
170
|
messages: this.inputErrors('title'),
|
|
@@ -191,9 +202,11 @@ var StimulusEditInfo = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.defau
|
|
|
191
202
|
modifyStimulus: _propTypes.default.func.isRequired,
|
|
192
203
|
setTitleRef: _propTypes.default.func,
|
|
193
204
|
stimulusOrientationEnabled: _propTypes.default.bool.isRequired,
|
|
194
|
-
styles: _propTypes.default.object
|
|
205
|
+
styles: _propTypes.default.object,
|
|
206
|
+
shuffleQuestionsEnabled: _propTypes.default.bool
|
|
195
207
|
}, _StimulusEditInfo.defaultProps = {
|
|
196
208
|
isBankedContent: false,
|
|
209
|
+
shuffleQuestionsEnabled: false,
|
|
197
210
|
setTitleRef: function setTitleRef() {}
|
|
198
211
|
}, _StimulusEditInfo)) || _class);
|
|
199
212
|
exports.StimulusEditInfo = StimulusEditInfo;
|
|
@@ -15,13 +15,13 @@ var _reactImmutableProptypes = _interopRequireDefault(require("react-immutable-p
|
|
|
15
15
|
var _uiIcons = require("@instructure/ui-icons");
|
|
16
16
|
var _emotion = require("@instructure/emotion");
|
|
17
17
|
var _uiText = require("@instructure/ui-text");
|
|
18
|
+
var _quizCommon = require("@instructure/quiz-common");
|
|
18
19
|
var _index = _interopRequireDefault(require("../StimulusShowInfo/index.js"));
|
|
19
20
|
var _index2 = _interopRequireDefault(require("../../../../../building/components/resources/ActionButtons/index.js"));
|
|
20
21
|
var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
|
|
21
22
|
var _styles = _interopRequireDefault(require("./styles.js"));
|
|
22
23
|
var _theme = _interopRequireDefault(require("./theme.js"));
|
|
23
24
|
var _index3 = _interopRequireDefault(require("../../../shared/overlay/index.js"));
|
|
24
|
-
var _quizCommon = require("@instructure/quiz-common");
|
|
25
25
|
var _dec, _class, _StimulusShow;
|
|
26
26
|
/** @jsx jsx */
|
|
27
27
|
/* eslint "jsx-a11y/click-events-have-key-events": "warn" */
|
|
@@ -9,7 +9,7 @@ var generateComponentTheme = function generateComponentTheme(_ref) {
|
|
|
9
9
|
breakpoints = _ref.breakpoints,
|
|
10
10
|
transitions = _ref.transitions;
|
|
11
11
|
return {
|
|
12
|
-
wrapperPadding: spacing.
|
|
12
|
+
wrapperPadding: spacing.mediumSmall,
|
|
13
13
|
wrapperTransitionDuration: transitions.duration,
|
|
14
14
|
phoneBreakPoint: "max-width: ".concat(breakpoints.medium),
|
|
15
15
|
phoneWrapperPadding: spacing.medium
|
|
@@ -62,8 +62,8 @@ var PaginatedCollection = (_dec = (0, _quizCommon.withStyleOverrides)(_styles.de
|
|
|
62
62
|
this.getPage(this.props.stateKey, this.props.currentPage, this.props.params);
|
|
63
63
|
}
|
|
64
64
|
}, {
|
|
65
|
-
key: "
|
|
66
|
-
value: function
|
|
65
|
+
key: "UNSAFE_componentWillReceiveProps",
|
|
66
|
+
value: function UNSAFE_componentWillReceiveProps(_ref) {
|
|
67
67
|
var merge = _ref.merge,
|
|
68
68
|
params = _ref.params,
|
|
69
69
|
set = _ref.set,
|
|
@@ -185,8 +185,8 @@ var TimeUnitsInput = /*#__PURE__*/function (_Component) {
|
|
|
185
185
|
return _this;
|
|
186
186
|
}
|
|
187
187
|
(0, _createClass2.default)(TimeUnitsInput, [{
|
|
188
|
-
key: "
|
|
189
|
-
value: function
|
|
188
|
+
key: "UNSAFE_componentWillMount",
|
|
189
|
+
value: function UNSAFE_componentWillMount() {
|
|
190
190
|
var _breakdownSeconds5 = (0, _index.breakdownSeconds)(this.props.timeInSeconds, this.props.includeDays),
|
|
191
191
|
days = _breakdownSeconds5.days,
|
|
192
192
|
hours = _breakdownSeconds5.hours,
|
|
@@ -68,8 +68,8 @@ var giveEditProps = function giveEditProps(ComposedComponent) {
|
|
|
68
68
|
return _this;
|
|
69
69
|
}
|
|
70
70
|
(0, _createClass2.default)(_Class, [{
|
|
71
|
-
key: "
|
|
72
|
-
value: function
|
|
71
|
+
key: "UNSAFE_componentWillMount",
|
|
72
|
+
value: function UNSAFE_componentWillMount() {
|
|
73
73
|
this._uniqId = (0, _uniqueId.default)("".concat(ComposedComponent.displayName, "_"));
|
|
74
74
|
}
|
|
75
75
|
}, {
|
|
@@ -73,7 +73,11 @@ var loadResponses = function loadResponses(state, payload) {
|
|
|
73
73
|
return payload.reduce(modifyResponse, state);
|
|
74
74
|
};
|
|
75
75
|
var markSessionStartedIdentifier = function markSessionStartedIdentifier(state, payload) {
|
|
76
|
-
|
|
76
|
+
var needsUpdate = state.get('browserSessionId') !== payload.browserSessionId || state.get('ipAddress') !== payload.ipAddress;
|
|
77
|
+
return needsUpdate ? state.merge({
|
|
78
|
+
browserSessionId: payload.browserSessionId,
|
|
79
|
+
ipAddress: payload.ipAddress
|
|
80
|
+
}) : state;
|
|
77
81
|
};
|
|
78
82
|
var updateQuizSubmitFlag = function updateQuizSubmitFlag(state, payload) {
|
|
79
83
|
return state.set('submitFlag', payload.value);
|
|
@@ -8,7 +8,7 @@ exports.isTimeUp = isTimeUp;
|
|
|
8
8
|
exports.getResponsesByIds = getResponsesByIds;
|
|
9
9
|
exports.getResponseById = getResponseById;
|
|
10
10
|
exports.getResponseDataByPosition = getResponseDataByPosition;
|
|
11
|
-
exports.getIsTaking = exports.getTimerData = exports.getBrowserSessionId = exports.getCurrentSessionItemPosition = void 0;
|
|
11
|
+
exports.getIsTaking = exports.getTimerData = exports.getIpAddress = exports.getBrowserSessionId = exports.getCurrentSessionItemPosition = void 0;
|
|
12
12
|
var _immutable = require("immutable");
|
|
13
13
|
var _Response = _interopRequireDefault(require("../records/Response.js"));
|
|
14
14
|
var path = 'taking';
|
|
@@ -20,6 +20,10 @@ var getBrowserSessionId = function getBrowserSessionId(state) {
|
|
|
20
20
|
return state.getIn([path, 'browserSessionId']);
|
|
21
21
|
};
|
|
22
22
|
exports.getBrowserSessionId = getBrowserSessionId;
|
|
23
|
+
var getIpAddress = function getIpAddress(state) {
|
|
24
|
+
return state.getIn([path, 'ipAddress']);
|
|
25
|
+
};
|
|
26
|
+
exports.getIpAddress = getIpAddress;
|
|
23
27
|
var getTimerData = function getTimerData(state) {
|
|
24
28
|
return state.getIn([path, 'timerData'], (0, _immutable.Map)());
|
|
25
29
|
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.getClientIpAddress = void 0;
|
|
8
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
9
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
10
|
+
var _Fetcher = _interopRequireDefault(require("./Fetcher.js"));
|
|
11
|
+
var getClientIpAddress = /*#__PURE__*/function () {
|
|
12
|
+
var _ref = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee(quizSessionId) {
|
|
13
|
+
var url, fetcher, _yield$fetcher$get, ip;
|
|
14
|
+
return _regenerator.default.wrap(function _callee$(_context) {
|
|
15
|
+
while (1) {
|
|
16
|
+
switch (_context.prev = _context.next) {
|
|
17
|
+
case 0:
|
|
18
|
+
_context.prev = 0;
|
|
19
|
+
url = "/api/quiz_sessions/".concat(quizSessionId, "/get_ip_address");
|
|
20
|
+
fetcher = new _Fetcher.default();
|
|
21
|
+
_context.next = 5;
|
|
22
|
+
return fetcher.get(url);
|
|
23
|
+
case 5:
|
|
24
|
+
_yield$fetcher$get = _context.sent;
|
|
25
|
+
ip = _yield$fetcher$get.ip;
|
|
26
|
+
return _context.abrupt("return", ip);
|
|
27
|
+
case 10:
|
|
28
|
+
_context.prev = 10;
|
|
29
|
+
_context.t0 = _context["catch"](0);
|
|
30
|
+
console.error(_context.t0);
|
|
31
|
+
return _context.abrupt("return", null);
|
|
32
|
+
case 14:
|
|
33
|
+
case "end":
|
|
34
|
+
return _context.stop();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}, _callee, null, [[0, 10]]);
|
|
38
|
+
}));
|
|
39
|
+
return function getClientIpAddress(_x) {
|
|
40
|
+
return _ref.apply(this, arguments);
|
|
41
|
+
};
|
|
42
|
+
}();
|
|
43
|
+
exports.getClientIpAddress = getClientIpAddress;
|
|
@@ -17,8 +17,10 @@ function serializeEvent(action, store) {
|
|
|
17
17
|
var state = store.getState();
|
|
18
18
|
var quizSession = (0, _quizSessions.getActiveQuizSession)(state);
|
|
19
19
|
var defaultEventData = {
|
|
20
|
+
userAgent: navigator.userAgent,
|
|
20
21
|
browserSessionId: (0, _taking.getBrowserSessionId)(state),
|
|
21
|
-
clientTimestamp: new Date()
|
|
22
|
+
clientTimestamp: new Date(),
|
|
23
|
+
ipAddress: (0, _taking.getIpAddress)(state)
|
|
22
24
|
};
|
|
23
25
|
var authoritativeData = {
|
|
24
26
|
accountUuid: quizSession.accountUuid,
|
package/lib/index.js
CHANGED
|
@@ -118,6 +118,7 @@ var _exportNames = {
|
|
|
118
118
|
setThemeByKey: true,
|
|
119
119
|
getActiveTheme: true,
|
|
120
120
|
setActiveTheme: true,
|
|
121
|
+
getClientIpAddress: true,
|
|
121
122
|
createQuizEntryRegrade: true,
|
|
122
123
|
getQuizEntry: true,
|
|
123
124
|
moveQuizEntry: true,
|
|
@@ -203,6 +204,7 @@ var _exportNames = {
|
|
|
203
204
|
getQuizById: true,
|
|
204
205
|
getActiveQuizId: true,
|
|
205
206
|
getQuizEntryById: true,
|
|
207
|
+
getQuizEntriesByQuizId: true,
|
|
206
208
|
isActiveQuizWorkingInstanceOneQuestionAtATime: true,
|
|
207
209
|
getActiveQuiz: true,
|
|
208
210
|
getItemById: true,
|
|
@@ -891,6 +893,12 @@ Object.defineProperty(exports, "setActiveTheme", {
|
|
|
891
893
|
return _quizCommon.setActiveTheme;
|
|
892
894
|
}
|
|
893
895
|
});
|
|
896
|
+
Object.defineProperty(exports, "getClientIpAddress", {
|
|
897
|
+
enumerable: true,
|
|
898
|
+
get: function get() {
|
|
899
|
+
return _getClientIpAddress.getClientIpAddress;
|
|
900
|
+
}
|
|
901
|
+
});
|
|
894
902
|
Object.defineProperty(exports, "createQuizEntryRegrade", {
|
|
895
903
|
enumerable: true,
|
|
896
904
|
get: function get() {
|
|
@@ -1383,6 +1391,12 @@ Object.defineProperty(exports, "getQuizEntryById", {
|
|
|
1383
1391
|
return _quizzes3.getQuizEntryById;
|
|
1384
1392
|
}
|
|
1385
1393
|
});
|
|
1394
|
+
Object.defineProperty(exports, "getQuizEntriesByQuizId", {
|
|
1395
|
+
enumerable: true,
|
|
1396
|
+
get: function get() {
|
|
1397
|
+
return _quizzes3.getQuizEntriesByQuizId;
|
|
1398
|
+
}
|
|
1399
|
+
});
|
|
1386
1400
|
Object.defineProperty(exports, "isActiveQuizWorkingInstanceOneQuestionAtATime", {
|
|
1387
1401
|
enumerable: true,
|
|
1388
1402
|
get: function get() {
|
|
@@ -1571,6 +1585,7 @@ var _sessionStore = require("./common/util/sessionStore.js");
|
|
|
1571
1585
|
var _printUtils = require("./common/util/printUtils.js");
|
|
1572
1586
|
var _rceChecker = require("./common/util/rceChecker.js");
|
|
1573
1587
|
var _quizCommon = require("@instructure/quiz-common");
|
|
1588
|
+
var _getClientIpAddress = require("./common/util/getClientIpAddress.js");
|
|
1574
1589
|
var _quizEntryRegrades = require("./grading/api/quizEntryRegrades.js");
|
|
1575
1590
|
var _quizEntries = require("./building/api/quizEntries.js");
|
|
1576
1591
|
var _items = require("./building/api/items.js");
|