@instructure/quiz-core 18.5.1-rc.8 → 18.6.0

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 (42) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnalysisMetric/presenter.js +8 -5
  3. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/AggregationType/presenter.js +11 -21
  4. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/ChoiceType/presenter.js +5 -5
  5. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/MatchingType.js +15 -25
  6. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/MatchingTypeTable/presenter.js +4 -1
  7. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/OrderingType.js +87 -0
  8. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/index.js +2 -1
  9. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/presenter.js +8 -2
  10. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/shared/AfsPartsContainer/index.js +1 -0
  11. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/shared/AfsPartsContainer/presenter.js +73 -0
  12. package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/index.js +1 -0
  13. package/es/reporting/components/resources/NewQuizAndItemAnalysis/ReportCard/presenter.js +9 -9
  14. package/es/reporting/components/resources/NewQuizAndItemAnalysis/ReportCard/theme.js +1 -1
  15. package/es/reporting/components/resources/NewQuizAndItemAnalysis/errorMessages.js +3 -0
  16. package/es/reporting/components/resources/NewQuizAndItemAnalysis/exportReports.js +65 -0
  17. package/es/reporting/components/resources/NewQuizAndItemAnalysis/utils.js +4 -0
  18. package/es/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisState.js +2 -0
  19. package/es/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisStatePresenter.js +41 -1
  20. package/es/reporting/components/resources/ReportCard/theme.js +1 -1
  21. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnalysisMetric/presenter.js +8 -5
  22. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/AggregationType/presenter.js +15 -24
  23. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/ChoiceType/presenter.js +5 -5
  24. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/MatchingType.js +19 -29
  25. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/MatchingTypeTable/presenter.js +5 -1
  26. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/OrderingType.js +115 -0
  27. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/index.js +9 -1
  28. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/presenter.js +7 -1
  29. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/shared/AfsPartsContainer/index.js +13 -0
  30. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/shared/AfsPartsContainer/presenter.js +92 -0
  31. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/index.js +1 -0
  32. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/ReportCard/presenter.js +9 -9
  33. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/ReportCard/theme.js +1 -1
  34. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/errorMessages.js +7 -1
  35. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/exportReports.js +80 -0
  36. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/utils.js +10 -2
  37. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisState.js +3 -0
  38. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisStatePresenter.js +43 -1
  39. package/lib/reporting/components/resources/ReportCard/theme.js +1 -1
  40. package/package.json +11 -10
  41. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/AggregationType/theme.js +0 -5
  42. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/AggregationType/theme.js +0 -12
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.getNotEnoughDataAvailableError = exports.getMinimumThreeGradedSubmissionError = exports.getOngoingReportGenerationError = exports.getInsufficentSubmissionNumberError = exports.getReportGenerationFailure = exports.getLastReportGenerationFailed = exports.getFailedToFetchReports = void 0;
8
+ exports.getNotEnoughDataAvailableError = exports.getMinimumThreeGradedSubmissionError = exports.getOngoingReportGenerationError = exports.getInsufficentSubmissionNumberError = exports.getReportGenerationFailure = exports.getLastReportGenerationFailed = exports.getFailedToExportReports = exports.getFailedToFetchReports = void 0;
9
9
 
10
10
  var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
11
11
 
@@ -15,6 +15,12 @@ var getFailedToFetchReports = function getFailedToFetchReports() {
15
15
 
16
16
  exports.getFailedToFetchReports = getFailedToFetchReports;
17
17
 
18
+ var getFailedToExportReports = function getFailedToExportReports() {
19
+ return (0, _formatMessage.default)('An error has occurred while exporting this report. Please try again.');
20
+ };
21
+
22
+ exports.getFailedToExportReports = getFailedToExportReports;
23
+
18
24
  var getLastReportGenerationFailed = function getLastReportGenerationFailed() {
19
25
  return (0, _formatMessage.default)('Report generation failed. Please try again.');
20
26
  };
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.exportReports = void 0;
9
+
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
+
14
+ var _errorMessages = require("./errorMessages.js");
15
+
16
+ var _contentDisposition = _interopRequireDefault(require("content-disposition"));
17
+
18
+ var exportReports = /*#__PURE__*/function () {
19
+ var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(_ref) {
20
+ var getAnalysesExport, activeQuizId, filter, format, saveFile, addError, response, dispositionHeader, disposition, filename, blob;
21
+ return _regenerator.default.wrap(function _callee$(_context) {
22
+ while (1) {
23
+ switch (_context.prev = _context.next) {
24
+ case 0:
25
+ getAnalysesExport = _ref.getAnalysesExport, activeQuizId = _ref.activeQuizId, filter = _ref.filter, format = _ref.format, saveFile = _ref.saveFile, addError = _ref.addError;
26
+ _context.prev = 1;
27
+ _context.next = 4;
28
+ return getAnalysesExport(activeQuizId, format, filter);
29
+
30
+ case 4:
31
+ response = _context.sent;
32
+ dispositionHeader = response.headers.get('Content-Disposition');
33
+
34
+ if (dispositionHeader) {
35
+ _context.next = 8;
36
+ break;
37
+ }
38
+
39
+ throw new Error('Response contains no Content-Disposition header.');
40
+
41
+ case 8:
42
+ disposition = _contentDisposition.default.parse(dispositionHeader);
43
+ filename = disposition.parameters.filename;
44
+
45
+ if (filename) {
46
+ _context.next = 12;
47
+ break;
48
+ }
49
+
50
+ throw new Error('Cannot determine filename to save.');
51
+
52
+ case 12:
53
+ _context.next = 14;
54
+ return response.blob();
55
+
56
+ case 14:
57
+ blob = _context.sent;
58
+ saveFile(blob, filename);
59
+ _context.next = 21;
60
+ break;
61
+
62
+ case 18:
63
+ _context.prev = 18;
64
+ _context.t0 = _context["catch"](1);
65
+ addError((0, _errorMessages.getFailedToExportReports)());
66
+
67
+ case 21:
68
+ case "end":
69
+ return _context.stop();
70
+ }
71
+ }
72
+ }, _callee, null, [[1, 18]]);
73
+ }));
74
+
75
+ return function exportReports(_x) {
76
+ return _ref2.apply(this, arguments);
77
+ };
78
+ }();
79
+
80
+ exports.exportReports = exportReports;
@@ -5,10 +5,12 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.getSanitizedMetricValue = void 0;
8
+ exports.getSanitizedMetricValue = exports.saveFile = void 0;
9
9
 
10
10
  var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
11
11
 
12
+ var _fileSaver = require("file-saver");
13
+
12
14
  var formatNumbers = function formatNumbers(value) {
13
15
  if (typeof value === 'number') {
14
16
  return _formatMessage.default.number(value);
@@ -26,4 +28,10 @@ var getSanitizedMetricValue = function getSanitizedMetricValue(value, suffix) {
26
28
  return suffix ? formattedValue + suffix : formattedValue;
27
29
  };
28
30
 
29
- exports.getSanitizedMetricValue = getSanitizedMetricValue;
31
+ exports.getSanitizedMetricValue = getSanitizedMetricValue;
32
+
33
+ var saveFile = function saveFile(file, fileName) {
34
+ (0, _fileSaver.saveAs)(file, fileName);
35
+ };
36
+
37
+ exports.saveFile = saveFile;
@@ -18,6 +18,8 @@ var _getItemAnalyses = require("../../../api/getItemAnalyses.js");
18
18
 
19
19
  var _getAnalysesStatus = require("../../../api/getAnalysesStatus.js");
20
20
 
21
+ var _getAnalysesExport = require("../../../api/getAnalysesExport.js");
22
+
21
23
  var _reactRedux = require("../../../../common/react-redux.js");
22
24
 
23
25
  var _redux = require("redux");
@@ -40,6 +42,7 @@ function mapStateToProps(state, ownProps) {
40
42
  fetchQuizAnalysis: _getQuizAnalysis.getQuizAnalysis,
41
43
  fetchItemAnalyses: _getItemAnalyses.getItemAnalyses,
42
44
  fetchAnalysesStatus: _getAnalysesStatus.getAnalysesStatus,
45
+ getAnalysesExport: _getAnalysesExport.getAnalysesExport,
43
46
  pollingInterval: ownProps.pollingInterval || DEFAULT_POLLING_INTERVAL
44
47
  };
45
48
  }
@@ -31,6 +31,10 @@ var _errorCodes = require("./errorCodes.js");
31
31
 
32
32
  var _generateReports2 = require("./generateReports.js");
33
33
 
34
+ var _exportReports2 = require("./exportReports.js");
35
+
36
+ var _utils = require("./utils.js");
37
+
34
38
  var withAnalysisStatePresenter = function withAnalysisStatePresenter(OriginalComponent) {
35
39
  var WithAnalysisStatePresenter = function WithAnalysisStatePresenter(_ref) {
36
40
  var quizAnalysis = _ref.quizAnalysis,
@@ -48,11 +52,12 @@ var withAnalysisStatePresenter = function withAnalysisStatePresenter(OriginalCom
48
52
  generateAnalysis = _ref.generateAnalysis,
49
53
  fetchQuizAnalysis = _ref.fetchQuizAnalysis,
50
54
  fetchItemAnalyses = _ref.fetchItemAnalyses,
55
+ getAnalysesExport = _ref.getAnalysesExport,
51
56
  fetchAnalysesStatus = _ref.fetchAnalysesStatus,
52
57
  statusPollingInProgress = _ref.statusPollingInProgress,
53
58
  setStatusPollingInProgress = _ref.setStatusPollingInProgress,
54
59
  pollingInterval = _ref.pollingInterval,
55
- passThroughProps = (0, _objectWithoutProperties2.default)(_ref, ["quizAnalysis", "itemAnalyses", "fetchInProgress", "generationInProgress", "analysisError", "setQuizAnalysis", "addError", "setItemAnalyses", "setFetchInProgress", "setGenerationInProgress", "setAnalysisError", "activeQuizId", "generateAnalysis", "fetchQuizAnalysis", "fetchItemAnalyses", "fetchAnalysesStatus", "statusPollingInProgress", "setStatusPollingInProgress", "pollingInterval"]);
60
+ passThroughProps = (0, _objectWithoutProperties2.default)(_ref, ["quizAnalysis", "itemAnalyses", "fetchInProgress", "generationInProgress", "analysisError", "setQuizAnalysis", "addError", "setItemAnalyses", "setFetchInProgress", "setGenerationInProgress", "setAnalysisError", "activeQuizId", "generateAnalysis", "fetchQuizAnalysis", "fetchItemAnalyses", "getAnalysesExport", "fetchAnalysesStatus", "statusPollingInProgress", "setStatusPollingInProgress", "pollingInterval"]);
56
61
  WithAnalysisStatePresenter.displayName = "WithAnalysisStatePresenter(".concat(OriginalComponent.displayName || OriginalComponent.name, ")");
57
62
 
58
63
  var _useState = (0, _react.useState)(false),
@@ -122,6 +127,41 @@ var withAnalysisStatePresenter = function withAnalysisStatePresenter(OriginalCom
122
127
  return _generateReports.apply(this, arguments);
123
128
  }
124
129
 
130
+ function exportReports(_x) {
131
+ return _exportReports.apply(this, arguments);
132
+ }
133
+
134
+ function _exportReports() {
135
+ _exportReports = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(format) {
136
+ var filter,
137
+ exportConfig,
138
+ _args4 = arguments;
139
+ return _regenerator.default.wrap(function _callee4$(_context4) {
140
+ while (1) {
141
+ switch (_context4.prev = _context4.next) {
142
+ case 0:
143
+ filter = _args4.length > 1 && _args4[1] !== void 0 ? _args4[1] : 'last_attempt';
144
+ exportConfig = {
145
+ getAnalysesExport: getAnalysesExport,
146
+ format: format,
147
+ filter: filter,
148
+ activeQuizId: activeQuizId,
149
+ addError: addError,
150
+ saveFile: _utils.saveFile
151
+ };
152
+ _context4.next = 4;
153
+ return (0, _exportReports2.exportReports)(exportConfig);
154
+
155
+ case 4:
156
+ case "end":
157
+ return _context4.stop();
158
+ }
159
+ }
160
+ }, _callee4);
161
+ }));
162
+ return _exportReports.apply(this, arguments);
163
+ }
164
+
125
165
  (0, _react.useEffect)(function () {
126
166
  var fetchIfNeeded = /*#__PURE__*/function () {
127
167
  var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
@@ -193,6 +233,7 @@ var withAnalysisStatePresenter = function withAnalysisStatePresenter(OriginalCom
193
233
  generationInProgress: generationInProgress,
194
234
  analysisError: analysisError,
195
235
  generateReports: generateReports,
236
+ exportReports: exportReports,
196
237
  analysisFetchError: analysisFetchError
197
238
  }, passThroughProps));
198
239
  };
@@ -214,6 +255,7 @@ var withAnalysisStatePresenter = function withAnalysisStatePresenter(OriginalCom
214
255
  fetchQuizAnalysis: _propTypes.default.func.isRequired,
215
256
  fetchItemAnalyses: _propTypes.default.func.isRequired,
216
257
  fetchAnalysesStatus: _propTypes.default.func.isRequired,
258
+ getAnalysesExport: _propTypes.default.func.isRequired,
217
259
  addError: _propTypes.default.func.isRequired,
218
260
  pollingInterval: _propTypes.default.number.isRequired,
219
261
  generateAnalysis: _propTypes.default.func.isRequired // from LTI, f(filter: string, onError?: func(error))
@@ -10,7 +10,7 @@ function generator(_ref) {
10
10
  borders = _ref.borders;
11
11
  return {
12
12
  cardHeight: '6rem',
13
- cardWidth: '16rem',
13
+ cardWidth: '19.5rem',
14
14
  cardPadding: spacing.medium,
15
15
  cardMargin: spacing.xSmall,
16
16
  cardBoxShadow: '1px 1px 3px 0 #ddd',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instructure/quiz-core",
3
- "version": "18.5.1-rc.8+846b42d6f",
3
+ "version": "18.6.0",
4
4
  "license": "MIT",
5
5
  "description": "The Quiz React SDK by Instructure Inc.",
6
6
  "author": "Instructure, Inc. Engineering and Product Design",
@@ -43,11 +43,11 @@
43
43
  "dependencies": {
44
44
  "@instructure/grading-utils": "^1.0.0",
45
45
  "@instructure/outcomes-ui": "^2.1.9",
46
- "@instructure/quiz-common": "18.5.1-rc.8+846b42d6f",
47
- "@instructure/quiz-i18n": "18.5.1-rc.8+846b42d6f",
48
- "@instructure/quiz-interactions": "18.5.1-rc.8+846b42d6f",
49
- "@instructure/quiz-number-input": "18.5.1-rc.8+846b42d6f",
50
- "@instructure/quiz-rce": "18.5.1-rc.8+846b42d6f",
46
+ "@instructure/quiz-common": "^18.6.0",
47
+ "@instructure/quiz-i18n": "^18.6.0",
48
+ "@instructure/quiz-interactions": "^18.6.0",
49
+ "@instructure/quiz-number-input": "^18.6.0",
50
+ "@instructure/quiz-rce": "^18.6.0",
51
51
  "@instructure/ui-a11y-content": "^7.22.1",
52
52
  "@instructure/ui-alerts": "^7.22.1",
53
53
  "@instructure/ui-avatar": "^7.22.1",
@@ -106,9 +106,10 @@
106
106
  "d3-transition": "^1",
107
107
  "date-fns": "^1.28.0",
108
108
  "eventemitter3": "^3.1.0",
109
+ "file-saver": "~2.0.5",
109
110
  "humps": "^2.0.0",
110
111
  "immutable": "^3.8.1",
111
- "instructure-validations": "18.5.1-rc.8+846b42d6f",
112
+ "instructure-validations": "^18.6.0",
112
113
  "ipaddr.js": "^1.5.4",
113
114
  "isomorphic-fetch": "^2.2.0",
114
115
  "isuuid": "^0.1.0",
@@ -140,7 +141,7 @@
140
141
  "uuid": "^3.2.1"
141
142
  },
142
143
  "devDependencies": {
143
- "@instructure/quiz-scripts": "18.5.0",
144
+ "@instructure/quiz-scripts": "^18.6.0",
144
145
  "@instructure/ui-axe-check": "^7.22.1",
145
146
  "@instructure/ui-babel-preset": "^7.22.1",
146
147
  "@instructure/ui-karma-config": "^7.22.1",
@@ -159,7 +160,7 @@
159
160
  "intl": "^1.2.4",
160
161
  "jquery": "^2.2.3",
161
162
  "most-subject": "^5.3.0",
162
- "quiz-presets": "18.5.1-rc.8+846b42d6f",
163
+ "quiz-presets": "^18.6.0",
163
164
  "react": "^16.8.6",
164
165
  "react-addons-test-utils": "^15.6.2",
165
166
  "react-dom": "^16.8.6",
@@ -175,5 +176,5 @@
175
176
  "publishConfig": {
176
177
  "access": "public"
177
178
  },
178
- "gitHead": "846b42d6fbb1d77bb36641c1fa31725bb5b42b47"
179
+ "gitHead": "dddcaa8802c8344705537cacfbc0b9638c25be4c"
179
180
  }
@@ -1,5 +0,0 @@
1
- export default function generator() {
2
- return {
3
- tableBottomPadding: 0
4
- };
5
- }
@@ -1,12 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = generator;
7
-
8
- function generator() {
9
- return {
10
- tableBottomPadding: 0
11
- };
12
- }