@instructure/quiz-core 18.4.1-rc.8 → 18.5.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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,23 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [18.5.0](https://gerrit.instructure.com/quizzes-ui/compare/v18.4.0...v18.5.0) (2023-11-01)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **accessibility:** fix quiz question navigation sidebar answered/unanswered screen reader content ([a0a425c](https://gerrit.instructure.com/quizzes-ui/commits/a0a425c5bac1436f7c55214617d7a82bd07221e5))
12
+ * **styles:** change fontsizes in score distribution chart ([1403d39](https://gerrit.instructure.com/quizzes-ui/commits/1403d39fdef30e950227a3b2fe64adf240af4586))
13
+
14
+
15
+ ### Features
16
+
17
+ * **Reports:** add api call for item analyses export ([b738b79](https://gerrit.instructure.com/quizzes-ui/commits/b738b799598bad6be16d070e16e14c1a33df3d24))
18
+
19
+
20
+
21
+
22
+
6
23
  # [18.4.0](https://gerrit.instructure.com/quizzes-ui/compare/v18.3.0...v18.4.0) (2023-10-17)
7
24
 
8
25
 
@@ -0,0 +1,54 @@
1
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
+ import Fetcher from "../../common/util/Fetcher.js";
4
+
5
+ var getFetcher = function getFetcher(format) {
6
+ var mimeType = formatsToMimeTypes.get(format);
7
+
8
+ if (!mimeType) {
9
+ throw new Error("Unknown export format ".concat(format, "!"));
10
+ }
11
+
12
+ return new Fetcher({
13
+ headers: {
14
+ 'Accept': mimeType
15
+ },
16
+ asyncResponseHandler: function asyncResponseHandler(response) {
17
+ return response;
18
+ }
19
+ });
20
+ };
21
+
22
+ export var csvFormat = 'csv';
23
+ var formatsToMimeTypes = new Map().set(csvFormat, 'text/csv');
24
+ export var getAnalysesExport = /*#__PURE__*/function () {
25
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(quizId, format) {
26
+ var filter,
27
+ fetcher,
28
+ url,
29
+ _args = arguments;
30
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
31
+ while (1) {
32
+ switch (_context.prev = _context.next) {
33
+ case 0:
34
+ filter = _args.length > 2 && _args[2] !== void 0 ? _args[2] : 'last_attempt';
35
+ fetcher = getFetcher(format);
36
+ url = "/api/quizzes/".concat(quizId, "/analyses/export?filter=").concat(filter);
37
+ _context.next = 5;
38
+ return fetcher.get(url);
39
+
40
+ case 5:
41
+ return _context.abrupt("return", _context.sent);
42
+
43
+ case 6:
44
+ case "end":
45
+ return _context.stop();
46
+ }
47
+ }
48
+ }, _callee);
49
+ }));
50
+
51
+ return function getAnalysesExport(_x, _x2) {
52
+ return _ref.apply(this, arguments);
53
+ };
54
+ }();
@@ -5,10 +5,6 @@ import React, { Component } from 'react';
5
5
  import { PropTypes } from '@instructure/quiz-interactions';
6
6
  import { ChoiceType } from "./ChoiceType/presenter.js";
7
7
  import { answerSummaryPropType } from "../propTypes.js";
8
- var afsTableComponentMap = new Map();
9
- afsTableComponentMap.set('true-false', ChoiceType);
10
- afsTableComponentMap.set('choice', ChoiceType);
11
- afsTableComponentMap.set('multi-answer', ChoiceType);
12
8
  export var AnswerFrequencySummary = /*#__PURE__*/function (_Component) {
13
9
  _inherits(AnswerFrequencySummary, _Component);
14
10
 
@@ -24,13 +20,22 @@ export var AnswerFrequencySummary = /*#__PURE__*/function (_Component) {
24
20
  }
25
21
 
26
22
  _this = _super.call.apply(_super, [this].concat(args));
23
+ _this.afsTableComponentMap = new Map();
24
+
25
+ _this.addAfsComponentsByFlags = function (afsFlags) {
26
+ if (afsFlags.formulaEnabled) {// this.afsTableComponentMap.set('formula', Formula)
27
+ }
28
+ };
27
29
 
28
30
  _this.render = function () {
29
31
  var _this$props = _this.props,
30
32
  itemId = _this$props.itemId,
31
33
  answerSummary = _this$props.answerSummary,
32
- interactionType = _this$props.interactionType;
33
- var AfsTableComponent = afsTableComponentMap.get(interactionType);
34
+ interactionType = _this$props.interactionType,
35
+ afsFlags = _this$props.afsFlags;
36
+ afsFlags && _this.addAfsComponentsByFlags(afsFlags);
37
+
38
+ var AfsTableComponent = _this.afsTableComponentMap.get(interactionType);
34
39
 
35
40
  if (!AfsTableComponent) {
36
41
  return /*#__PURE__*/React.createElement(React.Fragment, null);
@@ -42,13 +47,23 @@ export var AnswerFrequencySummary = /*#__PURE__*/function (_Component) {
42
47
  });
43
48
  };
44
49
 
50
+ _this.afsTableComponentMap.set('true-false', ChoiceType);
51
+
52
+ _this.afsTableComponentMap.set('choice', ChoiceType);
53
+
54
+ _this.afsTableComponentMap.set('multi-answer', ChoiceType);
55
+
45
56
  return _this;
46
57
  }
47
58
 
48
59
  return AnswerFrequencySummary;
49
60
  }(Component);
50
61
  AnswerFrequencySummary.propTypes = {
51
- itemId: PropTypes.number,
52
- answerSummary: answerSummaryPropType,
53
- interactionType: PropTypes.string
62
+ itemId: PropTypes.number.isRequired,
63
+ answerSummary: answerSummaryPropType.isRequired,
64
+ interactionType: PropTypes.string.isRequired,
65
+ afsFlags: PropTypes.shape({
66
+ formulaEnabled: PropTypes.bool.isRequired,
67
+ matchingEnabled: PropTypes.bool.isRequired
68
+ })
54
69
  }.isRequired;
@@ -5,7 +5,11 @@ import { NewItemAnalysis as NewItemAnalysisPresenter } from "./presenter.js";
5
5
  function mapStateToProps(_state) {
6
6
  return {
7
7
  // This would be able to switch of all AFS Tables
8
- showFrequencyTable: featureOn('show_improved_item_analysis_frequency_table')
8
+ showFrequencyTable: featureOn('show_improved_item_analysis_frequency_table'),
9
+ afsFlags: {
10
+ formulaEnabled: featureOn('ia_formula_afs'),
11
+ matchingEnabled: featureOn('ia_matching_afs')
12
+ }
9
13
  };
10
14
  }
11
15
 
@@ -37,7 +37,7 @@ import AnalysisPopoverMetric from "../AnalysisPopoverMetric/index.js";
37
37
  import classnames from 'classnames';
38
38
  import { interactionTypesNameDictionary } from "../../../../../common/util/interactionTypeMetadata.js";
39
39
  import AnswerFrequencySummary from "../AnswerFrequencySummary/index.js";
40
- import { itemAnalysisPropType } from "../propTypes.js";
40
+ import { afsFlags, itemAnalysisPropType } from "../propTypes.js";
41
41
  import { Flex } from '@instructure/ui-flex';
42
42
  import { RichContentRenderer } from '@instructure/quiz-rce';
43
43
  import { ensureRCEContentIsLoaded } from "../../../../../common/util/rceChecker.js";
@@ -201,7 +201,8 @@ export var NewItemAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_t
201
201
  }, /*#__PURE__*/React.createElement(AnswerFrequencySummary, {
202
202
  itemId: itemId,
203
203
  answerSummary: answer_summary,
204
- interactionType: interactionType
204
+ interactionType: interactionType,
205
+ afsFlags: afsFlags
205
206
  }))));
206
207
  };
207
208
 
@@ -284,5 +285,6 @@ export var NewItemAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_t
284
285
  return NewItemAnalysis;
285
286
  }(Component), _class2.propTypes = {
286
287
  itemAnalysis: itemAnalysisPropType,
287
- showFrequencyTable: PropTypes.bool.isRequired
288
+ showFrequencyTable: PropTypes.bool.isRequired,
289
+ afsFlags: afsFlags
288
290
  }.isRequired, _temp)) || _class);
@@ -56,4 +56,8 @@ export var choiceTypeAnswerSummaryPropType = PropTypes.shape({
56
56
  })),
57
57
  no_answer: noAnswerPropType
58
58
  });
59
- export var answerSummaryPropType = PropTypes.oneOfType([choiceTypeAnswerSummaryPropType]);
59
+ export var answerSummaryPropType = PropTypes.oneOfType([choiceTypeAnswerSummaryPropType]);
60
+ export var afsFlags = PropTypes.shape({
61
+ formulaEnabled: PropTypes.bool.isRequired,
62
+ matchingEnabled: PropTypes.bool.isRequired
63
+ });
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.getAnalysesExport = exports.csvFormat = void 0;
9
+
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
+
14
+ var _Fetcher = _interopRequireDefault(require("../../common/util/Fetcher.js"));
15
+
16
+ var getFetcher = function getFetcher(format) {
17
+ var mimeType = formatsToMimeTypes.get(format);
18
+
19
+ if (!mimeType) {
20
+ throw new Error("Unknown export format ".concat(format, "!"));
21
+ }
22
+
23
+ return new _Fetcher.default({
24
+ headers: {
25
+ 'Accept': mimeType
26
+ },
27
+ asyncResponseHandler: function asyncResponseHandler(response) {
28
+ return response;
29
+ }
30
+ });
31
+ };
32
+
33
+ var csvFormat = 'csv';
34
+ exports.csvFormat = csvFormat;
35
+ var formatsToMimeTypes = new Map().set(csvFormat, 'text/csv');
36
+
37
+ var getAnalysesExport = /*#__PURE__*/function () {
38
+ var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(quizId, format) {
39
+ var filter,
40
+ fetcher,
41
+ url,
42
+ _args = arguments;
43
+ return _regenerator.default.wrap(function _callee$(_context) {
44
+ while (1) {
45
+ switch (_context.prev = _context.next) {
46
+ case 0:
47
+ filter = _args.length > 2 && _args[2] !== void 0 ? _args[2] : 'last_attempt';
48
+ fetcher = getFetcher(format);
49
+ url = "/api/quizzes/".concat(quizId, "/analyses/export?filter=").concat(filter);
50
+ _context.next = 5;
51
+ return fetcher.get(url);
52
+
53
+ case 5:
54
+ return _context.abrupt("return", _context.sent);
55
+
56
+ case 6:
57
+ case "end":
58
+ return _context.stop();
59
+ }
60
+ }
61
+ }, _callee);
62
+ }));
63
+
64
+ return function getAnalysesExport(_x, _x2) {
65
+ return _ref.apply(this, arguments);
66
+ };
67
+ }();
68
+
69
+ exports.getAnalysesExport = getAnalysesExport;
@@ -23,11 +23,6 @@ var _presenter = require("./ChoiceType/presenter.js");
23
23
 
24
24
  var _propTypes = require("../propTypes.js");
25
25
 
26
- var afsTableComponentMap = new Map();
27
- afsTableComponentMap.set('true-false', _presenter.ChoiceType);
28
- afsTableComponentMap.set('choice', _presenter.ChoiceType);
29
- afsTableComponentMap.set('multi-answer', _presenter.ChoiceType);
30
-
31
26
  var AnswerFrequencySummary = /*#__PURE__*/function (_Component) {
32
27
  (0, _inherits2.default)(AnswerFrequencySummary, _Component);
33
28
 
@@ -43,13 +38,22 @@ var AnswerFrequencySummary = /*#__PURE__*/function (_Component) {
43
38
  }
44
39
 
45
40
  _this = _super.call.apply(_super, [this].concat(args));
41
+ _this.afsTableComponentMap = new Map();
42
+
43
+ _this.addAfsComponentsByFlags = function (afsFlags) {
44
+ if (afsFlags.formulaEnabled) {// this.afsTableComponentMap.set('formula', Formula)
45
+ }
46
+ };
46
47
 
47
48
  _this.render = function () {
48
49
  var _this$props = _this.props,
49
50
  itemId = _this$props.itemId,
50
51
  answerSummary = _this$props.answerSummary,
51
- interactionType = _this$props.interactionType;
52
- var AfsTableComponent = afsTableComponentMap.get(interactionType);
52
+ interactionType = _this$props.interactionType,
53
+ afsFlags = _this$props.afsFlags;
54
+ afsFlags && _this.addAfsComponentsByFlags(afsFlags);
55
+
56
+ var AfsTableComponent = _this.afsTableComponentMap.get(interactionType);
53
57
 
54
58
  if (!AfsTableComponent) {
55
59
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null);
@@ -61,6 +65,12 @@ var AnswerFrequencySummary = /*#__PURE__*/function (_Component) {
61
65
  });
62
66
  };
63
67
 
68
+ _this.afsTableComponentMap.set('true-false', _presenter.ChoiceType);
69
+
70
+ _this.afsTableComponentMap.set('choice', _presenter.ChoiceType);
71
+
72
+ _this.afsTableComponentMap.set('multi-answer', _presenter.ChoiceType);
73
+
64
74
  return _this;
65
75
  }
66
76
 
@@ -69,7 +79,11 @@ var AnswerFrequencySummary = /*#__PURE__*/function (_Component) {
69
79
 
70
80
  exports.AnswerFrequencySummary = AnswerFrequencySummary;
71
81
  AnswerFrequencySummary.propTypes = {
72
- itemId: _quizInteractions.PropTypes.number,
73
- answerSummary: _propTypes.answerSummaryPropType,
74
- interactionType: _quizInteractions.PropTypes.string
82
+ itemId: _quizInteractions.PropTypes.number.isRequired,
83
+ answerSummary: _propTypes.answerSummaryPropType.isRequired,
84
+ interactionType: _quizInteractions.PropTypes.string.isRequired,
85
+ afsFlags: _quizInteractions.PropTypes.shape({
86
+ formulaEnabled: _quizInteractions.PropTypes.bool.isRequired,
87
+ matchingEnabled: _quizInteractions.PropTypes.bool.isRequired
88
+ })
75
89
  }.isRequired;
@@ -14,7 +14,11 @@ var _presenter = require("./presenter.js");
14
14
  function mapStateToProps(_state) {
15
15
  return {
16
16
  // This would be able to switch of all AFS Tables
17
- showFrequencyTable: (0, _featureCheck.featureOn)('show_improved_item_analysis_frequency_table')
17
+ showFrequencyTable: (0, _featureCheck.featureOn)('show_improved_item_analysis_frequency_table'),
18
+ afsFlags: {
19
+ formulaEnabled: (0, _featureCheck.featureOn)('ia_formula_afs'),
20
+ matchingEnabled: (0, _featureCheck.featureOn)('ia_matching_afs')
21
+ }
18
22
  };
19
23
  }
20
24
 
@@ -236,7 +236,8 @@ var NewItemAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
236
236
  }, /*#__PURE__*/_react.default.createElement(_index5.default, {
237
237
  itemId: itemId,
238
238
  answerSummary: answer_summary,
239
- interactionType: interactionType
239
+ interactionType: interactionType,
240
+ afsFlags: _propTypes.afsFlags
240
241
  }))));
241
242
  };
242
243
 
@@ -318,6 +319,7 @@ var NewItemAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
318
319
  return NewItemAnalysis;
319
320
  }(_react.Component), _class2.propTypes = {
320
321
  itemAnalysis: _propTypes.itemAnalysisPropType,
321
- showFrequencyTable: _quizInteractions.PropTypes.bool.isRequired
322
+ showFrequencyTable: _quizInteractions.PropTypes.bool.isRequired,
323
+ afsFlags: _propTypes.afsFlags
322
324
  }.isRequired, _temp)) || _class);
323
325
  exports.NewItemAnalysis = NewItemAnalysis;
@@ -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.answerSummaryPropType = exports.choiceTypeAnswerSummaryPropType = exports.itemAnalysisPropType = exports.quizAnalysisPropType = void 0;
8
+ exports.afsFlags = exports.answerSummaryPropType = exports.choiceTypeAnswerSummaryPropType = exports.itemAnalysisPropType = exports.quizAnalysisPropType = void 0;
9
9
 
10
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
11
 
@@ -78,4 +78,11 @@ exports.choiceTypeAnswerSummaryPropType = choiceTypeAnswerSummaryPropType;
78
78
 
79
79
  var answerSummaryPropType = _propTypes.default.oneOfType([choiceTypeAnswerSummaryPropType]);
80
80
 
81
- exports.answerSummaryPropType = answerSummaryPropType;
81
+ exports.answerSummaryPropType = answerSummaryPropType;
82
+
83
+ var afsFlags = _propTypes.default.shape({
84
+ formulaEnabled: _propTypes.default.bool.isRequired,
85
+ matchingEnabled: _propTypes.default.bool.isRequired
86
+ });
87
+
88
+ exports.afsFlags = afsFlags;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instructure/quiz-core",
3
- "version": "18.4.1-rc.8+e9b6bb93c",
3
+ "version": "18.5.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.4.1-rc.8+e9b6bb93c",
47
- "@instructure/quiz-i18n": "18.4.1-rc.8+e9b6bb93c",
48
- "@instructure/quiz-interactions": "18.4.1-rc.8+e9b6bb93c",
49
- "@instructure/quiz-number-input": "18.4.1-rc.8+e9b6bb93c",
50
- "@instructure/quiz-rce": "18.4.1-rc.8+e9b6bb93c",
46
+ "@instructure/quiz-common": "^18.5.0",
47
+ "@instructure/quiz-i18n": "^18.5.0",
48
+ "@instructure/quiz-interactions": "^18.5.0",
49
+ "@instructure/quiz-number-input": "^18.5.0",
50
+ "@instructure/quiz-rce": "^18.5.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",
@@ -108,7 +108,7 @@
108
108
  "eventemitter3": "^3.1.0",
109
109
  "humps": "^2.0.0",
110
110
  "immutable": "^3.8.1",
111
- "instructure-validations": "18.4.1-rc.8+e9b6bb93c",
111
+ "instructure-validations": "^18.5.0",
112
112
  "ipaddr.js": "^1.5.4",
113
113
  "isomorphic-fetch": "^2.2.0",
114
114
  "isuuid": "^0.1.0",
@@ -140,7 +140,7 @@
140
140
  "uuid": "^3.2.1"
141
141
  },
142
142
  "devDependencies": {
143
- "@instructure/quiz-scripts": "18.4.0",
143
+ "@instructure/quiz-scripts": "^18.5.0",
144
144
  "@instructure/ui-axe-check": "^7.22.1",
145
145
  "@instructure/ui-babel-preset": "^7.22.1",
146
146
  "@instructure/ui-karma-config": "^7.22.1",
@@ -159,7 +159,7 @@
159
159
  "intl": "^1.2.4",
160
160
  "jquery": "^2.2.3",
161
161
  "most-subject": "^5.3.0",
162
- "quiz-presets": "18.4.1-rc.8+e9b6bb93c",
162
+ "quiz-presets": "^18.5.0",
163
163
  "react": "^16.8.6",
164
164
  "react-addons-test-utils": "^15.6.2",
165
165
  "react-dom": "^16.8.6",
@@ -175,5 +175,5 @@
175
175
  "publishConfig": {
176
176
  "access": "public"
177
177
  },
178
- "gitHead": "e9b6bb93c650423afc3df0043968da7139a936f8"
178
+ "gitHead": "858a53d21b5111021d4fb75d7392f15e6e60bcf3"
179
179
  }