@instructure/quiz-core 17.64.1-rc.2 → 17.64.1-rc.6

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 (31) hide show
  1. package/es/common/components/resources/quizSessionResult/Info/index.js +31 -1
  2. package/es/common/components/resources/sessionItemResult/SessionItemResult/presenter.js +3 -1
  3. package/es/common/components/resources/sessionItemResult/SessionItemResultsList/index.js +5 -0
  4. package/es/common/reducers/analyses.js +1 -1
  5. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnalysisMetric/presenter.js +2 -1
  6. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnalysisPopoverMetric/presenter.js +3 -1
  7. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/Row/presenter.js +8 -4
  8. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/presenter.js +4 -1
  9. package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/presenter.js +5 -5
  10. package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/presenter.js +42 -24
  11. package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/theme.js +2 -0
  12. package/es/reporting/components/resources/NewQuizAndItemAnalysis/charts/ScoreDistribution/presenter.js +1 -1
  13. package/es/reporting/components/resources/NewQuizAndItemAnalysis/presenter.js +99 -36
  14. package/es/reporting/components/resources/NewQuizAndItemAnalysis/utils.js +10 -1
  15. package/es/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisStatePresenter.js +1 -1
  16. package/lib/common/components/resources/quizSessionResult/Info/index.js +33 -1
  17. package/lib/common/components/resources/sessionItemResult/SessionItemResult/presenter.js +3 -1
  18. package/lib/common/components/resources/sessionItemResult/SessionItemResultsList/index.js +6 -0
  19. package/lib/common/reducers/analyses.js +1 -1
  20. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnalysisMetric/presenter.js +2 -1
  21. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnalysisPopoverMetric/presenter.js +3 -1
  22. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/Row/presenter.js +8 -4
  23. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/presenter.js +4 -1
  24. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/presenter.js +5 -5
  25. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/presenter.js +44 -24
  26. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/theme.js +2 -0
  27. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/charts/ScoreDistribution/presenter.js +1 -1
  28. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/presenter.js +103 -35
  29. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/utils.js +10 -1
  30. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisStatePresenter.js +1 -1
  31. package/package.json +10 -9
@@ -7,6 +7,7 @@ import _createSuper from "@babel/runtime/helpers/esm/createSuper";
7
7
  var _dec, _class, _class2, _temp;
8
8
 
9
9
  import React, { Component } from 'react';
10
+ import PropTypes from 'prop-types';
10
11
  import ImmutablePropTypes from 'react-immutable-proptypes';
11
12
  import classNames from 'classnames';
12
13
  import { AccessibleContent, ScreenReaderContent } from '@instructure/ui-a11y-content';
@@ -17,6 +18,7 @@ import { Heading } from '@instructure/ui-heading';
17
18
  import { View } from '@instructure/ui-view';
18
19
  import { themeable } from '@instructure/ui-themeable';
19
20
  import t from '@instructure/quiz-i18n/es/format-message';
21
+ import { scoreToLetterGrade } from '@instructure/grading-utils';
20
22
  import { withI18nSupport } from '@instructure/quiz-common';
21
23
  import FormattedDuration from "../../../shared/FormattedDuration/index.js";
22
24
  import { formatTime } from "../../../../util/formatTimespan.js";
@@ -114,6 +116,26 @@ export var Info = (_dec = themeable(theme, styles), _dec(_class = (_temp = _clas
114
116
  }, alerts));
115
117
  }
116
118
  }
119
+ }, {
120
+ key: "renderLetterGrade",
121
+ value: function renderLetterGrade() {
122
+ var letterGrade = scoreToLetterGrade(this.percentageVal * 100, this.props.gradingScheme);
123
+ var gradeText = t('Grade for this attempt');
124
+ var alt = t('Grade for this attempt: { grade }', {
125
+ grade: letterGrade
126
+ });
127
+ return /*#__PURE__*/React.createElement(AccessibleContent, {
128
+ alt: alt
129
+ }, /*#__PURE__*/React.createElement(View, {
130
+ as: "div"
131
+ }, /*#__PURE__*/React.createElement(Text, {
132
+ size: "xx-large",
133
+ weight: "bold",
134
+ color: "primary"
135
+ }, letterGrade)), /*#__PURE__*/React.createElement(Text, {
136
+ color: "secondary"
137
+ }, gradeText));
138
+ }
117
139
  }, {
118
140
  key: "renderScoreStats",
119
141
  value: function renderScoreStats() {
@@ -186,7 +208,7 @@ export var Info = (_dec = themeable(theme, styles), _dec(_class = (_temp = _clas
186
208
  className: classNames('fs-mask', styles.info)
187
209
  }, /*#__PURE__*/React.createElement(ScreenReaderContent, null, /*#__PURE__*/React.createElement(Heading, {
188
210
  level: "h2"
189
- }, t('Assessment Statistics'))), this.renderScoreStats(), /*#__PURE__*/React.createElement("div", {
211
+ }, t('Assessment Statistics'))), this.props.restrictQuantitativeData ? this.renderLetterGrade() : this.renderScoreStats(), /*#__PURE__*/React.createElement("div", {
190
212
  className: styles.infoWrapper
191
213
  }, this.renderTime()))));
192
214
  }
@@ -286,8 +308,16 @@ export var Info = (_dec = themeable(theme, styles), _dec(_class = (_temp = _clas
286
308
  Info.displayName = "Info";
287
309
  return Info;
288
310
  }(withI18nSupport(Component)), _class2.propTypes = {
311
+ gradingScheme: PropTypes.arrayOf(PropTypes.shape({
312
+ name: PropTypes.string,
313
+ value: PropTypes.number
314
+ })),
289
315
  quizSession: ImmutablePropTypes.record.isRequired,
290
316
  quizSessionResult: ImmutablePropTypes.record.isRequired,
317
+ restrictQuantitativeData: PropTypes.bool,
291
318
  sessionItemResults: ImmutablePropTypes.list.isRequired
319
+ }, _class2.defaultProps = {
320
+ gradingScheme: [],
321
+ restrictQuantitativeData: false
292
322
  }, _temp)) || _class);
293
323
  export default Info;
@@ -136,7 +136,7 @@ export var SessionItemResult = (_dec = themeable(theme, styles), _dec(_class = (
136
136
  value: function renderHeader() {
137
137
  return /*#__PURE__*/React.createElement("div", {
138
138
  className: styles.sessionItemResultHeader
139
- }, this.renderResultPosition(), this.hasRegradeInfo() ? this.renderRegradePoints() : this.renderPoints());
139
+ }, this.renderResultPosition(), !this.props.restrictQuantitativeData && (this.hasRegradeInfo() ? this.renderRegradePoints() : this.renderPoints()));
140
140
  }
141
141
  }, {
142
142
  key: "renderResultPosition",
@@ -345,6 +345,7 @@ export var SessionItemResult = (_dec = themeable(theme, styles), _dec(_class = (
345
345
  editGraderFeedback: PropTypes.func,
346
346
  hideGraderFeedback: PropTypes.bool,
347
347
  itemResultsModifications: ImmutablePropTypes.map,
348
+ restrictQuantitativeData: PropTypes.bool,
348
349
  sessionItem: ImmutablePropTypes.record.isRequired,
349
350
  sessionItemResult: ImmutablePropTypes.record.isRequired,
350
351
  shouldRenderAnswerFeedback: PropTypes.bool,
@@ -353,6 +354,7 @@ export var SessionItemResult = (_dec = themeable(theme, styles), _dec(_class = (
353
354
  editGraderFeedback: null,
354
355
  hideGraderFeedback: false,
355
356
  itemResultsModifications: null,
357
+ restrictQuantitativeData: false,
356
358
  shouldRenderAnswerFeedback: false,
357
359
  shouldRenderTopBorder: true
358
360
  }, _temp)) || _class);
@@ -6,6 +6,7 @@ import _createSuper from "@babel/runtime/helpers/esm/createSuper";
6
6
  var _dec, _class, _class2, _temp;
7
7
 
8
8
  import React, { Component } from 'react';
9
+ import PropTypes from 'prop-types';
9
10
  import ImmutablePropTypes from 'react-immutable-proptypes';
10
11
  import { Heading } from '@instructure/ui-heading';
11
12
  import { themeable } from '@instructure/ui-themeable';
@@ -44,6 +45,7 @@ export var SessionItemResultsList = (_dec = themeable(theme, styles), _dec(_clas
44
45
  return /*#__PURE__*/React.createElement(SessionItemResult, {
45
46
  appContainer: _this.props.appContainer,
46
47
  key: sessionItem.id,
48
+ restrictQuantitativeData: _this.props.restrictQuantitativeData,
47
49
  sessionItem: sessionItem,
48
50
  sessionItemResult: sessionItem.sessionItemResult,
49
51
  shouldRenderTopBorder: shouldRenderTopBorder
@@ -93,6 +95,9 @@ export var SessionItemResultsList = (_dec = themeable(theme, styles), _dec(_clas
93
95
  return SessionItemResultsList;
94
96
  }(Component), _class2.propTypes = {
95
97
  appContainer: CustomPropTypes.selectors.isRequired,
98
+ restrictQuantitativeData: PropTypes.bool,
96
99
  sessionItems: ImmutablePropTypes.list.isRequired
100
+ }, _class2.defaultProps = {
101
+ restrictQuantitativeData: false
97
102
  }, _temp)) || _class);
98
103
  export default SessionItemResultsList;
@@ -10,7 +10,7 @@ export var fetchInProgressKey = 'fetchInProgress';
10
10
  export var generationInProgressKey = 'generationInProgress';
11
11
  export var statusPollingInProgressKey = 'statusPollingInProgress';
12
12
  export var errorKey = 'analysisError';
13
- export var defaultState = fromJS((_fromJS = {}, _defineProperty(_fromJS, quizAnalysisKey, void 0), _defineProperty(_fromJS, itemAnalysesKey, void 0), _defineProperty(_fromJS, fetchInProgressKey, false), _defineProperty(_fromJS, generationInProgressKey, false), _defineProperty(_fromJS, statusPollingInProgressKey, false), _defineProperty(_fromJS, errorKey, void 0), _fromJS));
13
+ export var defaultState = fromJS((_fromJS = {}, _defineProperty(_fromJS, quizAnalysisKey, void 0), _defineProperty(_fromJS, itemAnalysesKey, void 0), _defineProperty(_fromJS, fetchInProgressKey, true), _defineProperty(_fromJS, generationInProgressKey, false), _defineProperty(_fromJS, statusPollingInProgressKey, false), _defineProperty(_fromJS, errorKey, void 0), _fromJS));
14
14
  export default (function () {
15
15
  var state = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : defaultState;
16
16
  var action = arguments.length > 1 ? arguments[1] : void 0;
@@ -57,8 +57,9 @@ export var AnalysisMetric = (_dec = themeable(theme, styles), _dec(_class = (_te
57
57
  }(Component), _class2.propTypes = {
58
58
  metricKey: PropTypes.string.isRequired,
59
59
  label: PropTypes.string.isRequired,
60
- value: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.array]).isRequired,
60
+ value: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.array]),
61
61
  suffix: PropTypes.string
62
62
  }, _class2.defaultProps = {
63
+ value: void 0,
63
64
  suffix: ''
64
65
  }, _temp)) || _class);
@@ -65,11 +65,13 @@ export var AnalysisPopoverMetric = (_dec = themeable(theme, styles), _dec(_class
65
65
  }(Component), _class2.propTypes = {
66
66
  metricKey: PropTypes.string.isRequired,
67
67
  label: PropTypes.string.isRequired,
68
- value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
68
+ value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
69
69
  popoverDescription: PropTypes.shape({
70
70
  title: PropTypes.string,
71
71
  subtitle: PropTypes.string,
72
72
  body: PropTypes.string,
73
73
  screenReaderLabel: PropTypes.string
74
74
  }).isRequired
75
+ }, _class2.defaultProps = {
76
+ value: void 0
75
77
  }, _temp)) || _class);
@@ -75,20 +75,24 @@ export var Row = (_dec = themeable(theme, styles), _dec(_class = (_temp = _class
75
75
  key: _this.props.choiceIndex
76
76
  }, /*#__PURE__*/React.createElement(Table.Cell, {
77
77
  theme: {
78
- padding: '0px'
78
+ padding: '0px',
79
+ fontWeight: 'bold'
79
80
  }
80
81
  }, _this.renderIcon(correct)), /*#__PURE__*/React.createElement(Table.RowHeader, {
81
82
  theme: {
82
- padding: cellPadding
83
+ padding: cellPadding,
84
+ fontWeight: 'bold'
83
85
  },
84
86
  className: styles.tableBody
85
87
  }, _this.renderMiddleCell(correct, extractTextFromHtml(_this.props.choice.body))), /*#__PURE__*/React.createElement(Table.Cell, {
86
88
  theme: {
87
- padding: cellPadding
89
+ padding: cellPadding,
90
+ fontWeight: 'bold'
88
91
  }
89
92
  }, _this.renderMiddleCell(correct, _this.props.choice.count)), /*#__PURE__*/React.createElement(Table.Cell, {
90
93
  theme: {
91
- padding: cellPadding
94
+ padding: cellPadding,
95
+ fontWeight: 'bold'
92
96
  },
93
97
  textAlign: "center"
94
98
  }, _this.renderLastCell(correct, "".concat(_this.props.choice.percentage, "%"))));
@@ -48,7 +48,10 @@ export var AnswerSummaryTable = (_dec = themeable(theme, styles), _dec(_class =
48
48
  className: styles.tableWrapper
49
49
  }, /*#__PURE__*/React.createElement(Heading, {
50
50
  margin: "large 0 small 0",
51
- level: "h3"
51
+ level: "h3",
52
+ theme: {
53
+ h3FontWeight: 'normal'
54
+ }
52
55
  }, t('Answer Frequency Summary')), /*#__PURE__*/React.createElement(ChoiceInfo, {
53
56
  itemId: itemId,
54
57
  choices: choices,
@@ -143,7 +143,7 @@ export var NewItemAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_t
143
143
  }, /*#__PURE__*/React.createElement(AnalysisPopoverMetric, {
144
144
  metricKey: "difficulty_index",
145
145
  label: t('Item Difficulty'),
146
- value: t.number(scores.difficulty_index),
146
+ value: scores.difficulty_index,
147
147
  popoverDescription: difficultyIndex
148
148
  })), /*#__PURE__*/React.createElement(Flex.Item, {
149
149
  margin: "none medium none none"
@@ -162,7 +162,7 @@ export var NewItemAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_t
162
162
  }, /*#__PURE__*/React.createElement(AnalysisPopoverMetric, {
163
163
  metricKey: "discrimination_index",
164
164
  label: t('Discrimination Index'),
165
- value: t.number(scores.discrimination_index),
165
+ value: scores.discrimination_index,
166
166
  popoverDescription: discriminationIndex
167
167
  })))), /*#__PURE__*/React.createElement(Flex.Item, {
168
168
  overflowY: "visible",
@@ -176,7 +176,7 @@ export var NewItemAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_t
176
176
  }, /*#__PURE__*/React.createElement(AnalysisPopoverMetric, {
177
177
  metricKey: "pearson_correlation",
178
178
  label: t('Corrected Item-Total Correlation Coefficient'),
179
- value: t.number(scores.pearson_correlation),
179
+ value: scores.pearson_correlation,
180
180
  popoverDescription: pearsonCorrelation
181
181
  }))))));
182
182
  };
@@ -242,5 +242,5 @@ export var NewItemAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_t
242
242
  NewItemAnalysis.displayName = "NewItemAnalysis";
243
243
  return NewItemAnalysis;
244
244
  }(Component), _class2.propTypes = {
245
- itemAnalysis: itemAnalysisPropType.isRequired
246
- }, _temp)) || _class);
245
+ itemAnalysis: itemAnalysisPropType
246
+ }.isRequired, _temp)) || _class);
@@ -8,16 +8,17 @@ var _dec, _class, _class2, _temp;
8
8
  import { Heading } from '@instructure/ui-heading';
9
9
  import React, { Component } from 'react';
10
10
  var styles = {
11
- componentId: 'fQZVs',
11
+ componentId: 'PCuaD',
12
12
  template: function template(theme) {
13
- return "\n\n.fQZVs_eDnN{display:flex;justify-content:space-between;padding-bottom:".concat(theme.headingPadding || 'inherit', "}\n\n.fQZVs_eKXQ{padding:").concat(theme.cardWrapperPadding || 'inherit', ";position:relative}\n\n.fQZVs_crZr{padding-top:").concat(theme.metricGroupPaddingTop || 'inherit', "}\n\n.fQZVs_bTHH{position:absolute;right:").concat(theme.viewPaddingRight || 'inherit', ";top:").concat(theme.viewPaddingTop || 'inherit', "}\n\n.fQZVs_dPzc,.fQZVs_cpZE{column-gap:").concat(theme.metricsColumnGap || 'inherit', ";display:flex;flex-wrap:wrap;justify-content:flex-start;row-gap:1.5rem}");
13
+ return "\n\n.PCuaD_eDnN{display:flex;justify-content:space-between;padding-bottom:".concat(theme.headingPadding || 'inherit', "}\n\n.PCuaD_eKXQ{margin:").concat(theme.cardTopMargin || 'inherit', " 0 ").concat(theme.cardBottomMargin || 'inherit', " 0;padding:").concat(theme.cardWrapperPadding || 'inherit', ";position:relative}\n\n.PCuaD_dYbQ{align-items:center;display:flex;height:502px;justify-content:center;padding:").concat(theme.cardWrapperPadding || 'inherit', "}\n\n.PCuaD_crZr{padding-top:").concat(theme.metricGroupPaddingTop || 'inherit', "}\n\n.PCuaD_bTHH{position:absolute;right:").concat(theme.viewPaddingRight || 'inherit', ";top:").concat(theme.viewPaddingTop || 'inherit', "}\n\n.PCuaD_dPzc,.PCuaD_cpZE{column-gap:").concat(theme.metricsColumnGap || 'inherit', ";display:flex;flex-wrap:wrap;justify-content:flex-start;row-gap:1.5rem}");
14
14
  },
15
- 'heading': 'fQZVs_eDnN',
16
- 'cardWrapper': 'fQZVs_eKXQ',
17
- 'container': 'fQZVs_crZr',
18
- 'expandButtonContainer': 'fQZVs_bTHH',
19
- 'metricGroup': 'fQZVs_dPzc',
20
- 'metricsWrapper': 'fQZVs_cpZE'
15
+ 'heading': 'PCuaD_eDnN',
16
+ 'cardWrapper': 'PCuaD_eKXQ',
17
+ 'skeletonCardWrapper': 'PCuaD_dYbQ',
18
+ 'container': 'PCuaD_crZr',
19
+ 'expandButtonContainer': 'PCuaD_bTHH',
20
+ 'metricGroup': 'PCuaD_dPzc',
21
+ 'metricsWrapper': 'PCuaD_cpZE'
21
22
  };
22
23
  import t from '@instructure/quiz-i18n/es/format-message';
23
24
  import ExpandButton from "../../../../../common/components/shared/ExpandButton/index.js";
@@ -29,6 +30,8 @@ import AnalysisPopoverMetric from "../AnalysisPopoverMetric/index.js";
29
30
  import AnalysisMetric from "../AnalysisMetric/index.js";
30
31
  import { ScoreDistribution } from "../charts/ScoreDistribution/presenter.js";
31
32
  import { quizAnalysisPropType } from "../propTypes.js";
33
+ import PropTypes from 'prop-types';
34
+ import { Spinner } from '@instructure/ui-spinner';
32
35
  import { cronbachsAlpha, standardDeviation } from "./popoverContent.js";
33
36
  export var NewQuizAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
34
37
  _inherits(NewQuizAnalysis, _Component);
@@ -63,28 +66,23 @@ export var NewQuizAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_t
63
66
  className: styles.metricGroup
64
67
  }, /*#__PURE__*/React.createElement(AnalysisPopoverMetric, {
65
68
  metricKey: "stddev",
66
- value: t.number(scores === null || scores === void 0 ? void 0 : scores.stddev),
69
+ value: scores === null || scores === void 0 ? void 0 : scores.stddev,
67
70
  label: t('Standard Deviation'),
68
71
  popoverDescription: standardDeviation
69
72
  }), /*#__PURE__*/React.createElement(AnalysisPopoverMetric, {
70
73
  metricKey: "cronbachs_alpha",
71
- value: t.number(scores === null || scores === void 0 ? void 0 : scores.cronbachs_alpha),
74
+ value: scores === null || scores === void 0 ? void 0 : scores.cronbachs_alpha,
72
75
  label: t('Cronbach\'s Alpha'),
73
76
  popoverDescription: cronbachsAlpha
74
77
  })));
75
78
  };
76
79
 
77
- return _this;
78
- }
79
-
80
- _createClass(NewQuizAnalysis, [{
81
- key: "render",
82
- value: function render() {
83
- var quizAnalysis = this.props.quizAnalysis;
80
+ _this.renderContent = function () {
81
+ var quizAnalysis = _this.props.quizAnalysis;
84
82
  var scores = quizAnalysis.scores,
85
83
  attempts = quizAnalysis.attempts,
86
84
  metadata = quizAnalysis.metadata;
87
- var expanded = this.state.expanded;
85
+ var expanded = _this.state.expanded;
88
86
  return /*#__PURE__*/React.createElement(Card, {
89
87
  className: styles.cardWrapper
90
88
  }, /*#__PURE__*/React.createElement("div", {
@@ -117,7 +115,7 @@ export var NewQuizAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_t
117
115
  }, /*#__PURE__*/React.createElement(AnalysisMetric, {
118
116
  metricKey: "median_percentage",
119
117
  label: t('Median Score'),
120
- value: t.number(scores === null || scores === void 0 ? void 0 : scores.median_percentage),
118
+ value: scores === null || scores === void 0 ? void 0 : scores.median_percentage,
121
119
  suffix: "%"
122
120
  }), /*#__PURE__*/React.createElement(AnalysisMetric, {
123
121
  metricKey: "mean_elapsed_sec",
@@ -126,19 +124,39 @@ export var NewQuizAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_t
126
124
  })), /*#__PURE__*/React.createElement("div", {
127
125
  className: styles.expandButtonContainer
128
126
  }, /*#__PURE__*/React.createElement(ExpandButton, {
129
- onClick: this.handleToggle,
127
+ onClick: _this.handleToggle,
130
128
  title: expanded ? t('collapse quiz analysis') : t('expand quiz analysis'),
131
129
  isExpanded: expanded
132
- }))), expanded && this.renderExpanded(), /*#__PURE__*/React.createElement(ScoreDistribution, {
133
- decileDistribution: quizAnalysis.scores.decile_distribution
130
+ }))), expanded && _this.renderExpanded(), /*#__PURE__*/React.createElement(ScoreDistribution, {
131
+ decileDistribution: scores === null || scores === void 0 ? void 0 : scores.decile_distribution
134
132
  }));
133
+ };
134
+
135
+ return _this;
136
+ }
137
+
138
+ _createClass(NewQuizAnalysis, [{
139
+ key: "render",
140
+ value: function render() {
141
+ var fetchInProgress = this.props.fetchInProgress;
142
+
143
+ if (fetchInProgress) {
144
+ return /*#__PURE__*/React.createElement(Card, {
145
+ className: styles.skeletonCardWrapper
146
+ }, /*#__PURE__*/React.createElement(Spinner, {
147
+ renderTitle: t('Loading quiz analysis data')
148
+ }));
149
+ } else {
150
+ return this.renderContent();
151
+ }
135
152
  }
136
153
  }]);
137
154
 
138
155
  NewQuizAnalysis.displayName = "NewQuizAnalysis";
139
156
  return NewQuizAnalysis;
140
157
  }(Component), _class2.propTypes = {
141
- quizAnalysis: quizAnalysisPropType.isRequired
142
- }, _class2.defaultProps = {
158
+ quizAnalysis: quizAnalysisPropType,
159
+ fetchInProgress: PropTypes.bool
160
+ }.isRequired, _class2.defaultProps = {
143
161
  quizAnalysis: {}
144
162
  }, _temp)) || _class);
@@ -2,6 +2,8 @@ export default function generator(_ref) {
2
2
  var spacing = _ref.spacing;
3
3
  return {
4
4
  metricGroupPaddingTop: spacing.medium,
5
+ cardTopMargin: spacing.small,
6
+ cardBottomMargin: spacing.medium,
5
7
  viewPaddingRight: spacing.large,
6
8
  viewPaddingTop: spacing.medium,
7
9
  headingPadding: spacing.medium,
@@ -62,7 +62,7 @@ export var ScoreDistribution = (_dec = themeable(theme, styles), _dec(_class = (
62
62
  }, t('Score Distribution'))), /*#__PURE__*/React.createElement(QuintileDistribution, {
63
63
  animateDelay: 1000,
64
64
  animateDuration: 1000,
65
- visualDistribution: this.props.decileDistribution,
65
+ visualDistribution: this.props.decileDistribution || [],
66
66
  calculateLabelForColumn: this.calculateLabelForColumn
67
67
  }), /*#__PURE__*/React.createElement("div", {
68
68
  className: styles.chartLabel
@@ -6,64 +6,122 @@ import React, { Component } from 'react';
6
6
  import { Heading } from '@instructure/ui-heading';
7
7
  import NewItemAnalysis from "./NewItemAnalysis/index.js";
8
8
  import NewQuizAnalysis from "./NewQuizAnalysis/index.js";
9
- import Spinner from "../../../../common/components/shared/spinner/Spinner.js";
10
9
  import t from '@instructure/quiz-i18n/es/format-message';
11
10
  import { Flex } from '@instructure/ui-flex';
12
11
  import { AnalysisUpdateDate } from "./AnalysisUpdateDate/index.js";
13
12
  import { itemAnalysisPropType, quizAnalysisPropType } from "./propTypes.js";
14
13
  import PropTypes from 'prop-types';
15
-
16
- var _ref = /*#__PURE__*/React.createElement(Spinner, null);
17
-
14
+ import { QuizzesSpinner } from "../../../../common/components/shared/spinner/Spinner.js";
15
+ import { Spinner } from '@instructure/ui-spinner';
16
+ import { Button } from '@instructure/ui-buttons';
17
+ import { Text } from '@instructure/ui-text';
18
18
  export var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component) {
19
19
  _inherits(NewQuizAndItemAnalysisPresenter, _Component);
20
20
 
21
21
  var _super = _createSuper(NewQuizAndItemAnalysisPresenter);
22
22
 
23
23
  function NewQuizAndItemAnalysisPresenter() {
24
+ var _this;
25
+
24
26
  _classCallCheck(this, NewQuizAndItemAnalysisPresenter);
25
27
 
26
- return _super.apply(this, arguments);
28
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
29
+ args[_key] = arguments[_key];
30
+ }
31
+
32
+ _this = _super.call.apply(_super, [this].concat(args));
33
+
34
+ _this.renderItemAnalyses = function () {
35
+ var itemAnalyses = _this.props.itemAnalyses;
36
+ return /*#__PURE__*/React.createElement("div", null, itemAnalyses.map(function (itemAnalysis) {
37
+ return /*#__PURE__*/React.createElement(NewItemAnalysis, {
38
+ key: itemAnalysis.metadata.item_id,
39
+ itemAnalysis: itemAnalysis
40
+ });
41
+ }));
42
+ };
43
+
44
+ _this.renderSpinner = function () {
45
+ return /*#__PURE__*/React.createElement(Flex, {
46
+ padding: "medium",
47
+ justifyItems: "center",
48
+ alignItems: "center"
49
+ }, /*#__PURE__*/React.createElement(Spinner, {
50
+ renderTitle: t('Loading item analyses data')
51
+ }));
52
+ };
53
+
54
+ _this.renderOngoingGenerationButton = function () {
55
+ return /*#__PURE__*/React.createElement(Button, {
56
+ color: "primary-inverse",
57
+ interaction: "disabled",
58
+ margin: "0 0 x-small 0"
59
+ }, /*#__PURE__*/React.createElement(QuizzesSpinner, {
60
+ size: "x-small",
61
+ color: "brand",
62
+ minHeight: "0",
63
+ mainText: t('Generation In Progress'),
64
+ fontSize: "medium"
65
+ }));
66
+ };
67
+
68
+ _this.renderStartGenerationButton = function () {
69
+ return /*#__PURE__*/React.createElement(Button, {
70
+ color: "primary-inverse",
71
+ margin: "0 0 x-small 0",
72
+ onClick: _this.handleGeneration,
73
+ theme: {
74
+ lineHeight: '24px'
75
+ }
76
+ }, /*#__PURE__*/React.createElement(Text, {
77
+ size: "medium"
78
+ }, t('Generate Report')));
79
+ };
80
+
81
+ _this.renderGenerationButton = function () {
82
+ return _this.props.generationInProgress ? _this.renderOngoingGenerationButton() : _this.renderStartGenerationButton();
83
+ };
84
+
85
+ _this.handleGeneration = function (_event) {
86
+ var filter = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 'last_attempt';
87
+
88
+ _this.props.generateReports(filter);
89
+ };
90
+
91
+ return _this;
27
92
  }
28
93
 
29
94
  _createClass(NewQuizAndItemAnalysisPresenter, [{
30
- key: "renderContent",
31
- value: function renderContent() {
95
+ key: "render",
96
+ value: function render() {
32
97
  var _this$props = this.props,
33
- quizAnalysis = _this$props.quizAnalysis,
34
- itemAnalyses = _this$props.itemAnalyses;
98
+ analysisError = _this$props.analysisError,
99
+ fetchInProgress = _this$props.fetchInProgress,
100
+ generationInProgress = _this$props.generationInProgress,
101
+ quizAnalysis = _this$props.quizAnalysis;
102
+ var shouldShowError = analysisError && !fetchInProgress && !generationInProgress;
35
103
  return /*#__PURE__*/React.createElement("div", {
36
104
  className: "fs-mask"
37
105
  }, /*#__PURE__*/React.createElement(Flex, {
38
- justifyItems: "end",
106
+ alignItems: "end",
39
107
  width: "82.5rem",
40
- margin: "auto"
41
- }, /*#__PURE__*/React.createElement(AnalysisUpdateDate, {
108
+ margin: "auto",
109
+ direction: "column"
110
+ }, /*#__PURE__*/React.createElement(Flex.Item, {
111
+ overflowY: "visible"
112
+ }, !fetchInProgress && this.renderGenerationButton()), /*#__PURE__*/React.createElement(Flex.Item, null, shouldShowError && /*#__PURE__*/React.createElement(Text, {
113
+ size: "x-small",
114
+ weight: "bold",
115
+ color: "danger"
116
+ }, analysisError)), /*#__PURE__*/React.createElement(Flex.Item, null, !fetchInProgress && /*#__PURE__*/React.createElement(AnalysisUpdateDate, {
42
117
  date: quizAnalysis.created_timestamp
43
- })), /*#__PURE__*/React.createElement(NewQuizAnalysis, {
44
- quizAnalysis: quizAnalysis
45
- }), /*#__PURE__*/React.createElement(Heading, {
46
- level: "h3",
118
+ }))), /*#__PURE__*/React.createElement(NewQuizAnalysis, {
119
+ quizAnalysis: quizAnalysis,
120
+ fetchInProgress: fetchInProgress
121
+ }), !fetchInProgress && /*#__PURE__*/React.createElement(Heading, {
122
+ level: "h2",
47
123
  color: "primary"
48
- }, t('Item Analysis')), itemAnalyses === null || itemAnalyses === void 0 ? void 0 : itemAnalyses.map(function (itemAnalysis) {
49
- return /*#__PURE__*/React.createElement(NewItemAnalysis, {
50
- key: itemAnalysis.metadata.item_id,
51
- itemAnalysis: itemAnalysis
52
- });
53
- }));
54
- }
55
- }, {
56
- key: "render",
57
- value: function render() {
58
- var _this$props2 = this.props,
59
- quizAnalysis = _this$props2.quizAnalysis,
60
- itemAnalyses = _this$props2.itemAnalyses;
61
-
62
- if (quizAnalysis && itemAnalyses) {
63
- return this.renderContent();
64
- } else {
65
- return _ref;
66
- }
124
+ }, t('Item Analysis')), fetchInProgress ? this.renderSpinner() : this.renderItemAnalyses());
67
125
  }
68
126
  }]);
69
127
 
@@ -72,9 +130,14 @@ export var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component)
72
130
  }(Component);
73
131
  NewQuizAndItemAnalysisPresenter.propTypes = {
74
132
  quizAnalysis: quizAnalysisPropType,
75
- itemAnalyses: PropTypes.arrayOf(itemAnalysisPropType)
133
+ itemAnalyses: PropTypes.arrayOf(itemAnalysisPropType),
134
+ fetchInProgress: PropTypes.bool.isRequired,
135
+ generationInProgress: PropTypes.bool.isRequired,
136
+ analysisError: PropTypes.string,
137
+ generateReports: PropTypes.func.isRequired
76
138
  };
77
139
  NewQuizAndItemAnalysisPresenter.defaultProps = {
140
+ analysisError: void 0,
78
141
  quizAnalysis: void 0,
79
142
  itemAnalyses: void 0
80
143
  };
@@ -1,11 +1,20 @@
1
1
  import t from '@instructure/quiz-i18n/es/format-message';
2
2
 
3
+ var formatNumbers = function formatNumbers(value) {
4
+ if (typeof value === 'number') {
5
+ return t.number(value);
6
+ }
7
+
8
+ return value;
9
+ };
10
+
3
11
  var getSanitizedMetricValue = function getSanitizedMetricValue(value, suffix) {
4
12
  if (value === null || value === void 0) {
5
13
  return t('N/A');
6
14
  }
7
15
 
8
- return suffix ? value + suffix : value;
16
+ var formattedValue = formatNumbers(value);
17
+ return suffix ? formattedValue + suffix : formattedValue;
9
18
  };
10
19
 
11
20
  export { getSanitizedMetricValue };
@@ -103,7 +103,7 @@ export var withAnalysisStatePresenter = function withAnalysisStatePresenter(Orig
103
103
  case 0:
104
104
  hasStoredAnalyses = quizAnalysis && itemAnalyses;
105
105
 
106
- if (!(!hasStoredAnalyses && !fetchInProgress)) {
106
+ if (hasStoredAnalyses) {
107
107
  _context.next = 4;
108
108
  break;
109
109
  }
@@ -21,6 +21,8 @@ var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/creat
21
21
 
22
22
  var _react = _interopRequireWildcard(require("react"));
23
23
 
24
+ var _propTypes = _interopRequireDefault(require("prop-types"));
25
+
24
26
  var _reactImmutableProptypes = _interopRequireDefault(require("react-immutable-proptypes"));
25
27
 
26
28
  var _classnames = _interopRequireDefault(require("classnames"));
@@ -41,6 +43,8 @@ var _uiThemeable = require("@instructure/ui-themeable");
41
43
 
42
44
  var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
43
45
 
46
+ var _gradingUtils = require("@instructure/grading-utils");
47
+
44
48
  var _quizCommon = require("@instructure/quiz-common");
45
49
 
46
50
  var _index = _interopRequireDefault(require("../../../shared/FormattedDuration/index.js"));
@@ -143,6 +147,26 @@ var Info = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_cl
143
147
  }, alerts));
144
148
  }
145
149
  }
150
+ }, {
151
+ key: "renderLetterGrade",
152
+ value: function renderLetterGrade() {
153
+ var letterGrade = (0, _gradingUtils.scoreToLetterGrade)(this.percentageVal * 100, this.props.gradingScheme);
154
+ var gradeText = (0, _formatMessage.default)('Grade for this attempt');
155
+ var alt = (0, _formatMessage.default)('Grade for this attempt: { grade }', {
156
+ grade: letterGrade
157
+ });
158
+ return /*#__PURE__*/_react.default.createElement(_uiA11yContent.AccessibleContent, {
159
+ alt: alt
160
+ }, /*#__PURE__*/_react.default.createElement(_uiView.View, {
161
+ as: "div"
162
+ }, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
163
+ size: "xx-large",
164
+ weight: "bold",
165
+ color: "primary"
166
+ }, letterGrade)), /*#__PURE__*/_react.default.createElement(_uiText.Text, {
167
+ color: "secondary"
168
+ }, gradeText));
169
+ }
146
170
  }, {
147
171
  key: "renderScoreStats",
148
172
  value: function renderScoreStats() {
@@ -215,7 +239,7 @@ var Info = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_cl
215
239
  className: (0, _classnames.default)('fs-mask', styles.info)
216
240
  }, /*#__PURE__*/_react.default.createElement(_uiA11yContent.ScreenReaderContent, null, /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
217
241
  level: "h2"
218
- }, (0, _formatMessage.default)('Assessment Statistics'))), this.renderScoreStats(), /*#__PURE__*/_react.default.createElement("div", {
242
+ }, (0, _formatMessage.default)('Assessment Statistics'))), this.props.restrictQuantitativeData ? this.renderLetterGrade() : this.renderScoreStats(), /*#__PURE__*/_react.default.createElement("div", {
219
243
  className: styles.infoWrapper
220
244
  }, this.renderTime()))));
221
245
  }
@@ -314,9 +338,17 @@ var Info = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_cl
314
338
  Info.displayName = "Info";
315
339
  return Info;
316
340
  }((0, _quizCommon.withI18nSupport)(_react.Component)), _class2.propTypes = {
341
+ gradingScheme: _propTypes.default.arrayOf(_propTypes.default.shape({
342
+ name: _propTypes.default.string,
343
+ value: _propTypes.default.number
344
+ })),
317
345
  quizSession: _reactImmutableProptypes.default.record.isRequired,
318
346
  quizSessionResult: _reactImmutableProptypes.default.record.isRequired,
347
+ restrictQuantitativeData: _propTypes.default.bool,
319
348
  sessionItemResults: _reactImmutableProptypes.default.list.isRequired
349
+ }, _class2.defaultProps = {
350
+ gradingScheme: [],
351
+ restrictQuantitativeData: false
320
352
  }, _temp)) || _class);
321
353
  exports.Info = Info;
322
354
  var _default = Info;
@@ -168,7 +168,7 @@ var SessionItemResult = (_dec = (0, _uiThemeable.themeable)(_theme.default, styl
168
168
  value: function renderHeader() {
169
169
  return /*#__PURE__*/_react.default.createElement("div", {
170
170
  className: styles.sessionItemResultHeader
171
- }, this.renderResultPosition(), this.hasRegradeInfo() ? this.renderRegradePoints() : this.renderPoints());
171
+ }, this.renderResultPosition(), !this.props.restrictQuantitativeData && (this.hasRegradeInfo() ? this.renderRegradePoints() : this.renderPoints()));
172
172
  }
173
173
  }, {
174
174
  key: "renderResultPosition",
@@ -376,6 +376,7 @@ var SessionItemResult = (_dec = (0, _uiThemeable.themeable)(_theme.default, styl
376
376
  editGraderFeedback: _propTypes.default.func,
377
377
  hideGraderFeedback: _propTypes.default.bool,
378
378
  itemResultsModifications: _reactImmutableProptypes.default.map,
379
+ restrictQuantitativeData: _propTypes.default.bool,
379
380
  sessionItem: _reactImmutableProptypes.default.record.isRequired,
380
381
  sessionItemResult: _reactImmutableProptypes.default.record.isRequired,
381
382
  shouldRenderAnswerFeedback: _propTypes.default.bool,
@@ -384,6 +385,7 @@ var SessionItemResult = (_dec = (0, _uiThemeable.themeable)(_theme.default, styl
384
385
  editGraderFeedback: null,
385
386
  hideGraderFeedback: false,
386
387
  itemResultsModifications: null,
388
+ restrictQuantitativeData: false,
387
389
  shouldRenderAnswerFeedback: false,
388
390
  shouldRenderTopBorder: true
389
391
  }, _temp)) || _class);
@@ -19,6 +19,8 @@ var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/creat
19
19
 
20
20
  var _react = _interopRequireWildcard(require("react"));
21
21
 
22
+ var _propTypes = _interopRequireDefault(require("prop-types"));
23
+
22
24
  var _reactImmutableProptypes = _interopRequireDefault(require("react-immutable-proptypes"));
23
25
 
24
26
  var _uiHeading = require("@instructure/ui-heading");
@@ -68,6 +70,7 @@ var SessionItemResultsList = (_dec = (0, _uiThemeable.themeable)(_theme.default,
68
70
  return /*#__PURE__*/_react.default.createElement(_index.default, {
69
71
  appContainer: _this.props.appContainer,
70
72
  key: sessionItem.id,
73
+ restrictQuantitativeData: _this.props.restrictQuantitativeData,
71
74
  sessionItem: sessionItem,
72
75
  sessionItemResult: sessionItem.sessionItemResult,
73
76
  shouldRenderTopBorder: shouldRenderTopBorder
@@ -116,7 +119,10 @@ var SessionItemResultsList = (_dec = (0, _uiThemeable.themeable)(_theme.default,
116
119
  return SessionItemResultsList;
117
120
  }(_react.Component), _class2.propTypes = {
118
121
  appContainer: _CustomPropTypes.default.selectors.isRequired,
122
+ restrictQuantitativeData: _propTypes.default.bool,
119
123
  sessionItems: _reactImmutableProptypes.default.list.isRequired
124
+ }, _class2.defaultProps = {
125
+ restrictQuantitativeData: false
120
126
  }, _temp)) || _class);
121
127
  exports.SessionItemResultsList = SessionItemResultsList;
122
128
  var _default = SessionItemResultsList;
@@ -27,7 +27,7 @@ var statusPollingInProgressKey = 'statusPollingInProgress';
27
27
  exports.statusPollingInProgressKey = statusPollingInProgressKey;
28
28
  var errorKey = 'analysisError';
29
29
  exports.errorKey = errorKey;
30
- var defaultState = (0, _immutable.fromJS)((_fromJS = {}, (0, _defineProperty2.default)(_fromJS, quizAnalysisKey, void 0), (0, _defineProperty2.default)(_fromJS, itemAnalysesKey, void 0), (0, _defineProperty2.default)(_fromJS, fetchInProgressKey, false), (0, _defineProperty2.default)(_fromJS, generationInProgressKey, false), (0, _defineProperty2.default)(_fromJS, statusPollingInProgressKey, false), (0, _defineProperty2.default)(_fromJS, errorKey, void 0), _fromJS));
30
+ var defaultState = (0, _immutable.fromJS)((_fromJS = {}, (0, _defineProperty2.default)(_fromJS, quizAnalysisKey, void 0), (0, _defineProperty2.default)(_fromJS, itemAnalysesKey, void 0), (0, _defineProperty2.default)(_fromJS, fetchInProgressKey, true), (0, _defineProperty2.default)(_fromJS, generationInProgressKey, false), (0, _defineProperty2.default)(_fromJS, statusPollingInProgressKey, false), (0, _defineProperty2.default)(_fromJS, errorKey, void 0), _fromJS));
31
31
  exports.defaultState = defaultState;
32
32
 
33
33
  var _default = function _default() {
@@ -75,9 +75,10 @@ var AnalysisMetric = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles)
75
75
  }(_react.Component), _class2.propTypes = {
76
76
  metricKey: _propTypes.default.string.isRequired,
77
77
  label: _propTypes.default.string.isRequired,
78
- value: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string, _propTypes.default.array]).isRequired,
78
+ value: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string, _propTypes.default.array]),
79
79
  suffix: _propTypes.default.string
80
80
  }, _class2.defaultProps = {
81
+ value: void 0,
81
82
  suffix: ''
82
83
  }, _temp)) || _class);
83
84
  exports.AnalysisMetric = AnalysisMetric;
@@ -84,12 +84,14 @@ var AnalysisPopoverMetric = (_dec = (0, _uiThemeable.themeable)(_theme.default,
84
84
  }(_react.Component), _class2.propTypes = {
85
85
  metricKey: _propTypes.default.string.isRequired,
86
86
  label: _propTypes.default.string.isRequired,
87
- value: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]).isRequired,
87
+ value: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
88
88
  popoverDescription: _propTypes.default.shape({
89
89
  title: _propTypes.default.string,
90
90
  subtitle: _propTypes.default.string,
91
91
  body: _propTypes.default.string,
92
92
  screenReaderLabel: _propTypes.default.string
93
93
  }).isRequired
94
+ }, _class2.defaultProps = {
95
+ value: void 0
94
96
  }, _temp)) || _class);
95
97
  exports.AnalysisPopoverMetric = AnalysisPopoverMetric;
@@ -97,20 +97,24 @@ var Row = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_cla
97
97
  key: _this.props.choiceIndex
98
98
  }, /*#__PURE__*/_react.default.createElement(_uiTable.Table.Cell, {
99
99
  theme: {
100
- padding: '0px'
100
+ padding: '0px',
101
+ fontWeight: 'bold'
101
102
  }
102
103
  }, _this.renderIcon(correct)), /*#__PURE__*/_react.default.createElement(_uiTable.Table.RowHeader, {
103
104
  theme: {
104
- padding: cellPadding
105
+ padding: cellPadding,
106
+ fontWeight: 'bold'
105
107
  },
106
108
  className: styles.tableBody
107
109
  }, _this.renderMiddleCell(correct, (0, _quizInteractions.extractTextFromHtml)(_this.props.choice.body))), /*#__PURE__*/_react.default.createElement(_uiTable.Table.Cell, {
108
110
  theme: {
109
- padding: cellPadding
111
+ padding: cellPadding,
112
+ fontWeight: 'bold'
110
113
  }
111
114
  }, _this.renderMiddleCell(correct, _this.props.choice.count)), /*#__PURE__*/_react.default.createElement(_uiTable.Table.Cell, {
112
115
  theme: {
113
- padding: cellPadding
116
+ padding: cellPadding,
117
+ fontWeight: 'bold'
114
118
  },
115
119
  textAlign: "center"
116
120
  }, _this.renderLastCell(correct, "".concat(_this.props.choice.percentage, "%"))));
@@ -69,7 +69,10 @@ var AnswerSummaryTable = (_dec = (0, _uiThemeable.themeable)(_theme.default, sty
69
69
  className: styles.tableWrapper
70
70
  }, /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
71
71
  margin: "large 0 small 0",
72
- level: "h3"
72
+ level: "h3",
73
+ theme: {
74
+ h3FontWeight: 'normal'
75
+ }
73
76
  }, (0, _formatMessage.default)('Answer Frequency Summary')), /*#__PURE__*/_react.default.createElement(_presenter.ChoiceInfo, {
74
77
  itemId: itemId,
75
78
  choices: choices,
@@ -175,7 +175,7 @@ var NewItemAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
175
175
  }, /*#__PURE__*/_react.default.createElement(_index4.default, {
176
176
  metricKey: "difficulty_index",
177
177
  label: (0, _formatMessage.default)('Item Difficulty'),
178
- value: _formatMessage.default.number(scores.difficulty_index),
178
+ value: scores.difficulty_index,
179
179
  popoverDescription: _popoverContent.difficultyIndex
180
180
  })), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
181
181
  margin: "none medium none none"
@@ -194,7 +194,7 @@ var NewItemAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
194
194
  }, /*#__PURE__*/_react.default.createElement(_index4.default, {
195
195
  metricKey: "discrimination_index",
196
196
  label: (0, _formatMessage.default)('Discrimination Index'),
197
- value: _formatMessage.default.number(scores.discrimination_index),
197
+ value: scores.discrimination_index,
198
198
  popoverDescription: _popoverContent.discriminationIndex
199
199
  })))), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
200
200
  overflowY: "visible",
@@ -208,7 +208,7 @@ var NewItemAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
208
208
  }, /*#__PURE__*/_react.default.createElement(_index4.default, {
209
209
  metricKey: "pearson_correlation",
210
210
  label: (0, _formatMessage.default)('Corrected Item-Total Correlation Coefficient'),
211
- value: _formatMessage.default.number(scores.pearson_correlation),
211
+ value: scores.pearson_correlation,
212
212
  popoverDescription: _popoverContent.pearsonCorrelation
213
213
  }))))));
214
214
  };
@@ -273,6 +273,6 @@ var NewItemAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
273
273
  NewItemAnalysis.displayName = "NewItemAnalysis";
274
274
  return NewItemAnalysis;
275
275
  }(_react.Component), _class2.propTypes = {
276
- itemAnalysis: _propTypes.itemAnalysisPropType.isRequired
277
- }, _temp)) || _class);
276
+ itemAnalysis: _propTypes.itemAnalysisPropType
277
+ }.isRequired, _temp)) || _class);
278
278
  exports.NewItemAnalysis = NewItemAnalysis;
@@ -41,21 +41,26 @@ var _presenter = require("../charts/ScoreDistribution/presenter.js");
41
41
 
42
42
  var _propTypes = require("../propTypes.js");
43
43
 
44
+ var _propTypes2 = _interopRequireDefault(require("prop-types"));
45
+
46
+ var _uiSpinner = require("@instructure/ui-spinner");
47
+
44
48
  var _popoverContent = require("./popoverContent.js");
45
49
 
46
50
  var _dec, _class, _class2, _temp;
47
51
 
48
52
  var styles = {
49
- componentId: 'fQZVs',
53
+ componentId: 'PCuaD',
50
54
  template: function template(theme) {
51
- return "\n\n.fQZVs_eDnN{display:flex;justify-content:space-between;padding-bottom:".concat(theme.headingPadding || 'inherit', "}\n\n.fQZVs_eKXQ{padding:").concat(theme.cardWrapperPadding || 'inherit', ";position:relative}\n\n.fQZVs_crZr{padding-top:").concat(theme.metricGroupPaddingTop || 'inherit', "}\n\n.fQZVs_bTHH{position:absolute;right:").concat(theme.viewPaddingRight || 'inherit', ";top:").concat(theme.viewPaddingTop || 'inherit', "}\n\n.fQZVs_dPzc,.fQZVs_cpZE{column-gap:").concat(theme.metricsColumnGap || 'inherit', ";display:flex;flex-wrap:wrap;justify-content:flex-start;row-gap:1.5rem}");
55
+ return "\n\n.PCuaD_eDnN{display:flex;justify-content:space-between;padding-bottom:".concat(theme.headingPadding || 'inherit', "}\n\n.PCuaD_eKXQ{margin:").concat(theme.cardTopMargin || 'inherit', " 0 ").concat(theme.cardBottomMargin || 'inherit', " 0;padding:").concat(theme.cardWrapperPadding || 'inherit', ";position:relative}\n\n.PCuaD_dYbQ{align-items:center;display:flex;height:502px;justify-content:center;padding:").concat(theme.cardWrapperPadding || 'inherit', "}\n\n.PCuaD_crZr{padding-top:").concat(theme.metricGroupPaddingTop || 'inherit', "}\n\n.PCuaD_bTHH{position:absolute;right:").concat(theme.viewPaddingRight || 'inherit', ";top:").concat(theme.viewPaddingTop || 'inherit', "}\n\n.PCuaD_dPzc,.PCuaD_cpZE{column-gap:").concat(theme.metricsColumnGap || 'inherit', ";display:flex;flex-wrap:wrap;justify-content:flex-start;row-gap:1.5rem}");
52
56
  },
53
- 'heading': 'fQZVs_eDnN',
54
- 'cardWrapper': 'fQZVs_eKXQ',
55
- 'container': 'fQZVs_crZr',
56
- 'expandButtonContainer': 'fQZVs_bTHH',
57
- 'metricGroup': 'fQZVs_dPzc',
58
- 'metricsWrapper': 'fQZVs_cpZE'
57
+ 'heading': 'PCuaD_eDnN',
58
+ 'cardWrapper': 'PCuaD_eKXQ',
59
+ 'skeletonCardWrapper': 'PCuaD_dYbQ',
60
+ 'container': 'PCuaD_crZr',
61
+ 'expandButtonContainer': 'PCuaD_bTHH',
62
+ 'metricGroup': 'PCuaD_dPzc',
63
+ 'metricsWrapper': 'PCuaD_cpZE'
59
64
  };
60
65
  var NewQuizAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
61
66
  (0, _inherits2.default)(NewQuizAnalysis, _Component);
@@ -90,28 +95,23 @@ var NewQuizAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
90
95
  className: styles.metricGroup
91
96
  }, /*#__PURE__*/_react.default.createElement(_index3.default, {
92
97
  metricKey: "stddev",
93
- value: _formatMessage.default.number(scores === null || scores === void 0 ? void 0 : scores.stddev),
98
+ value: scores === null || scores === void 0 ? void 0 : scores.stddev,
94
99
  label: (0, _formatMessage.default)('Standard Deviation'),
95
100
  popoverDescription: _popoverContent.standardDeviation
96
101
  }), /*#__PURE__*/_react.default.createElement(_index3.default, {
97
102
  metricKey: "cronbachs_alpha",
98
- value: _formatMessage.default.number(scores === null || scores === void 0 ? void 0 : scores.cronbachs_alpha),
103
+ value: scores === null || scores === void 0 ? void 0 : scores.cronbachs_alpha,
99
104
  label: (0, _formatMessage.default)('Cronbach\'s Alpha'),
100
105
  popoverDescription: _popoverContent.cronbachsAlpha
101
106
  })));
102
107
  };
103
108
 
104
- return _this;
105
- }
106
-
107
- (0, _createClass2.default)(NewQuizAnalysis, [{
108
- key: "render",
109
- value: function render() {
110
- var quizAnalysis = this.props.quizAnalysis;
109
+ _this.renderContent = function () {
110
+ var quizAnalysis = _this.props.quizAnalysis;
111
111
  var scores = quizAnalysis.scores,
112
112
  attempts = quizAnalysis.attempts,
113
113
  metadata = quizAnalysis.metadata;
114
- var expanded = this.state.expanded;
114
+ var expanded = _this.state.expanded;
115
115
  return /*#__PURE__*/_react.default.createElement(_index2.default, {
116
116
  className: styles.cardWrapper
117
117
  }, /*#__PURE__*/_react.default.createElement("div", {
@@ -144,7 +144,7 @@ var NewQuizAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
144
144
  }, /*#__PURE__*/_react.default.createElement(_index4.default, {
145
145
  metricKey: "median_percentage",
146
146
  label: (0, _formatMessage.default)('Median Score'),
147
- value: _formatMessage.default.number(scores === null || scores === void 0 ? void 0 : scores.median_percentage),
147
+ value: scores === null || scores === void 0 ? void 0 : scores.median_percentage,
148
148
  suffix: "%"
149
149
  }), /*#__PURE__*/_react.default.createElement(_index4.default, {
150
150
  metricKey: "mean_elapsed_sec",
@@ -153,19 +153,39 @@ var NewQuizAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
153
153
  })), /*#__PURE__*/_react.default.createElement("div", {
154
154
  className: styles.expandButtonContainer
155
155
  }, /*#__PURE__*/_react.default.createElement(_index.default, {
156
- onClick: this.handleToggle,
156
+ onClick: _this.handleToggle,
157
157
  title: expanded ? (0, _formatMessage.default)('collapse quiz analysis') : (0, _formatMessage.default)('expand quiz analysis'),
158
158
  isExpanded: expanded
159
- }))), expanded && this.renderExpanded(), /*#__PURE__*/_react.default.createElement(_presenter.ScoreDistribution, {
160
- decileDistribution: quizAnalysis.scores.decile_distribution
159
+ }))), expanded && _this.renderExpanded(), /*#__PURE__*/_react.default.createElement(_presenter.ScoreDistribution, {
160
+ decileDistribution: scores === null || scores === void 0 ? void 0 : scores.decile_distribution
161
161
  }));
162
+ };
163
+
164
+ return _this;
165
+ }
166
+
167
+ (0, _createClass2.default)(NewQuizAnalysis, [{
168
+ key: "render",
169
+ value: function render() {
170
+ var fetchInProgress = this.props.fetchInProgress;
171
+
172
+ if (fetchInProgress) {
173
+ return /*#__PURE__*/_react.default.createElement(_index2.default, {
174
+ className: styles.skeletonCardWrapper
175
+ }, /*#__PURE__*/_react.default.createElement(_uiSpinner.Spinner, {
176
+ renderTitle: (0, _formatMessage.default)('Loading quiz analysis data')
177
+ }));
178
+ } else {
179
+ return this.renderContent();
180
+ }
162
181
  }
163
182
  }]);
164
183
  NewQuizAnalysis.displayName = "NewQuizAnalysis";
165
184
  return NewQuizAnalysis;
166
185
  }(_react.Component), _class2.propTypes = {
167
- quizAnalysis: _propTypes.quizAnalysisPropType.isRequired
168
- }, _class2.defaultProps = {
186
+ quizAnalysis: _propTypes.quizAnalysisPropType,
187
+ fetchInProgress: _propTypes2.default.bool
188
+ }.isRequired, _class2.defaultProps = {
169
189
  quizAnalysis: {}
170
190
  }, _temp)) || _class);
171
191
  exports.NewQuizAnalysis = NewQuizAnalysis;
@@ -9,6 +9,8 @@ function generator(_ref) {
9
9
  var spacing = _ref.spacing;
10
10
  return {
11
11
  metricGroupPaddingTop: spacing.medium,
12
+ cardTopMargin: spacing.small,
13
+ cardBottomMargin: spacing.medium,
12
14
  viewPaddingRight: spacing.large,
13
15
  viewPaddingTop: spacing.medium,
14
16
  headingPadding: spacing.medium,
@@ -84,7 +84,7 @@ var ScoreDistribution = (_dec = (0, _uiThemeable.themeable)(_theme.default, styl
84
84
  }, (0, _formatMessage.default)('Score Distribution'))), /*#__PURE__*/_react.default.createElement(_index.default, {
85
85
  animateDelay: 1000,
86
86
  animateDuration: 1000,
87
- visualDistribution: this.props.decileDistribution,
87
+ visualDistribution: this.props.decileDistribution || [],
88
88
  calculateLabelForColumn: this.calculateLabelForColumn
89
89
  }), /*#__PURE__*/_react.default.createElement("div", {
90
90
  className: styles.chartLabel
@@ -25,8 +25,6 @@ var _index = _interopRequireDefault(require("./NewItemAnalysis/index.js"));
25
25
 
26
26
  var _index2 = _interopRequireDefault(require("./NewQuizAnalysis/index.js"));
27
27
 
28
- var _Spinner = _interopRequireDefault(require("../../../../common/components/shared/spinner/Spinner.js"));
29
-
30
28
  var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
31
29
 
32
30
  var _uiFlex = require("@instructure/ui-flex");
@@ -37,7 +35,13 @@ var _propTypes = require("./propTypes.js");
37
35
 
38
36
  var _propTypes2 = _interopRequireDefault(require("prop-types"));
39
37
 
40
- var _ref = /*#__PURE__*/_react.default.createElement(_Spinner.default, null);
38
+ var _Spinner = require("../../../../common/components/shared/spinner/Spinner.js");
39
+
40
+ var _uiSpinner = require("@instructure/ui-spinner");
41
+
42
+ var _uiButtons = require("@instructure/ui-buttons");
43
+
44
+ var _uiText = require("@instructure/ui-text");
41
45
 
42
46
  var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component) {
43
47
  (0, _inherits2.default)(NewQuizAndItemAnalysisPresenter, _Component);
@@ -45,48 +49,107 @@ var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component) {
45
49
  var _super = (0, _createSuper2.default)(NewQuizAndItemAnalysisPresenter);
46
50
 
47
51
  function NewQuizAndItemAnalysisPresenter() {
52
+ var _this;
53
+
48
54
  (0, _classCallCheck2.default)(this, NewQuizAndItemAnalysisPresenter);
49
- return _super.apply(this, arguments);
55
+
56
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
57
+ args[_key] = arguments[_key];
58
+ }
59
+
60
+ _this = _super.call.apply(_super, [this].concat(args));
61
+
62
+ _this.renderItemAnalyses = function () {
63
+ var itemAnalyses = _this.props.itemAnalyses;
64
+ return /*#__PURE__*/_react.default.createElement("div", null, itemAnalyses.map(function (itemAnalysis) {
65
+ return /*#__PURE__*/_react.default.createElement(_index.default, {
66
+ key: itemAnalysis.metadata.item_id,
67
+ itemAnalysis: itemAnalysis
68
+ });
69
+ }));
70
+ };
71
+
72
+ _this.renderSpinner = function () {
73
+ return /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
74
+ padding: "medium",
75
+ justifyItems: "center",
76
+ alignItems: "center"
77
+ }, /*#__PURE__*/_react.default.createElement(_uiSpinner.Spinner, {
78
+ renderTitle: (0, _formatMessage.default)('Loading item analyses data')
79
+ }));
80
+ };
81
+
82
+ _this.renderOngoingGenerationButton = function () {
83
+ return /*#__PURE__*/_react.default.createElement(_uiButtons.Button, {
84
+ color: "primary-inverse",
85
+ interaction: "disabled",
86
+ margin: "0 0 x-small 0"
87
+ }, /*#__PURE__*/_react.default.createElement(_Spinner.QuizzesSpinner, {
88
+ size: "x-small",
89
+ color: "brand",
90
+ minHeight: "0",
91
+ mainText: (0, _formatMessage.default)('Generation In Progress'),
92
+ fontSize: "medium"
93
+ }));
94
+ };
95
+
96
+ _this.renderStartGenerationButton = function () {
97
+ return /*#__PURE__*/_react.default.createElement(_uiButtons.Button, {
98
+ color: "primary-inverse",
99
+ margin: "0 0 x-small 0",
100
+ onClick: _this.handleGeneration,
101
+ theme: {
102
+ lineHeight: '24px'
103
+ }
104
+ }, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
105
+ size: "medium"
106
+ }, (0, _formatMessage.default)('Generate Report')));
107
+ };
108
+
109
+ _this.renderGenerationButton = function () {
110
+ return _this.props.generationInProgress ? _this.renderOngoingGenerationButton() : _this.renderStartGenerationButton();
111
+ };
112
+
113
+ _this.handleGeneration = function (_event) {
114
+ var filter = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 'last_attempt';
115
+
116
+ _this.props.generateReports(filter);
117
+ };
118
+
119
+ return _this;
50
120
  }
51
121
 
52
122
  (0, _createClass2.default)(NewQuizAndItemAnalysisPresenter, [{
53
- key: "renderContent",
54
- value: function renderContent() {
123
+ key: "render",
124
+ value: function render() {
55
125
  var _this$props = this.props,
56
- quizAnalysis = _this$props.quizAnalysis,
57
- itemAnalyses = _this$props.itemAnalyses;
126
+ analysisError = _this$props.analysisError,
127
+ fetchInProgress = _this$props.fetchInProgress,
128
+ generationInProgress = _this$props.generationInProgress,
129
+ quizAnalysis = _this$props.quizAnalysis;
130
+ var shouldShowError = analysisError && !fetchInProgress && !generationInProgress;
58
131
  return /*#__PURE__*/_react.default.createElement("div", {
59
132
  className: "fs-mask"
60
133
  }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
61
- justifyItems: "end",
134
+ alignItems: "end",
62
135
  width: "82.5rem",
63
- margin: "auto"
64
- }, /*#__PURE__*/_react.default.createElement(_index3.AnalysisUpdateDate, {
136
+ margin: "auto",
137
+ direction: "column"
138
+ }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
139
+ overflowY: "visible"
140
+ }, !fetchInProgress && this.renderGenerationButton()), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, null, shouldShowError && /*#__PURE__*/_react.default.createElement(_uiText.Text, {
141
+ size: "x-small",
142
+ weight: "bold",
143
+ color: "danger"
144
+ }, analysisError)), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, null, !fetchInProgress && /*#__PURE__*/_react.default.createElement(_index3.AnalysisUpdateDate, {
65
145
  date: quizAnalysis.created_timestamp
66
- })), /*#__PURE__*/_react.default.createElement(_index2.default, {
67
- quizAnalysis: quizAnalysis
68
- }), /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
69
- level: "h3",
146
+ }))), /*#__PURE__*/_react.default.createElement(_index2.default, {
147
+ quizAnalysis: quizAnalysis,
148
+ fetchInProgress: fetchInProgress
149
+ }), !fetchInProgress && /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
150
+ level: "h2",
70
151
  color: "primary"
71
- }, (0, _formatMessage.default)('Item Analysis')), itemAnalyses === null || itemAnalyses === void 0 ? void 0 : itemAnalyses.map(function (itemAnalysis) {
72
- return /*#__PURE__*/_react.default.createElement(_index.default, {
73
- key: itemAnalysis.metadata.item_id,
74
- itemAnalysis: itemAnalysis
75
- });
76
- }));
77
- }
78
- }, {
79
- key: "render",
80
- value: function render() {
81
- var _this$props2 = this.props,
82
- quizAnalysis = _this$props2.quizAnalysis,
83
- itemAnalyses = _this$props2.itemAnalyses;
84
-
85
- if (quizAnalysis && itemAnalyses) {
86
- return this.renderContent();
87
- } else {
88
- return _ref;
89
- }
152
+ }, (0, _formatMessage.default)('Item Analysis')), fetchInProgress ? this.renderSpinner() : this.renderItemAnalyses());
90
153
  }
91
154
  }]);
92
155
  NewQuizAndItemAnalysisPresenter.displayName = "NewQuizAndItemAnalysisPresenter";
@@ -96,9 +159,14 @@ var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component) {
96
159
  exports.NewQuizAndItemAnalysisPresenter = NewQuizAndItemAnalysisPresenter;
97
160
  NewQuizAndItemAnalysisPresenter.propTypes = {
98
161
  quizAnalysis: _propTypes.quizAnalysisPropType,
99
- itemAnalyses: _propTypes2.default.arrayOf(_propTypes.itemAnalysisPropType)
162
+ itemAnalyses: _propTypes2.default.arrayOf(_propTypes.itemAnalysisPropType),
163
+ fetchInProgress: _propTypes2.default.bool.isRequired,
164
+ generationInProgress: _propTypes2.default.bool.isRequired,
165
+ analysisError: _propTypes2.default.string,
166
+ generateReports: _propTypes2.default.func.isRequired
100
167
  };
101
168
  NewQuizAndItemAnalysisPresenter.defaultProps = {
169
+ analysisError: void 0,
102
170
  quizAnalysis: void 0,
103
171
  itemAnalyses: void 0
104
172
  };
@@ -9,12 +9,21 @@ exports.getSanitizedMetricValue = void 0;
9
9
 
10
10
  var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
11
11
 
12
+ var formatNumbers = function formatNumbers(value) {
13
+ if (typeof value === 'number') {
14
+ return _formatMessage.default.number(value);
15
+ }
16
+
17
+ return value;
18
+ };
19
+
12
20
  var getSanitizedMetricValue = function getSanitizedMetricValue(value, suffix) {
13
21
  if (value === null || value === void 0) {
14
22
  return (0, _formatMessage.default)('N/A');
15
23
  }
16
24
 
17
- return suffix ? value + suffix : value;
25
+ var formattedValue = formatNumbers(value);
26
+ return suffix ? formattedValue + suffix : formattedValue;
18
27
  };
19
28
 
20
29
  exports.getSanitizedMetricValue = getSanitizedMetricValue;
@@ -122,7 +122,7 @@ var withAnalysisStatePresenter = function withAnalysisStatePresenter(OriginalCom
122
122
  case 0:
123
123
  hasStoredAnalyses = quizAnalysis && itemAnalyses;
124
124
 
125
- if (!(!hasStoredAnalyses && !fetchInProgress)) {
125
+ if (hasStoredAnalyses) {
126
126
  _context.next = 4;
127
127
  break;
128
128
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instructure/quiz-core",
3
- "version": "17.64.1-rc.2+819871daa",
3
+ "version": "17.64.1-rc.6+4603e7609",
4
4
  "license": "MIT",
5
5
  "description": "The Quiz React SDK by Instructure Inc.",
6
6
  "author": "Instructure, Inc. Engineering and Product Design",
@@ -40,12 +40,13 @@
40
40
  "lib"
41
41
  ],
42
42
  "dependencies": {
43
+ "@instructure/grading-utils": "^1.0.0",
43
44
  "@instructure/outcomes-ui": "^2.1.9",
44
- "@instructure/quiz-common": "17.64.1-rc.2+819871daa",
45
- "@instructure/quiz-i18n": "17.64.1-rc.2+819871daa",
46
- "@instructure/quiz-interactions": "17.64.1-rc.2+819871daa",
47
- "@instructure/quiz-number-input": "17.64.1-rc.2+819871daa",
48
- "@instructure/quiz-rce": "17.64.1-rc.2+819871daa",
45
+ "@instructure/quiz-common": "17.64.1-rc.6+4603e7609",
46
+ "@instructure/quiz-i18n": "17.64.1-rc.6+4603e7609",
47
+ "@instructure/quiz-interactions": "17.64.1-rc.6+4603e7609",
48
+ "@instructure/quiz-number-input": "17.64.1-rc.6+4603e7609",
49
+ "@instructure/quiz-rce": "17.64.1-rc.6+4603e7609",
49
50
  "@instructure/ui-a11y-content": "^7.20.0",
50
51
  "@instructure/ui-alerts": "^7.20.0",
51
52
  "@instructure/ui-avatar": "^7.20.0",
@@ -106,7 +107,7 @@
106
107
  "eventemitter3": "^3.1.0",
107
108
  "humps": "^2.0.0",
108
109
  "immutable": "^3.8.1",
109
- "instructure-validations": "17.64.1-rc.2+819871daa",
110
+ "instructure-validations": "17.64.1-rc.6+4603e7609",
110
111
  "ipaddr.js": "^1.5.4",
111
112
  "isomorphic-fetch": "^2.2.0",
112
113
  "isuuid": "^0.1.0",
@@ -157,7 +158,7 @@
157
158
  "intl": "^1.2.4",
158
159
  "jquery": "^2.2.3",
159
160
  "most-subject": "^5.3.0",
160
- "quiz-presets": "17.64.1-rc.2+819871daa",
161
+ "quiz-presets": "17.64.1-rc.6+4603e7609",
161
162
  "react": "^16.8.6",
162
163
  "react-addons-test-utils": "^15.6.2",
163
164
  "react-dom": "^16.8.6",
@@ -173,5 +174,5 @@
173
174
  "publishConfig": {
174
175
  "access": "public"
175
176
  },
176
- "gitHead": "819871daafc1c68e4691ee2efbdfe6108144329e"
177
+ "gitHead": "4603e76094b6047dcfd896183b6a5c8243b7cc92"
177
178
  }