@instructure/quiz-core 17.58.2-rc.8 → 17.59.1-rc.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,27 @@
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
+ # [17.59.0](https://gerrit.instructure.com/quizzes-ui/compare/v17.58.1...v17.59.0) (2023-07-12)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **quiz-core:** Increase sidebar window resize test timeout ([0716a78](https://gerrit.instructure.com/quizzes-ui/commits/0716a7873da0fb869dd529065be9ad6fb5eceab7))
12
+
13
+
14
+ ### Features
15
+
16
+ * **Export:** add alert when export starts ([a1e4d07](https://gerrit.instructure.com/quizzes-ui/commits/a1e4d07d82fa8acf8cd4a11e5120e1c9a12d68b9))
17
+ * **itemanalysis:** item overview ([623c562](https://gerrit.instructure.com/quizzes-ui/commits/623c562cd0e8f4d89e5c5480e383e8c8ddc01546))
18
+ * **quizanalysis:** score distribution chart ([6f8fb67](https://gerrit.instructure.com/quizzes-ui/commits/6f8fb67283b864ad86c4591a16a7e38d880918ce))
19
+ * **Reports:** Add initial report card for the new analysis UI ([2291f06](https://gerrit.instructure.com/quizzes-ui/commits/2291f061ed85f10cd0648eef4a254b8b2975fb50))
20
+ * **Reports:** Show points possible next to certain metrics for item analysis ([8dccd4a](https://gerrit.instructure.com/quizzes-ui/commits/8dccd4adaa3fd5c6594e78f02b25acf7d3a03444))
21
+ * **sharing:** Add share checkbox on bank details ([a2806a2](https://gerrit.instructure.com/quizzes-ui/commits/a2806a24eb3fd90deeaf76b10b647ba9cfd9ed4a))
22
+
23
+
24
+
25
+
26
+
6
27
  ## [17.58.1](https://gerrit.instructure.com/quizzes-ui/compare/v17.58.0...v17.58.1) (2023-06-27)
7
28
 
8
29
  **Note:** Version bump only for package @instructure/quiz-core
@@ -1,4 +1,5 @@
1
1
  import t from '@instructure/quiz-i18n/es/format-message';
2
+ import { DateTime } from 'luxon';
2
3
  var minuteDuration = 60;
3
4
  var hourDuration = 3600;
4
5
 
@@ -60,4 +61,9 @@ export function formatTimeToFullNumeric(seconds) {
60
61
  var minutesStr = minutes < 10 ? '0' + minutes : minutes;
61
62
  var secsStr = secs < 10 ? '0' + secs : secs;
62
63
  return "".concat(hoursStr, ":").concat(minutesStr, ":").concat(secsStr);
64
+ }
65
+ export function displayDateAndTimeInTimezone(utcDateTime, userTimezone, locale) {
66
+ return DateTime.fromISO(utcDateTime, {
67
+ zone: userTimezone
68
+ }).setLocale(locale).toLocaleString(DateTime.DATETIME_MED);
63
69
  }
@@ -57,7 +57,7 @@ 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]).isRequired,
60
+ value: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.array]).isRequired,
61
61
  suffix: PropTypes.string
62
62
  }, _class2.defaultProps = {
63
63
  suffix: ''
@@ -9,23 +9,24 @@ var _dec, _class, _class2, _temp;
9
9
  import { Heading } from '@instructure/ui-heading';
10
10
  import React, { Component } from 'react';
11
11
  var styles = {
12
- componentId: 'dcJyB',
12
+ componentId: 'eLWCD',
13
13
  template: function template(theme) {
14
- return "\n\n.dcJyB_eDnN{display:flex;flex-basis:45%;flex-direction:column;overflow:hidden}\n\n.dcJyB_eKXQ{padding:".concat(theme.cardWrapperPadding || 'inherit', ";position:relative}\n\n.dcJyB_eIAv{display:flex;position:relative}\n\n.dcJyB_ePHw{flex-basis:91%;overflow:hidden;padding-bottom:10px;text-overflow:ellipsis;white-space:nowrap}\n\n.dcJyB_dzsH{overflow:visible;text-overflow:unset;white-space:normal}\n\n.dcJyB_byoJ{position:absolute;right:7px;top:-8px}\n\n.dcJyB_evBt{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}\n\n.dcJyB_pAQb{display:flex;flex-direction:column;height:60px}\n\n.dcJyB_zefc{display:flex;flex-basis:55%;justify-content:flex-end}\n\n.dcJyB_dPzc{flex-direction:column}\n\n.dcJyB_dPzc,.dcJyB_dzph{display:flex;flex-basis:100%}\n\n.dcJyB_dzph{align-items:flex-start;box-sizing:border-box;column-gap:5px;justify-content:space-between;padding:0 30px 0 25px}\n\n.dcJyB_eobd{padding-top:1rem}\n\n.dcJyB_NpIG{position:absolute;right:").concat(theme.viewPadding || 'inherit', ";top:").concat(theme.viewPadding || 'inherit', "}\n\n@media screen and (--tabletBreakPoint){.dcJyB_zefc{flex-basis:100%;justify-content:flex-start}.dcJyB_ePHw{flex-basis:94%}.dcJyB_eDnN{flex-basis:100%}.dcJyB_dzph{padding:0}.dcJyB_eDnN h3{padding-right:30px}.dcJyB_NpIG{right:17px}.dcJyB_eIAv{margin-bottom:20px}.dcJyB_byoJ{right:-7px}.dcJyB_dzph{flex-wrap:wrap}}");
14
+ return "\n\n.eLWCD_eDnN{display:flex;flex-basis:45%;flex-direction:column;overflow:hidden}\n\n.eLWCD_eKXQ{padding:".concat(theme.cardWrapperPadding || 'inherit', ";position:relative}\n\n.eLWCD_eoBe{font-size:").concat(theme.metricNumberContextFontSize || 'inherit', ";font-weight:").concat(theme.metricNumberContextFontWeight || 'inherit', "}\n\n.eLWCD_eIAv{display:flex;position:relative}\n\n.eLWCD_ePHw{flex-basis:91%;overflow:hidden;padding-bottom:10px;text-overflow:ellipsis;white-space:nowrap}\n\n.eLWCD_dzsH{overflow:visible;text-overflow:unset;white-space:normal}\n\n.eLWCD_byoJ{position:absolute;right:7px;top:-8px}\n\n.eLWCD_evBt{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}\n\n.eLWCD_pAQb{display:flex;flex-direction:column;height:60px}\n\n.eLWCD_zefc{display:flex;flex-basis:55%;justify-content:flex-end}\n\n.eLWCD_dPzc{flex-direction:column}\n\n.eLWCD_dPzc,.eLWCD_dzph{display:flex;flex-basis:100%}\n\n.eLWCD_dzph{align-items:flex-start;box-sizing:border-box;column-gap:5px;justify-content:space-between;padding:0 30px 0 25px}\n\n.eLWCD_eobd{padding-top:1rem}\n\n.eLWCD_NpIG{position:absolute;right:").concat(theme.viewPadding || 'inherit', ";top:").concat(theme.viewPadding || 'inherit', "}\n\n@media screen and (--tabletBreakPoint){.eLWCD_zefc{flex-basis:100%;justify-content:flex-start}.eLWCD_ePHw{flex-basis:94%}.eLWCD_eDnN{flex-basis:100%}.eLWCD_dzph{padding:0}.eLWCD_eDnN h3{padding-right:30px}.eLWCD_NpIG{right:17px}.eLWCD_eIAv{margin-bottom:20px}.eLWCD_byoJ{right:-7px}.eLWCD_dzph{flex-wrap:wrap}}");
15
15
  },
16
- 'heading': 'dcJyB_eDnN',
17
- 'cardWrapper': 'dcJyB_eKXQ',
18
- 'bodyPresentation': 'dcJyB_eIAv',
19
- 'bodyExcerpt': 'dcJyB_ePHw',
20
- 'bodyExcerptExpanded': 'dcJyB_dzsH',
21
- 'bodyExpandButtonWrapper': 'dcJyB_byoJ',
22
- 'innerWrapper': 'dcJyB_evBt',
23
- 'expandableInnerWrapper': 'dcJyB_pAQb',
24
- 'metricsWithControls': 'dcJyB_zefc',
25
- 'metricGroup': 'dcJyB_dPzc',
26
- 'metricsRow': 'dcJyB_dzph',
27
- 'metricsRowPaginated': 'dcJyB_eobd',
28
- 'itemCardToggleButtonWrapper': 'dcJyB_NpIG'
16
+ 'heading': 'eLWCD_eDnN',
17
+ 'cardWrapper': 'eLWCD_eKXQ',
18
+ 'metricNumberContext': 'eLWCD_eoBe',
19
+ 'bodyPresentation': 'eLWCD_eIAv',
20
+ 'bodyExcerpt': 'eLWCD_ePHw',
21
+ 'bodyExcerptExpanded': 'eLWCD_dzsH',
22
+ 'bodyExpandButtonWrapper': 'eLWCD_byoJ',
23
+ 'innerWrapper': 'eLWCD_evBt',
24
+ 'expandableInnerWrapper': 'eLWCD_pAQb',
25
+ 'metricsWithControls': 'eLWCD_zefc',
26
+ 'metricGroup': 'eLWCD_dPzc',
27
+ 'metricsRow': 'eLWCD_dzph',
28
+ 'metricsRowPaginated': 'eLWCD_eobd',
29
+ 'itemCardToggleButtonWrapper': 'eLWCD_NpIG'
29
30
  };
30
31
  import t from '@instructure/quiz-i18n/es/format-message';
31
32
  import ExpandButton from "../../../../../common/components/shared/ExpandButton/index.js";
@@ -129,10 +130,26 @@ export var NewItemAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_t
129
130
  }));
130
131
  };
131
132
 
133
+ _this.calculateValueWithPointsPossible = function (metricKey, metricValue) {
134
+ var pointsPossible = _this.props.itemAnalysis.scores.points_possible;
135
+ return t.rich('{score, number}<s>/{possible, number} PTS</s>', {
136
+ s: function s(_ref) {
137
+ var children = _ref.children;
138
+ return /*#__PURE__*/React.createElement("span", {
139
+ key: metricKey,
140
+ className: styles.metricNumberContext
141
+ }, children);
142
+ },
143
+ score: metricValue,
144
+ possible: pointsPossible
145
+ });
146
+ };
147
+
132
148
  _this.renderExpanded = function () {
133
149
  var scores = _this.props.itemAnalysis.scores;
150
+ var classes = classnames(styles.metricsRow, styles.metricsRowPaginated);
134
151
  return /*#__PURE__*/React.createElement("div", {
135
- className: [styles.metricsRow, styles.metricsRowPaginated].join(' ')
152
+ className: classes
136
153
  }, /*#__PURE__*/React.createElement(AnalysisPopoverMetric, {
137
154
  metricKey: "pearson_correlation",
138
155
  label: t('Pearson Correlation Coefficient'),
@@ -202,11 +219,11 @@ export var NewItemAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_t
202
219
  }), /*#__PURE__*/React.createElement(AnalysisMetric, {
203
220
  metricKey: "mean",
204
221
  label: t('Mean Earned Points'),
205
- value: t.number(scores.mean)
222
+ value: this.calculateValueWithPointsPossible('mean', scores.mean)
206
223
  }), /*#__PURE__*/React.createElement(AnalysisMetric, {
207
224
  metricKey: "median",
208
225
  label: t('Median Earned Points'),
209
- value: t.number(scores.median)
226
+ value: this.calculateValueWithPointsPossible('median', scores.median)
210
227
  }), /*#__PURE__*/React.createElement(AnalysisPopoverMetric, {
211
228
  metricKey: "discrimination_index",
212
229
  label: t('Discrimination Index'),
@@ -1,9 +1,12 @@
1
1
  export default function generator(_ref) {
2
2
  var spacing = _ref.spacing,
3
- breakpoints = _ref.breakpoints;
3
+ breakpoints = _ref.breakpoints,
4
+ typography = _ref.typography;
4
5
  return {
5
6
  tabletBreakPoint: "max-width: ".concat(breakpoints.large),
6
7
  cardWrapperPadding: spacing.medium,
7
- viewPadding: spacing.small
8
+ viewPadding: spacing.small,
9
+ metricNumberContextFontSize: typography.fontSizeMedium,
10
+ metricNumberContextFontWeight: typography.fontWeightNormal
8
11
  };
9
12
  }
@@ -21,7 +21,6 @@ var styles = {
21
21
  };
22
22
  import t from '@instructure/quiz-i18n/es/format-message';
23
23
  import ExpandButton from "../../../../../common/components/shared/ExpandButton/index.js";
24
- import { Text } from '@instructure/ui-text';
25
24
  import { themeable } from '@instructure/ui-themeable';
26
25
  import theme from "./theme.js";
27
26
  import { formatTimeToFullNumeric } from "../../../../../common/util/formatTimespan.js";
@@ -42,9 +41,6 @@ var cronbachsAlphaPopoverTexts = {
42
41
  body: 'cronbach\'s alpha description',
43
42
  screenReaderLabel: 'cronbach\'s alpha tooltip'
44
43
  };
45
-
46
- var _ref = /*#__PURE__*/React.createElement("br", null);
47
-
48
44
  export var NewQuizAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
49
45
  _inherits(NewQuizAnalysis, _Component);
50
46
 
@@ -149,9 +145,7 @@ export var NewQuizAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_t
149
145
  isExpanded: expanded
150
146
  }))), expanded && this.renderExpanded(), /*#__PURE__*/React.createElement(ScoreDistribution, {
151
147
  decileDistribution: quizAnalysis.scores.decile_distribution
152
- }), /*#__PURE__*/React.createElement(Text, {
153
- size: "x-small"
154
- }, _ref, /*#__PURE__*/React.createElement("b", null, t('Data Last Updated:')), "\xA0", t.date(Date.parse(quizAnalysis.created_timestamp), 'medium')));
148
+ }));
155
149
  }
156
150
  }]);
157
151
 
@@ -1,126 +1,150 @@
1
1
  import _regeneratorRuntime from "@babel/runtime/regenerator";
2
2
  import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
- import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
4
- import React, { useEffect, useState } from 'react';
3
+ import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
4
+ import _createClass from "@babel/runtime/helpers/esm/createClass";
5
+ import _inherits from "@babel/runtime/helpers/esm/inherits";
6
+ import _createSuper from "@babel/runtime/helpers/esm/createSuper";
7
+ import React, { Component } from 'react';
5
8
  import PropTypes from 'prop-types';
6
9
  import { Heading } from '@instructure/ui-heading';
7
10
  import NewItemAnalysis from "./NewItemAnalysis/index.js";
8
11
  import Spinner from "../../../../common/components/shared/spinner/Spinner.js";
9
12
  import NewQuizAnalysis from "./NewQuizAnalysis/index.js";
13
+ import t from '@instructure/quiz-i18n/es/format-message';
14
+ import { Text } from '@instructure/ui-text';
15
+ import { Flex } from '@instructure/ui-flex';
16
+ import { displayDateAndTimeInTimezone } from "../../../../common/util/formatTimespan.js";
10
17
 
11
- var _ref5 = /*#__PURE__*/React.createElement(Heading, {
12
- level: "h3",
13
- color: "primary"
14
- }, "Item analysis");
15
-
16
- var _ref6 = /*#__PURE__*/React.createElement(Spinner, null);
17
-
18
- export var NewQuizAndItemAnalysis = function NewQuizAndItemAnalysis(_ref) {
19
- var activeQuizId = _ref.activeQuizId,
20
- getQuizAnalysis = _ref.getQuizAnalysis,
21
- getItemAnalyses = _ref.getItemAnalyses;
22
-
23
- var _useState = useState(null),
24
- _useState2 = _slicedToArray(_useState, 2),
25
- quizAnalysis = _useState2[0],
26
- setQuizAnalysis = _useState2[1];
27
-
28
- var _useState3 = useState(null),
29
- _useState4 = _slicedToArray(_useState3, 2),
30
- itemAnalyses = _useState4[0],
31
- setItemAnalyses = _useState4[1];
32
-
33
- useEffect(function () {
34
- var fetch = /*#__PURE__*/function () {
35
- var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
36
- var response;
37
- return _regeneratorRuntime.wrap(function _callee$(_context) {
38
- while (1) {
39
- switch (_context.prev = _context.next) {
40
- case 0:
41
- _context.next = 2;
42
- return getQuizAnalysis(activeQuizId);
43
-
44
- case 2:
45
- response = _context.sent;
46
-
47
- if (response) {
48
- setQuizAnalysis(response.last_successful_analysis);
49
- }
50
-
51
- case 4:
52
- case "end":
53
- return _context.stop();
54
- }
55
- }
56
- }, _callee);
57
- }));
18
+ var _ref3 = /*#__PURE__*/React.createElement(Spinner, null);
58
19
 
59
- return function fetch() {
60
- return _ref2.apply(this, arguments);
61
- };
62
- }();
63
-
64
- fetch();
65
- }, []);
66
- useEffect(function () {
67
- var fetch = /*#__PURE__*/function () {
68
- var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
69
- var response;
70
- return _regeneratorRuntime.wrap(function _callee2$(_context2) {
71
- while (1) {
72
- switch (_context2.prev = _context2.next) {
73
- case 0:
74
- _context2.next = 2;
75
- return getItemAnalyses(activeQuizId);
76
-
77
- case 2:
78
- response = _context2.sent;
79
-
80
- if (response) {
81
- setItemAnalyses(response.last_successful_analysis);
82
- }
83
-
84
- case 4:
85
- case "end":
86
- return _context2.stop();
87
- }
88
- }
89
- }, _callee2);
90
- }));
20
+ export var NewQuizAndItemAnalysis = /*#__PURE__*/function (_Component) {
21
+ _inherits(NewQuizAndItemAnalysis, _Component);
91
22
 
92
- return function fetch() {
93
- return _ref3.apply(this, arguments);
94
- };
95
- }();
96
-
97
- fetch();
98
- }, []);
99
-
100
- var _ref4 = /*#__PURE__*/React.createElement(NewQuizAnalysis, {
101
- quizAnalysis: quizAnalysis
102
- });
103
-
104
- var renderContent = function renderContent() {
105
- /* eslint-disable react/jsx-no-literals */
106
- return /*#__PURE__*/React.createElement("div", {
107
- className: "fs-mask"
108
- }, _ref4, _ref5, itemAnalyses === null || itemAnalyses === void 0 ? void 0 : itemAnalyses.map(function (itemAnalysis) {
109
- return /*#__PURE__*/React.createElement(NewItemAnalysis, {
110
- key: itemAnalysis.metadata.item_id,
111
- itemAnalysis: itemAnalysis
112
- });
113
- }));
114
- /* eslint-enable react/jsx-no-literals */
115
- }; // TODO: distinguish between loading and empty item analyses (eg. when there is no items in a quiz)
116
- // once it is known how will be such a case handled by the backend
23
+ var _super = _createSuper(NewQuizAndItemAnalysis);
24
+
25
+ function NewQuizAndItemAnalysis(props) {
26
+ var _this;
27
+
28
+ _classCallCheck(this, NewQuizAndItemAnalysis);
29
+
30
+ _this = _super.call(this, props);
31
+ _this.fetchQuizAnalysis = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
32
+ var _this$props, activeQuizId, getQuizAnalysis, response;
117
33
 
34
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
35
+ while (1) {
36
+ switch (_context.prev = _context.next) {
37
+ case 0:
38
+ _this$props = _this.props, activeQuizId = _this$props.activeQuizId, getQuizAnalysis = _this$props.getQuizAnalysis;
39
+ _context.next = 3;
40
+ return getQuizAnalysis(activeQuizId);
118
41
 
119
- if (quizAnalysis && itemAnalyses) {
120
- return renderContent();
121
- } else {
122
- return _ref6;
42
+ case 3:
43
+ response = _context.sent;
44
+
45
+ if (response) {
46
+ _this.setState({
47
+ quizAnalysis: response.last_successful_analysis
48
+ });
49
+ }
50
+
51
+ case 5:
52
+ case "end":
53
+ return _context.stop();
54
+ }
55
+ }
56
+ }, _callee);
57
+ }));
58
+ _this.fetchItemAnalyses = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
59
+ var _this$props2, activeQuizId, getItemAnalyses, response;
60
+
61
+ return _regeneratorRuntime.wrap(function _callee2$(_context2) {
62
+ while (1) {
63
+ switch (_context2.prev = _context2.next) {
64
+ case 0:
65
+ _this$props2 = _this.props, activeQuizId = _this$props2.activeQuizId, getItemAnalyses = _this$props2.getItemAnalyses;
66
+ _context2.next = 3;
67
+ return getItemAnalyses(activeQuizId);
68
+
69
+ case 3:
70
+ response = _context2.sent;
71
+
72
+ if (response) {
73
+ _this.setState({
74
+ itemAnalyses: response.last_successful_analysis
75
+ });
76
+ }
77
+
78
+ case 5:
79
+ case "end":
80
+ return _context2.stop();
81
+ }
82
+ }
83
+ }, _callee2);
84
+ }));
85
+ _this.state = {
86
+ quizAnalysis: null,
87
+ itemAnalyses: null
88
+ };
89
+ return _this;
123
90
  }
91
+
92
+ _createClass(NewQuizAndItemAnalysis, [{
93
+ key: "componentDidMount",
94
+ value: function componentDidMount() {
95
+ this.fetchQuizAnalysis();
96
+ this.fetchItemAnalyses();
97
+ }
98
+ }, {
99
+ key: "renderContent",
100
+ value: function renderContent() {
101
+ var _this$state = this.state,
102
+ quizAnalysis = _this$state.quizAnalysis,
103
+ itemAnalyses = _this$state.itemAnalyses;
104
+ var _this$context = this.context,
105
+ timezone = _this$context.timezone,
106
+ locale = _this$context.locale;
107
+ return /*#__PURE__*/React.createElement("div", {
108
+ className: "fs-mask"
109
+ }, /*#__PURE__*/React.createElement(Flex, {
110
+ justifyItems: "end",
111
+ width: "82.5rem",
112
+ margin: "auto"
113
+ }, /*#__PURE__*/React.createElement(Text, {
114
+ size: "x-small"
115
+ }, /*#__PURE__*/React.createElement("b", null, t('Data Last Updated:')), "\xA0", displayDateAndTimeInTimezone(quizAnalysis.created_timestamp, timezone, locale))), /*#__PURE__*/React.createElement(NewQuizAnalysis, {
116
+ quizAnalysis: quizAnalysis
117
+ }), /*#__PURE__*/React.createElement(Heading, {
118
+ level: "h3",
119
+ color: "primary"
120
+ }, t('Item Analysis')), itemAnalyses === null || itemAnalyses === void 0 ? void 0 : itemAnalyses.map(function (itemAnalysis) {
121
+ return /*#__PURE__*/React.createElement(NewItemAnalysis, {
122
+ key: itemAnalysis.metadata.item_id,
123
+ itemAnalysis: itemAnalysis
124
+ });
125
+ }));
126
+ }
127
+ }, {
128
+ key: "render",
129
+ value: function render() {
130
+ var _this$state2 = this.state,
131
+ quizAnalysis = _this$state2.quizAnalysis,
132
+ itemAnalyses = _this$state2.itemAnalyses;
133
+
134
+ if (quizAnalysis && itemAnalyses) {
135
+ return this.renderContent();
136
+ } else {
137
+ return _ref3;
138
+ }
139
+ }
140
+ }]);
141
+
142
+ NewQuizAndItemAnalysis.displayName = "NewQuizAndItemAnalysis";
143
+ return NewQuizAndItemAnalysis;
144
+ }(Component);
145
+ NewQuizAndItemAnalysis.contextTypes = {
146
+ timezone: PropTypes.string,
147
+ locale: PropTypes.string
124
148
  };
125
149
  NewQuizAndItemAnalysis.propTypes = {
126
150
  activeQuizId: PropTypes.string.isRequired,
@@ -5,7 +5,7 @@ var getSanitizedMetricValue = function getSanitizedMetricValue(value, suffix) {
5
5
  return t('N/A');
6
6
  }
7
7
 
8
- return value + (suffix ? suffix : '');
8
+ return suffix ? value + suffix : value;
9
9
  };
10
10
 
11
11
  export { getSanitizedMetricValue };
@@ -7,10 +7,13 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.formatTime = formatTime;
9
9
  exports.formatTimeToFullNumeric = formatTimeToFullNumeric;
10
+ exports.displayDateAndTimeInTimezone = displayDateAndTimeInTimezone;
10
11
  exports.formatTimespan = void 0;
11
12
 
12
13
  var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
13
14
 
15
+ var _luxon = require("luxon");
16
+
14
17
  var minuteDuration = 60;
15
18
  var hourDuration = 3600;
16
19
 
@@ -76,4 +79,10 @@ function formatTimeToFullNumeric(seconds) {
76
79
  var minutesStr = minutes < 10 ? '0' + minutes : minutes;
77
80
  var secsStr = secs < 10 ? '0' + secs : secs;
78
81
  return "".concat(hoursStr, ":").concat(minutesStr, ":").concat(secsStr);
82
+ }
83
+
84
+ function displayDateAndTimeInTimezone(utcDateTime, userTimezone, locale) {
85
+ return _luxon.DateTime.fromISO(utcDateTime, {
86
+ zone: userTimezone
87
+ }).setLocale(locale).toLocaleString(_luxon.DateTime.DATETIME_MED);
79
88
  }
@@ -75,7 +75,7 @@ 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]).isRequired,
78
+ value: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string, _propTypes.default.array]).isRequired,
79
79
  suffix: _propTypes.default.string
80
80
  }, _class2.defaultProps = {
81
81
  suffix: ''
@@ -50,23 +50,24 @@ var _interactionTypeMetadata = require("../../../../../common/util/interactionTy
50
50
  var _dec, _class, _class2, _temp;
51
51
 
52
52
  var styles = {
53
- componentId: 'dcJyB',
53
+ componentId: 'eLWCD',
54
54
  template: function template(theme) {
55
- return "\n\n.dcJyB_eDnN{display:flex;flex-basis:45%;flex-direction:column;overflow:hidden}\n\n.dcJyB_eKXQ{padding:".concat(theme.cardWrapperPadding || 'inherit', ";position:relative}\n\n.dcJyB_eIAv{display:flex;position:relative}\n\n.dcJyB_ePHw{flex-basis:91%;overflow:hidden;padding-bottom:10px;text-overflow:ellipsis;white-space:nowrap}\n\n.dcJyB_dzsH{overflow:visible;text-overflow:unset;white-space:normal}\n\n.dcJyB_byoJ{position:absolute;right:7px;top:-8px}\n\n.dcJyB_evBt{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}\n\n.dcJyB_pAQb{display:flex;flex-direction:column;height:60px}\n\n.dcJyB_zefc{display:flex;flex-basis:55%;justify-content:flex-end}\n\n.dcJyB_dPzc{flex-direction:column}\n\n.dcJyB_dPzc,.dcJyB_dzph{display:flex;flex-basis:100%}\n\n.dcJyB_dzph{align-items:flex-start;box-sizing:border-box;column-gap:5px;justify-content:space-between;padding:0 30px 0 25px}\n\n.dcJyB_eobd{padding-top:1rem}\n\n.dcJyB_NpIG{position:absolute;right:").concat(theme.viewPadding || 'inherit', ";top:").concat(theme.viewPadding || 'inherit', "}\n\n@media screen and (--tabletBreakPoint){.dcJyB_zefc{flex-basis:100%;justify-content:flex-start}.dcJyB_ePHw{flex-basis:94%}.dcJyB_eDnN{flex-basis:100%}.dcJyB_dzph{padding:0}.dcJyB_eDnN h3{padding-right:30px}.dcJyB_NpIG{right:17px}.dcJyB_eIAv{margin-bottom:20px}.dcJyB_byoJ{right:-7px}.dcJyB_dzph{flex-wrap:wrap}}");
55
+ return "\n\n.eLWCD_eDnN{display:flex;flex-basis:45%;flex-direction:column;overflow:hidden}\n\n.eLWCD_eKXQ{padding:".concat(theme.cardWrapperPadding || 'inherit', ";position:relative}\n\n.eLWCD_eoBe{font-size:").concat(theme.metricNumberContextFontSize || 'inherit', ";font-weight:").concat(theme.metricNumberContextFontWeight || 'inherit', "}\n\n.eLWCD_eIAv{display:flex;position:relative}\n\n.eLWCD_ePHw{flex-basis:91%;overflow:hidden;padding-bottom:10px;text-overflow:ellipsis;white-space:nowrap}\n\n.eLWCD_dzsH{overflow:visible;text-overflow:unset;white-space:normal}\n\n.eLWCD_byoJ{position:absolute;right:7px;top:-8px}\n\n.eLWCD_evBt{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}\n\n.eLWCD_pAQb{display:flex;flex-direction:column;height:60px}\n\n.eLWCD_zefc{display:flex;flex-basis:55%;justify-content:flex-end}\n\n.eLWCD_dPzc{flex-direction:column}\n\n.eLWCD_dPzc,.eLWCD_dzph{display:flex;flex-basis:100%}\n\n.eLWCD_dzph{align-items:flex-start;box-sizing:border-box;column-gap:5px;justify-content:space-between;padding:0 30px 0 25px}\n\n.eLWCD_eobd{padding-top:1rem}\n\n.eLWCD_NpIG{position:absolute;right:").concat(theme.viewPadding || 'inherit', ";top:").concat(theme.viewPadding || 'inherit', "}\n\n@media screen and (--tabletBreakPoint){.eLWCD_zefc{flex-basis:100%;justify-content:flex-start}.eLWCD_ePHw{flex-basis:94%}.eLWCD_eDnN{flex-basis:100%}.eLWCD_dzph{padding:0}.eLWCD_eDnN h3{padding-right:30px}.eLWCD_NpIG{right:17px}.eLWCD_eIAv{margin-bottom:20px}.eLWCD_byoJ{right:-7px}.eLWCD_dzph{flex-wrap:wrap}}");
56
56
  },
57
- 'heading': 'dcJyB_eDnN',
58
- 'cardWrapper': 'dcJyB_eKXQ',
59
- 'bodyPresentation': 'dcJyB_eIAv',
60
- 'bodyExcerpt': 'dcJyB_ePHw',
61
- 'bodyExcerptExpanded': 'dcJyB_dzsH',
62
- 'bodyExpandButtonWrapper': 'dcJyB_byoJ',
63
- 'innerWrapper': 'dcJyB_evBt',
64
- 'expandableInnerWrapper': 'dcJyB_pAQb',
65
- 'metricsWithControls': 'dcJyB_zefc',
66
- 'metricGroup': 'dcJyB_dPzc',
67
- 'metricsRow': 'dcJyB_dzph',
68
- 'metricsRowPaginated': 'dcJyB_eobd',
69
- 'itemCardToggleButtonWrapper': 'dcJyB_NpIG'
57
+ 'heading': 'eLWCD_eDnN',
58
+ 'cardWrapper': 'eLWCD_eKXQ',
59
+ 'metricNumberContext': 'eLWCD_eoBe',
60
+ 'bodyPresentation': 'eLWCD_eIAv',
61
+ 'bodyExcerpt': 'eLWCD_ePHw',
62
+ 'bodyExcerptExpanded': 'eLWCD_dzsH',
63
+ 'bodyExpandButtonWrapper': 'eLWCD_byoJ',
64
+ 'innerWrapper': 'eLWCD_evBt',
65
+ 'expandableInnerWrapper': 'eLWCD_pAQb',
66
+ 'metricsWithControls': 'eLWCD_zefc',
67
+ 'metricGroup': 'eLWCD_dPzc',
68
+ 'metricsRow': 'eLWCD_dzph',
69
+ 'metricsRowPaginated': 'eLWCD_eobd',
70
+ 'itemCardToggleButtonWrapper': 'eLWCD_NpIG'
70
71
  };
71
72
  var NewItemAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
72
73
  (0, _inherits2.default)(NewItemAnalysis, _Component);
@@ -158,10 +159,26 @@ var NewItemAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
158
159
  }));
159
160
  };
160
161
 
162
+ _this.calculateValueWithPointsPossible = function (metricKey, metricValue) {
163
+ var pointsPossible = _this.props.itemAnalysis.scores.points_possible;
164
+ return _formatMessage.default.rich('{score, number}<s>/{possible, number} PTS</s>', {
165
+ s: function s(_ref) {
166
+ var children = _ref.children;
167
+ return /*#__PURE__*/_react.default.createElement("span", {
168
+ key: metricKey,
169
+ className: styles.metricNumberContext
170
+ }, children);
171
+ },
172
+ score: metricValue,
173
+ possible: pointsPossible
174
+ });
175
+ };
176
+
161
177
  _this.renderExpanded = function () {
162
178
  var scores = _this.props.itemAnalysis.scores;
179
+ var classes = (0, _classnames2.default)(styles.metricsRow, styles.metricsRowPaginated);
163
180
  return /*#__PURE__*/_react.default.createElement("div", {
164
- className: [styles.metricsRow, styles.metricsRowPaginated].join(' ')
181
+ className: classes
165
182
  }, /*#__PURE__*/_react.default.createElement(_index4.default, {
166
183
  metricKey: "pearson_correlation",
167
184
  label: (0, _formatMessage.default)('Pearson Correlation Coefficient'),
@@ -231,11 +248,11 @@ var NewItemAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
231
248
  }), /*#__PURE__*/_react.default.createElement(_index3.default, {
232
249
  metricKey: "mean",
233
250
  label: (0, _formatMessage.default)('Mean Earned Points'),
234
- value: _formatMessage.default.number(scores.mean)
251
+ value: this.calculateValueWithPointsPossible('mean', scores.mean)
235
252
  }), /*#__PURE__*/_react.default.createElement(_index3.default, {
236
253
  metricKey: "median",
237
254
  label: (0, _formatMessage.default)('Median Earned Points'),
238
- value: _formatMessage.default.number(scores.median)
255
+ value: this.calculateValueWithPointsPossible('median', scores.median)
239
256
  }), /*#__PURE__*/_react.default.createElement(_index4.default, {
240
257
  metricKey: "discrimination_index",
241
258
  label: (0, _formatMessage.default)('Discrimination Index'),
@@ -7,10 +7,13 @@ exports.default = generator;
7
7
 
8
8
  function generator(_ref) {
9
9
  var spacing = _ref.spacing,
10
- breakpoints = _ref.breakpoints;
10
+ breakpoints = _ref.breakpoints,
11
+ typography = _ref.typography;
11
12
  return {
12
13
  tabletBreakPoint: "max-width: ".concat(breakpoints.large),
13
14
  cardWrapperPadding: spacing.medium,
14
- viewPadding: spacing.small
15
+ viewPadding: spacing.small,
16
+ metricNumberContextFontSize: typography.fontSizeMedium,
17
+ metricNumberContextFontWeight: typography.fontWeightNormal
15
18
  };
16
19
  }
@@ -25,8 +25,6 @@ var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/f
25
25
 
26
26
  var _index = _interopRequireDefault(require("../../../../../common/components/shared/ExpandButton/index.js"));
27
27
 
28
- var _uiText = require("@instructure/ui-text");
29
-
30
28
  var _uiThemeable = require("@instructure/ui-themeable");
31
29
 
32
30
  var _theme = _interopRequireDefault(require("./theme.js"));
@@ -69,9 +67,6 @@ var cronbachsAlphaPopoverTexts = {
69
67
  body: 'cronbach\'s alpha description',
70
68
  screenReaderLabel: 'cronbach\'s alpha tooltip'
71
69
  };
72
-
73
- var _ref = /*#__PURE__*/_react.default.createElement("br", null);
74
-
75
70
  var NewQuizAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
76
71
  (0, _inherits2.default)(NewQuizAnalysis, _Component);
77
72
 
@@ -176,9 +171,7 @@ var NewQuizAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
176
171
  isExpanded: expanded
177
172
  }))), expanded && this.renderExpanded(), /*#__PURE__*/_react.default.createElement(_presenter.ScoreDistribution, {
178
173
  decileDistribution: quizAnalysis.scores.decile_distribution
179
- }), /*#__PURE__*/_react.default.createElement(_uiText.Text, {
180
- size: "x-small"
181
- }, _ref, /*#__PURE__*/_react.default.createElement("b", null, (0, _formatMessage.default)('Data Last Updated:')), "\xA0", _formatMessage.default.date(Date.parse(quizAnalysis.created_timestamp), 'medium')));
174
+ }));
182
175
  }
183
176
  }]);
184
177
  NewQuizAnalysis.displayName = "NewQuizAnalysis";
@@ -13,7 +13,13 @@ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"))
13
13
 
14
14
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
15
15
 
16
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
16
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
17
+
18
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
19
+
20
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
21
+
22
+ var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
17
23
 
18
24
  var _react = _interopRequireWildcard(require("react"));
19
25
 
@@ -27,122 +33,145 @@ var _Spinner = _interopRequireDefault(require("../../../../common/components/sha
27
33
 
28
34
  var _index2 = _interopRequireDefault(require("./NewQuizAnalysis/index.js"));
29
35
 
30
- var _ref5 = /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
31
- level: "h3",
32
- color: "primary"
33
- }, "Item analysis");
34
-
35
- var _ref6 = /*#__PURE__*/_react.default.createElement(_Spinner.default, null);
36
-
37
- var NewQuizAndItemAnalysis = function NewQuizAndItemAnalysis(_ref) {
38
- var activeQuizId = _ref.activeQuizId,
39
- getQuizAnalysis = _ref.getQuizAnalysis,
40
- getItemAnalyses = _ref.getItemAnalyses;
41
-
42
- var _useState = (0, _react.useState)(null),
43
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
44
- quizAnalysis = _useState2[0],
45
- setQuizAnalysis = _useState2[1];
46
-
47
- var _useState3 = (0, _react.useState)(null),
48
- _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
49
- itemAnalyses = _useState4[0],
50
- setItemAnalyses = _useState4[1];
51
-
52
- (0, _react.useEffect)(function () {
53
- var fetch = /*#__PURE__*/function () {
54
- var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
55
- var response;
56
- return _regenerator.default.wrap(function _callee$(_context) {
57
- while (1) {
58
- switch (_context.prev = _context.next) {
59
- case 0:
60
- _context.next = 2;
61
- return getQuizAnalysis(activeQuizId);
62
-
63
- case 2:
64
- response = _context.sent;
65
-
66
- if (response) {
67
- setQuizAnalysis(response.last_successful_analysis);
68
- }
69
-
70
- case 4:
71
- case "end":
72
- return _context.stop();
73
- }
74
- }
75
- }, _callee);
76
- }));
36
+ var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
77
37
 
78
- return function fetch() {
79
- return _ref2.apply(this, arguments);
80
- };
81
- }();
82
-
83
- fetch();
84
- }, []);
85
- (0, _react.useEffect)(function () {
86
- var fetch = /*#__PURE__*/function () {
87
- var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
88
- var response;
89
- return _regenerator.default.wrap(function _callee2$(_context2) {
90
- while (1) {
91
- switch (_context2.prev = _context2.next) {
92
- case 0:
93
- _context2.next = 2;
94
- return getItemAnalyses(activeQuizId);
95
-
96
- case 2:
97
- response = _context2.sent;
98
-
99
- if (response) {
100
- setItemAnalyses(response.last_successful_analysis);
101
- }
102
-
103
- case 4:
104
- case "end":
105
- return _context2.stop();
106
- }
107
- }
108
- }, _callee2);
109
- }));
38
+ var _uiText = require("@instructure/ui-text");
110
39
 
111
- return function fetch() {
112
- return _ref3.apply(this, arguments);
113
- };
114
- }();
115
-
116
- fetch();
117
- }, []);
118
-
119
- var _ref4 = /*#__PURE__*/_react.default.createElement(_index2.default, {
120
- quizAnalysis: quizAnalysis
121
- });
122
-
123
- var renderContent = function renderContent() {
124
- /* eslint-disable react/jsx-no-literals */
125
- return /*#__PURE__*/_react.default.createElement("div", {
126
- className: "fs-mask"
127
- }, _ref4, _ref5, itemAnalyses === null || itemAnalyses === void 0 ? void 0 : itemAnalyses.map(function (itemAnalysis) {
128
- return /*#__PURE__*/_react.default.createElement(_index.default, {
129
- key: itemAnalysis.metadata.item_id,
130
- itemAnalysis: itemAnalysis
131
- });
132
- }));
133
- /* eslint-enable react/jsx-no-literals */
134
- }; // TODO: distinguish between loading and empty item analyses (eg. when there is no items in a quiz)
135
- // once it is known how will be such a case handled by the backend
40
+ var _uiFlex = require("@instructure/ui-flex");
41
+
42
+ var _formatTimespan = require("../../../../common/util/formatTimespan.js");
43
+
44
+ var _ref3 = /*#__PURE__*/_react.default.createElement(_Spinner.default, null);
45
+
46
+ var NewQuizAndItemAnalysis = /*#__PURE__*/function (_Component) {
47
+ (0, _inherits2.default)(NewQuizAndItemAnalysis, _Component);
48
+
49
+ var _super = (0, _createSuper2.default)(NewQuizAndItemAnalysis);
136
50
 
51
+ function NewQuizAndItemAnalysis(props) {
52
+ var _this;
137
53
 
138
- if (quizAnalysis && itemAnalyses) {
139
- return renderContent();
140
- } else {
141
- return _ref6;
54
+ (0, _classCallCheck2.default)(this, NewQuizAndItemAnalysis);
55
+ _this = _super.call(this, props);
56
+ _this.fetchQuizAnalysis = /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
57
+ var _this$props, activeQuizId, getQuizAnalysis, response;
58
+
59
+ return _regenerator.default.wrap(function _callee$(_context) {
60
+ while (1) {
61
+ switch (_context.prev = _context.next) {
62
+ case 0:
63
+ _this$props = _this.props, activeQuizId = _this$props.activeQuizId, getQuizAnalysis = _this$props.getQuizAnalysis;
64
+ _context.next = 3;
65
+ return getQuizAnalysis(activeQuizId);
66
+
67
+ case 3:
68
+ response = _context.sent;
69
+
70
+ if (response) {
71
+ _this.setState({
72
+ quizAnalysis: response.last_successful_analysis
73
+ });
74
+ }
75
+
76
+ case 5:
77
+ case "end":
78
+ return _context.stop();
79
+ }
80
+ }
81
+ }, _callee);
82
+ }));
83
+ _this.fetchItemAnalyses = /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
84
+ var _this$props2, activeQuizId, getItemAnalyses, response;
85
+
86
+ return _regenerator.default.wrap(function _callee2$(_context2) {
87
+ while (1) {
88
+ switch (_context2.prev = _context2.next) {
89
+ case 0:
90
+ _this$props2 = _this.props, activeQuizId = _this$props2.activeQuizId, getItemAnalyses = _this$props2.getItemAnalyses;
91
+ _context2.next = 3;
92
+ return getItemAnalyses(activeQuizId);
93
+
94
+ case 3:
95
+ response = _context2.sent;
96
+
97
+ if (response) {
98
+ _this.setState({
99
+ itemAnalyses: response.last_successful_analysis
100
+ });
101
+ }
102
+
103
+ case 5:
104
+ case "end":
105
+ return _context2.stop();
106
+ }
107
+ }
108
+ }, _callee2);
109
+ }));
110
+ _this.state = {
111
+ quizAnalysis: null,
112
+ itemAnalyses: null
113
+ };
114
+ return _this;
142
115
  }
143
- };
116
+
117
+ (0, _createClass2.default)(NewQuizAndItemAnalysis, [{
118
+ key: "componentDidMount",
119
+ value: function componentDidMount() {
120
+ this.fetchQuizAnalysis();
121
+ this.fetchItemAnalyses();
122
+ }
123
+ }, {
124
+ key: "renderContent",
125
+ value: function renderContent() {
126
+ var _this$state = this.state,
127
+ quizAnalysis = _this$state.quizAnalysis,
128
+ itemAnalyses = _this$state.itemAnalyses;
129
+ var _this$context = this.context,
130
+ timezone = _this$context.timezone,
131
+ locale = _this$context.locale;
132
+ return /*#__PURE__*/_react.default.createElement("div", {
133
+ className: "fs-mask"
134
+ }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
135
+ justifyItems: "end",
136
+ width: "82.5rem",
137
+ margin: "auto"
138
+ }, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
139
+ size: "x-small"
140
+ }, /*#__PURE__*/_react.default.createElement("b", null, (0, _formatMessage.default)('Data Last Updated:')), "\xA0", (0, _formatTimespan.displayDateAndTimeInTimezone)(quizAnalysis.created_timestamp, timezone, locale))), /*#__PURE__*/_react.default.createElement(_index2.default, {
141
+ quizAnalysis: quizAnalysis
142
+ }), /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
143
+ level: "h3",
144
+ color: "primary"
145
+ }, (0, _formatMessage.default)('Item Analysis')), itemAnalyses === null || itemAnalyses === void 0 ? void 0 : itemAnalyses.map(function (itemAnalysis) {
146
+ return /*#__PURE__*/_react.default.createElement(_index.default, {
147
+ key: itemAnalysis.metadata.item_id,
148
+ itemAnalysis: itemAnalysis
149
+ });
150
+ }));
151
+ }
152
+ }, {
153
+ key: "render",
154
+ value: function render() {
155
+ var _this$state2 = this.state,
156
+ quizAnalysis = _this$state2.quizAnalysis,
157
+ itemAnalyses = _this$state2.itemAnalyses;
158
+
159
+ if (quizAnalysis && itemAnalyses) {
160
+ return this.renderContent();
161
+ } else {
162
+ return _ref3;
163
+ }
164
+ }
165
+ }]);
166
+ NewQuizAndItemAnalysis.displayName = "NewQuizAndItemAnalysis";
167
+ return NewQuizAndItemAnalysis;
168
+ }(_react.Component);
144
169
 
145
170
  exports.NewQuizAndItemAnalysis = NewQuizAndItemAnalysis;
171
+ NewQuizAndItemAnalysis.contextTypes = {
172
+ timezone: _propTypes.default.string,
173
+ locale: _propTypes.default.string
174
+ };
146
175
  NewQuizAndItemAnalysis.propTypes = {
147
176
  activeQuizId: _propTypes.default.string.isRequired,
148
177
  getQuizAnalysis: _propTypes.default.func.isRequired,
@@ -14,7 +14,7 @@ var getSanitizedMetricValue = function getSanitizedMetricValue(value, suffix) {
14
14
  return (0, _formatMessage.default)('N/A');
15
15
  }
16
16
 
17
- return value + (suffix ? suffix : '');
17
+ return suffix ? value + suffix : value;
18
18
  };
19
19
 
20
20
  exports.getSanitizedMetricValue = getSanitizedMetricValue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instructure/quiz-core",
3
- "version": "17.58.2-rc.8+a2806a24e",
3
+ "version": "17.59.1-rc.0+6d499126a",
4
4
  "license": "MIT",
5
5
  "description": "The Quiz React SDK by Instructure Inc.",
6
6
  "author": "Instructure, Inc. Engineering and Product Design",
@@ -41,11 +41,11 @@
41
41
  ],
42
42
  "dependencies": {
43
43
  "@instructure/outcomes-ui": "^2.1.8",
44
- "@instructure/quiz-common": "17.58.2-rc.8+a2806a24e",
45
- "@instructure/quiz-i18n": "17.58.2-rc.8+a2806a24e",
46
- "@instructure/quiz-interactions": "17.58.2-rc.8+a2806a24e",
47
- "@instructure/quiz-number-input": "17.58.2-rc.8+a2806a24e",
48
- "@instructure/quiz-rce": "17.58.2-rc.8+a2806a24e",
44
+ "@instructure/quiz-common": "17.59.1-rc.0+6d499126a",
45
+ "@instructure/quiz-i18n": "17.59.1-rc.0+6d499126a",
46
+ "@instructure/quiz-interactions": "17.59.1-rc.0+6d499126a",
47
+ "@instructure/quiz-number-input": "17.59.1-rc.0+6d499126a",
48
+ "@instructure/quiz-rce": "17.59.1-rc.0+6d499126a",
49
49
  "@instructure/ui-a11y-content": "^7.20.0",
50
50
  "@instructure/ui-alerts": "^7.20.0",
51
51
  "@instructure/ui-avatar": "^7.20.0",
@@ -106,13 +106,14 @@
106
106
  "eventemitter3": "^3.1.0",
107
107
  "humps": "^2.0.0",
108
108
  "immutable": "^3.8.1",
109
- "instructure-validations": "17.58.2-rc.8+a2806a24e",
109
+ "instructure-validations": "17.59.1-rc.0+6d499126a",
110
110
  "ipaddr.js": "^1.5.4",
111
111
  "isomorphic-fetch": "^2.2.0",
112
112
  "isuuid": "^0.1.0",
113
113
  "jwt-simple": "^0.5.0",
114
114
  "katex": "^0.10.2",
115
115
  "lodash": "^4.0.0",
116
+ "luxon": "3.3.0",
116
117
  "normalizr": "3.2.2",
117
118
  "platform": "^1.3.1",
118
119
  "prop-types": "^15.6.0",
@@ -137,7 +138,7 @@
137
138
  "uuid": "^3.2.1"
138
139
  },
139
140
  "devDependencies": {
140
- "@instructure/quiz-scripts": "17.58.1",
141
+ "@instructure/quiz-scripts": "17.59.0",
141
142
  "@instructure/ui-axe-check": "^7.20.0",
142
143
  "@instructure/ui-babel-preset": "^7.20.0",
143
144
  "@instructure/ui-karma-config": "^7.20.0",
@@ -156,7 +157,7 @@
156
157
  "intl": "^1.2.4",
157
158
  "jquery": "^2.2.3",
158
159
  "most-subject": "^5.3.0",
159
- "quiz-presets": "17.58.2-rc.8+a2806a24e",
160
+ "quiz-presets": "17.59.1-rc.0+6d499126a",
160
161
  "react": "^16.8.6",
161
162
  "react-addons-test-utils": "^15.6.2",
162
163
  "react-dom": "^16.8.6",
@@ -172,5 +173,5 @@
172
173
  "publishConfig": {
173
174
  "access": "public"
174
175
  },
175
- "gitHead": "a2806a24eb3fd90deeaf76b10b647ba9cfd9ed4a"
176
+ "gitHead": "6d499126ac832183d9fb2bdb60a9b3c55d35a45e"
176
177
  }