@instructure/quiz-core 17.56.1-rc.2 → 17.56.1-rc.3

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 (19) hide show
  1. package/es/common/util/formatTimespan.js +9 -0
  2. package/es/reporting/components/resources/NewQuizAndItemAnalysis/MetricPopover/index.js +2 -0
  3. package/es/reporting/components/resources/NewQuizAndItemAnalysis/MetricPopover/presenter.js +125 -0
  4. package/es/reporting/components/resources/NewQuizAndItemAnalysis/MetricPopover/theme.js +6 -0
  5. package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/index.js +2 -0
  6. package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/presenter.js +184 -0
  7. package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/theme.js +10 -0
  8. package/es/reporting/components/resources/NewQuizAndItemAnalysis/presenter.js +6 -21
  9. package/es/reporting/components/resources/NewQuizAndItemAnalysis/utils.js +11 -0
  10. package/lib/common/util/formatTimespan.js +11 -0
  11. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/MetricPopover/index.js +11 -0
  12. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/MetricPopover/presenter.js +150 -0
  13. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/MetricPopover/theme.js +13 -0
  14. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/index.js +11 -0
  15. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/presenter.js +211 -0
  16. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/theme.js +17 -0
  17. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/presenter.js +6 -20
  18. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/utils.js +20 -0
  19. package/package.json +9 -9
@@ -51,4 +51,13 @@ export function formatTime(time) {
51
51
  description: 'The character(s) inserted between "5 minutes" and "30 seconds" in ' + 'a timespan string like "5 minutes 30 seconds"'
52
52
  });
53
53
  return parts.join(separator);
54
+ }
55
+ export function formatTimeToFullNumeric(seconds) {
56
+ var hours = Math.floor(seconds / 3600);
57
+ var minutes = Math.floor(seconds % 3600 / 60);
58
+ var secs = seconds % 60;
59
+ var hoursStr = hours < 10 ? '0' + hours : hours;
60
+ var minutesStr = minutes < 10 ? '0' + minutes : minutes;
61
+ var secsStr = secs < 10 ? '0' + secs : secs;
62
+ return "".concat(hoursStr, ":").concat(minutesStr, ":").concat(secsStr);
54
63
  }
@@ -0,0 +1,2 @@
1
+ import { MetricPopover } from "./presenter.js";
2
+ export default MetricPopover;
@@ -0,0 +1,125 @@
1
+ import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
2
+ import _createClass from "@babel/runtime/helpers/esm/createClass";
3
+ import _inherits from "@babel/runtime/helpers/esm/inherits";
4
+ import _createSuper from "@babel/runtime/helpers/esm/createSuper";
5
+
6
+ var _dec, _class, _class2, _temp;
7
+
8
+ import React, { Component } from 'react';
9
+ import { View } from '@instructure/ui-view';
10
+ import { CloseButton, IconButton } from '@instructure/ui-buttons';
11
+ import t from '@instructure/quiz-i18n/es/format-message';
12
+ import { IconInfoLine } from '@instructure/ui-icons';
13
+ import { Text } from '@instructure/ui-text';
14
+ import { Popover } from '@instructure/ui-popover';
15
+ import { Heading } from '@instructure/ui-heading';
16
+ import { themeable } from '@instructure/ui-themeable';
17
+ import theme from "./theme.js";
18
+ var styles = {
19
+ componentId: 'fSfiS',
20
+ template: function template(theme) {
21
+ return "\n\n.fSfiS_CkEK{padding-bottom:".concat(theme.headerPaddingBottom || 'inherit', "}\n\n.fSfiS_fSpJ{display:flex;justify-content:flex-end;margin-right:-10px;margin-top:-10px}");
22
+ },
23
+ 'headerContainer': 'fSfiS_CkEK',
24
+ 'closeIconContainer': 'fSfiS_fSpJ'
25
+ };
26
+ import PropTypes from 'prop-types';
27
+
28
+ var _ref = /*#__PURE__*/React.createElement(IconInfoLine, {
29
+ size: "x-small"
30
+ });
31
+
32
+ export var MetricPopover = (_dec = themeable(theme, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
33
+ _inherits(MetricPopover, _Component);
34
+
35
+ var _super = _createSuper(MetricPopover);
36
+
37
+ function MetricPopover() {
38
+ var _this;
39
+
40
+ _classCallCheck(this, MetricPopover);
41
+
42
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
43
+ args[_key] = arguments[_key];
44
+ }
45
+
46
+ _this = _super.call.apply(_super, [this].concat(args));
47
+ _this.state = {
48
+ isContentVisible: false
49
+ };
50
+
51
+ _this.showPopover = function () {
52
+ _this.setState({
53
+ isContentVisible: true
54
+ });
55
+ };
56
+
57
+ _this.hidePopover = function () {
58
+ _this.setState({
59
+ isContentVisible: false
60
+ });
61
+ };
62
+
63
+ _this.render = function () {
64
+ return /*#__PURE__*/React.createElement(Popover, {
65
+ renderTrigger: _this.renderPopoverTrigger(),
66
+ on: "click",
67
+ screenReaderLabel: _this.props.screenReaderLabel,
68
+ shouldContainFocus: true,
69
+ shouldReturnFocus: true,
70
+ onShowContent: _this.showPopover,
71
+ onHideContent: _this.hidePopover,
72
+ isShowingContent: _this.state.isContentVisible
73
+ }, /*#__PURE__*/React.createElement(View, {
74
+ padding: "medium",
75
+ as: "div",
76
+ display: "block",
77
+ width: "248px"
78
+ }, /*#__PURE__*/React.createElement("div", {
79
+ className: styles.closeIconContainer
80
+ }, /*#__PURE__*/React.createElement(CloseButton, {
81
+ onClick: _this.hidePopover,
82
+ screenReaderLabel: t('Close popover')
83
+ })), /*#__PURE__*/React.createElement("div", {
84
+ className: styles.headerContainer
85
+ }, /*#__PURE__*/React.createElement(Heading, {
86
+ level: "h3"
87
+ }, _this.props.title)), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Heading, {
88
+ theme: {
89
+ h5FontWeight: 700
90
+ },
91
+ level: "h5"
92
+ }, _this.props.subtitle), /*#__PURE__*/React.createElement(Text, {
93
+ size: "small"
94
+ }, _this.props.body))));
95
+ };
96
+
97
+ return _this;
98
+ }
99
+
100
+ _createClass(MetricPopover, [{
101
+ key: "renderPopoverTrigger",
102
+ value: function renderPopoverTrigger() {
103
+ return /*#__PURE__*/React.createElement(IconButton, {
104
+ size: "small",
105
+ theme: {
106
+ smallHeight: '18px',
107
+ transform: 'translateY(-1px)'
108
+ },
109
+ withBackground: false,
110
+ withBorder: false,
111
+ screenReaderLabel: t('Metric tooltip'),
112
+ renderIcon: _ref
113
+ });
114
+ }
115
+ }]);
116
+
117
+ return MetricPopover;
118
+ }(Component), _class2.propTypes = {
119
+ screenReaderLabel: PropTypes.string.isRequired,
120
+ title: PropTypes.string.isRequired,
121
+ subtitle: PropTypes.string,
122
+ body: PropTypes.string.isRequired
123
+ }, _class2.defaultProps = {
124
+ subtitle: ''
125
+ }, _temp)) || _class);
@@ -0,0 +1,6 @@
1
+ export default function generator(_ref) {
2
+ var spacing = _ref.spacing;
3
+ return {
4
+ headerPaddingBottom: spacing.medium
5
+ };
6
+ }
@@ -0,0 +1,2 @@
1
+ import { NewQuizAnalysis } from "./presenter.js";
2
+ export default NewQuizAnalysis;
@@ -0,0 +1,184 @@
1
+ import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
2
+ import _createClass from "@babel/runtime/helpers/esm/createClass";
3
+ import _inherits from "@babel/runtime/helpers/esm/inherits";
4
+ import _createSuper from "@babel/runtime/helpers/esm/createSuper";
5
+
6
+ var _dec, _class, _class2, _temp;
7
+
8
+ import { Heading } from '@instructure/ui-heading';
9
+ import { Metric } from '@instructure/ui-metric';
10
+ import React, { Component } from 'react';
11
+ var styles = {
12
+ componentId: 'bsfUh',
13
+ template: function template(theme) {
14
+ return "\n\n.bsfUh_eDnN{display:flex;justify-content:space-between;padding-bottom:".concat(theme.headingPadding || 'inherit', "}\n\n.bsfUh_eKXQ{padding:").concat(theme.cardWrapperPadding || 'inherit', ";position:relative}\n\n.bsfUh_crZr{padding-top:").concat(theme.metricGroupPaddingTop || 'inherit', "}\n\n.bsfUh_eckF{text-transform:uppercase}\n\n.bsfUh_dPzc,.bsfUh_cpZE{column-gap:").concat(theme.metricsColumnGap || 'inherit', ";display:flex;flex-wrap:wrap;justify-content:flex-start;row-gap:1.5rem}\n\n.bsfUh_dPzc{margin-left:-8px}\n\n.bsfUh_dqHR{padding-left:5px}\n\n.bsfUh_bTHH{position:absolute;right:").concat(theme.viewPadding || 'inherit', ";top:").concat(theme.viewPadding || 'inherit', "}");
15
+ },
16
+ 'heading': 'bsfUh_eDnN',
17
+ 'cardWrapper': 'bsfUh_eKXQ',
18
+ 'container': 'bsfUh_crZr',
19
+ 'metricLabel': 'bsfUh_eckF',
20
+ 'metricGroup': 'bsfUh_dPzc',
21
+ 'metricsWrapper': 'bsfUh_cpZE',
22
+ 'popoverContainer': 'bsfUh_dqHR',
23
+ 'expandButtonContainer': 'bsfUh_bTHH'
24
+ };
25
+ import t from '@instructure/quiz-i18n/es/format-message';
26
+ import ExpandButton from "../../../../../common/components/shared/ExpandButton/index.js";
27
+ import { Text } from '@instructure/ui-text';
28
+ import { themeable } from '@instructure/ui-themeable';
29
+ import theme from "./theme.js";
30
+ import { getSanitizedMetricValue } from "../utils.js";
31
+ import MetricPopover from "../MetricPopover/index.js";
32
+ import { formatTimeToFullNumeric } from "../../../../../common/util/formatTimespan.js";
33
+ import PropTypes from 'prop-types';
34
+ import Card from "../../../../../common/components/shared/Card/index.js";
35
+ var stdDevPopoverTexts = {
36
+ metricLabel: 'standard deviation',
37
+ title: 'Lorem ipsum ',
38
+ subtitle: 'subtitle',
39
+ body: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor',
40
+ screenReaderLabel: 'standard deviation tooltip'
41
+ };
42
+ var cronbachsAlphaPopoverTexts = {
43
+ metricLabel: 'cronbach\'s alpha',
44
+ title: 'Lorem ipsum ',
45
+ subtitle: 'subtitle',
46
+ body: 'cronbach\'s alpha description',
47
+ screenReaderLabel: 'cronbach\'s alpha tooltip'
48
+ };
49
+
50
+ var _ref = /*#__PURE__*/React.createElement("br", null);
51
+
52
+ export var NewQuizAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
53
+ _inherits(NewQuizAnalysis, _Component);
54
+
55
+ var _super = _createSuper(NewQuizAnalysis);
56
+
57
+ function NewQuizAnalysis() {
58
+ var _this;
59
+
60
+ _classCallCheck(this, NewQuizAnalysis);
61
+
62
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
63
+ args[_key] = arguments[_key];
64
+ }
65
+
66
+ _this = _super.call.apply(_super, [this].concat(args));
67
+ _this.state = {
68
+ expanded: false
69
+ };
70
+
71
+ _this.handleToggle = function () {
72
+ _this.setState({
73
+ expanded: !_this.state.expanded
74
+ });
75
+ };
76
+
77
+ _this.renderExpanded = function () {
78
+ var scores = _this.props.quizAnalysis.scores;
79
+ return /*#__PURE__*/React.createElement("div", {
80
+ className: styles.container
81
+ }, /*#__PURE__*/React.createElement("div", {
82
+ className: styles.metricGroup
83
+ }, _this.renderMetric('median_percentage', t('median score'), t.number(scores === null || scores === void 0 ? void 0 : scores.median_percentage), '%'), _this.renderMetricWithPopover('stddev', stdDevPopoverTexts, t.number(scores === null || scores === void 0 ? void 0 : scores.stddev)), _this.renderMetricWithPopover('cronbachs_alpha', cronbachsAlphaPopoverTexts, t.number(scores === null || scores === void 0 ? void 0 : scores.cronbachs_alpha))));
84
+ };
85
+
86
+ return _this;
87
+ }
88
+
89
+ _createClass(NewQuizAnalysis, [{
90
+ key: "renderLabelWithPopover",
91
+ value: function renderLabelWithPopover(texts) {
92
+ return /*#__PURE__*/React.createElement("span", {
93
+ className: styles.metricLabel
94
+ }, texts.metricLabel, /*#__PURE__*/React.createElement("span", {
95
+ className: styles.popoverContainer
96
+ }, /*#__PURE__*/React.createElement(MetricPopover, texts)));
97
+ }
98
+ }, {
99
+ key: "renderMetric",
100
+ value: function renderMetric(key, label, value, suffix) {
101
+ return /*#__PURE__*/React.createElement(Metric, {
102
+ theme: {
103
+ valueFontWeight: 500
104
+ },
105
+ textAlign: "start",
106
+ key: key,
107
+ renderLabel: /*#__PURE__*/React.createElement("span", {
108
+ className: styles.metricLabel
109
+ }, label),
110
+ renderValue: getSanitizedMetricValue(value, suffix)
111
+ });
112
+ }
113
+ }, {
114
+ key: "renderMetricWithPopover",
115
+ value: function renderMetricWithPopover(key, texts, value) {
116
+ return /*#__PURE__*/React.createElement(Metric, {
117
+ theme: {
118
+ valueFontWeight: 500
119
+ },
120
+ textAlign: "start",
121
+ key: key,
122
+ renderLabel: this.renderLabelWithPopover(texts),
123
+ renderValue: getSanitizedMetricValue(value)
124
+ });
125
+ }
126
+ }, {
127
+ key: "render",
128
+ value: function render() {
129
+ var quizAnalysis = this.props.quizAnalysis;
130
+ var scores = quizAnalysis.scores,
131
+ attempts = quizAnalysis.attempts,
132
+ metadata = quizAnalysis.metadata;
133
+ var expanded = this.state.expanded;
134
+ return /*#__PURE__*/React.createElement(Card, {
135
+ className: styles.cardWrapper
136
+ }, /*#__PURE__*/React.createElement("div", {
137
+ className: styles.heading
138
+ }, /*#__PURE__*/React.createElement(Heading, {
139
+ level: "h4",
140
+ color: "primary"
141
+ }, t('Quiz summary:'), " ", metadata === null || metadata === void 0 ? void 0 : metadata.quiz_title)), /*#__PURE__*/React.createElement("div", {
142
+ className: styles.metricGroup
143
+ }, /*#__PURE__*/React.createElement("div", {
144
+ className: styles.metricsWrapper
145
+ }, this.renderMetric('highscore', t('high score'), scores === null || scores === void 0 ? void 0 : scores.max_percentage, '%'), this.renderMetric('lowscore', t('low score'), scores === null || scores === void 0 ? void 0 : scores.min_percentage, '%'), this.renderMetric('meanscore', t('mean score'), scores === null || scores === void 0 ? void 0 : scores.mean_percentage, '%')), /*#__PURE__*/React.createElement("div", {
146
+ className: styles.metricsWrapper
147
+ }, this.renderMetric('average_attempts', t('average attempts'), t.number(attempts === null || attempts === void 0 ? void 0 : attempts.average_attempts)), this.renderMetric('mean_elapsed_sec', t('mean elapsed time'), formatTimeToFullNumeric(attempts === null || attempts === void 0 ? void 0 : attempts.mean_elapsed_sec))), /*#__PURE__*/React.createElement("div", {
148
+ className: styles.expandButtonContainer
149
+ }, /*#__PURE__*/React.createElement(ExpandButton, {
150
+ onClick: this.handleToggle,
151
+ title: expanded ? t('collapse quiz analysis') : t('expand quiz analysis'),
152
+ isExpanded: expanded
153
+ }))), expanded && this.renderExpanded(), /*#__PURE__*/React.createElement(Text, {
154
+ size: "x-small"
155
+ }, _ref, /*#__PURE__*/React.createElement("b", null, t('Data Last Updated:')), "\xA0", t.date(Date.parse(quizAnalysis.created_timestamp), 'medium')));
156
+ }
157
+ }]);
158
+
159
+ NewQuizAnalysis.displayName = "NewQuizAnalysis";
160
+ return NewQuizAnalysis;
161
+ }(Component), _class2.propTypes = {
162
+ quizAnalysis: PropTypes.shape({
163
+ created_timestamp: PropTypes.string,
164
+ metadata: PropTypes.shape({
165
+ quiz_title: PropTypes.string
166
+ }),
167
+ scores: PropTypes.shape({
168
+ decile_distribution: PropTypes.arrayOf(PropTypes.number),
169
+ cronbachs_alpha: PropTypes.number,
170
+ stddev: PropTypes.number,
171
+ median_percentage: PropTypes.number,
172
+ max_percentage: PropTypes.number,
173
+ min_percentage: PropTypes.number,
174
+ mean_percentage: PropTypes.number
175
+ }).isRequired,
176
+ attempts: PropTypes.shape({
177
+ mean_elapsed_sec: PropTypes.number,
178
+ students_completed: PropTypes.number,
179
+ students_not_finished: PropTypes.number,
180
+ students_without_attempt: PropTypes.number,
181
+ average_attempts: PropTypes.number
182
+ }).isRequired
183
+ }).isRequired
184
+ }, _temp)) || _class);
@@ -0,0 +1,10 @@
1
+ export default function generator(_ref) {
2
+ var spacing = _ref.spacing;
3
+ return {
4
+ metricGroupPaddingTop: spacing.medium,
5
+ viewPadding: spacing.small,
6
+ headingPadding: spacing.medium,
7
+ cardWrapperPadding: spacing.medium,
8
+ metricsColumnGap: '82px'
9
+ };
10
+ }
@@ -6,11 +6,7 @@ import PropTypes from 'prop-types';
6
6
  import { Heading } from '@instructure/ui-heading';
7
7
  import { Metric, MetricGroup } from '@instructure/ui-metric';
8
8
  import Spinner from "../../../../common/components/shared/spinner/Spinner.js";
9
-
10
- var _ref4 = /*#__PURE__*/React.createElement(Heading, {
11
- level: "h3",
12
- color: "primary"
13
- }, "Quiz analysis");
9
+ import NewQuizAnalysis from "./NewQuizAnalysis/index.js";
14
10
 
15
11
  var _ref5 = /*#__PURE__*/React.createElement(Heading, {
16
12
  level: "h3",
@@ -95,26 +91,15 @@ export var NewQuizAndItemAnalysis = function NewQuizAndItemAnalysis(_ref) {
95
91
  fetch();
96
92
  }, []);
97
93
 
94
+ var _ref4 = /*#__PURE__*/React.createElement(NewQuizAnalysis, {
95
+ quizAnalysis: quizAnalysis
96
+ });
97
+
98
98
  var renderContent = function renderContent() {
99
99
  /* eslint-disable react/jsx-no-literals */
100
100
  return /*#__PURE__*/React.createElement("div", {
101
101
  className: "fs-mask"
102
- }, /*#__PURE__*/React.createElement(Heading, {
103
- level: "h2",
104
- color: "primary"
105
- }, quizAnalysis.metadata.quiz_title), _ref4, /*#__PURE__*/React.createElement(MetricGroup, null, /*#__PURE__*/React.createElement(Metric, {
106
- key: "highscore",
107
- renderLabel: "HIGH SCORE",
108
- renderValue: quizAnalysis.scores.max_percentage
109
- }), /*#__PURE__*/React.createElement(Metric, {
110
- key: "lowscore",
111
- renderLabel: "LOW SCORE",
112
- renderValue: quizAnalysis.scores.min_percentage
113
- }), /*#__PURE__*/React.createElement(Metric, {
114
- key: "meanscore",
115
- renderLabel: "MEAN SCORE",
116
- renderValue: quizAnalysis.scores.mean_percentage
117
- })), _ref5, itemAnalyses === null || itemAnalyses === void 0 ? void 0 : itemAnalyses.map(function (itemAnalysis) {
102
+ }, _ref4, _ref5, itemAnalyses === null || itemAnalyses === void 0 ? void 0 : itemAnalyses.map(function (itemAnalysis) {
118
103
  return /*#__PURE__*/React.createElement(MetricGroup, {
119
104
  key: itemAnalysis.metadata.item_id
120
105
  }, /*#__PURE__*/React.createElement(Metric, {
@@ -0,0 +1,11 @@
1
+ import t from '@instructure/quiz-i18n/es/format-message';
2
+
3
+ var getSanitizedMetricValue = function getSanitizedMetricValue(value, suffix) {
4
+ if (value === null || value === void 0) {
5
+ return t('N/A');
6
+ }
7
+
8
+ return value + (suffix ? suffix : '');
9
+ };
10
+
11
+ export { getSanitizedMetricValue };
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.formatTime = formatTime;
9
+ exports.formatTimeToFullNumeric = formatTimeToFullNumeric;
9
10
  exports.formatTimespan = void 0;
10
11
 
11
12
  var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
@@ -65,4 +66,14 @@ function formatTime(time) {
65
66
  description: 'The character(s) inserted between "5 minutes" and "30 seconds" in ' + 'a timespan string like "5 minutes 30 seconds"'
66
67
  });
67
68
  return parts.join(separator);
69
+ }
70
+
71
+ function formatTimeToFullNumeric(seconds) {
72
+ var hours = Math.floor(seconds / 3600);
73
+ var minutes = Math.floor(seconds % 3600 / 60);
74
+ var secs = seconds % 60;
75
+ var hoursStr = hours < 10 ? '0' + hours : hours;
76
+ var minutesStr = minutes < 10 ? '0' + minutes : minutes;
77
+ var secsStr = secs < 10 ? '0' + secs : secs;
78
+ return "".concat(hoursStr, ":").concat(minutesStr, ":").concat(secsStr);
68
79
  }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _presenter = require("./presenter.js");
9
+
10
+ var _default = _presenter.MetricPopover;
11
+ exports.default = _default;
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.MetricPopover = void 0;
11
+
12
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
+
14
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
15
+
16
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
17
+
18
+ var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
19
+
20
+ var _react = _interopRequireWildcard(require("react"));
21
+
22
+ var _uiView = require("@instructure/ui-view");
23
+
24
+ var _uiButtons = require("@instructure/ui-buttons");
25
+
26
+ var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
27
+
28
+ var _uiIcons = require("@instructure/ui-icons");
29
+
30
+ var _uiText = require("@instructure/ui-text");
31
+
32
+ var _uiPopover = require("@instructure/ui-popover");
33
+
34
+ var _uiHeading = require("@instructure/ui-heading");
35
+
36
+ var _uiThemeable = require("@instructure/ui-themeable");
37
+
38
+ var _theme = _interopRequireDefault(require("./theme.js"));
39
+
40
+ var _propTypes = _interopRequireDefault(require("prop-types"));
41
+
42
+ var _dec, _class, _class2, _temp;
43
+
44
+ var styles = {
45
+ componentId: 'fSfiS',
46
+ template: function template(theme) {
47
+ return "\n\n.fSfiS_CkEK{padding-bottom:".concat(theme.headerPaddingBottom || 'inherit', "}\n\n.fSfiS_fSpJ{display:flex;justify-content:flex-end;margin-right:-10px;margin-top:-10px}");
48
+ },
49
+ 'headerContainer': 'fSfiS_CkEK',
50
+ 'closeIconContainer': 'fSfiS_fSpJ'
51
+ };
52
+
53
+ var _ref = /*#__PURE__*/_react.default.createElement(_uiIcons.IconInfoLine, {
54
+ size: "x-small"
55
+ });
56
+
57
+ var MetricPopover = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
58
+ (0, _inherits2.default)(MetricPopover, _Component);
59
+
60
+ var _super = (0, _createSuper2.default)(MetricPopover);
61
+
62
+ function MetricPopover() {
63
+ var _this;
64
+
65
+ (0, _classCallCheck2.default)(this, MetricPopover);
66
+
67
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
68
+ args[_key] = arguments[_key];
69
+ }
70
+
71
+ _this = _super.call.apply(_super, [this].concat(args));
72
+ _this.state = {
73
+ isContentVisible: false
74
+ };
75
+
76
+ _this.showPopover = function () {
77
+ _this.setState({
78
+ isContentVisible: true
79
+ });
80
+ };
81
+
82
+ _this.hidePopover = function () {
83
+ _this.setState({
84
+ isContentVisible: false
85
+ });
86
+ };
87
+
88
+ _this.render = function () {
89
+ return /*#__PURE__*/_react.default.createElement(_uiPopover.Popover, {
90
+ renderTrigger: _this.renderPopoverTrigger(),
91
+ on: "click",
92
+ screenReaderLabel: _this.props.screenReaderLabel,
93
+ shouldContainFocus: true,
94
+ shouldReturnFocus: true,
95
+ onShowContent: _this.showPopover,
96
+ onHideContent: _this.hidePopover,
97
+ isShowingContent: _this.state.isContentVisible
98
+ }, /*#__PURE__*/_react.default.createElement(_uiView.View, {
99
+ padding: "medium",
100
+ as: "div",
101
+ display: "block",
102
+ width: "248px"
103
+ }, /*#__PURE__*/_react.default.createElement("div", {
104
+ className: styles.closeIconContainer
105
+ }, /*#__PURE__*/_react.default.createElement(_uiButtons.CloseButton, {
106
+ onClick: _this.hidePopover,
107
+ screenReaderLabel: (0, _formatMessage.default)('Close popover')
108
+ })), /*#__PURE__*/_react.default.createElement("div", {
109
+ className: styles.headerContainer
110
+ }, /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
111
+ level: "h3"
112
+ }, _this.props.title)), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
113
+ theme: {
114
+ h5FontWeight: 700
115
+ },
116
+ level: "h5"
117
+ }, _this.props.subtitle), /*#__PURE__*/_react.default.createElement(_uiText.Text, {
118
+ size: "small"
119
+ }, _this.props.body))));
120
+ };
121
+
122
+ return _this;
123
+ }
124
+
125
+ (0, _createClass2.default)(MetricPopover, [{
126
+ key: "renderPopoverTrigger",
127
+ value: function renderPopoverTrigger() {
128
+ return /*#__PURE__*/_react.default.createElement(_uiButtons.IconButton, {
129
+ size: "small",
130
+ theme: {
131
+ smallHeight: '18px',
132
+ transform: 'translateY(-1px)'
133
+ },
134
+ withBackground: false,
135
+ withBorder: false,
136
+ screenReaderLabel: (0, _formatMessage.default)('Metric tooltip'),
137
+ renderIcon: _ref
138
+ });
139
+ }
140
+ }]);
141
+ return MetricPopover;
142
+ }(_react.Component), _class2.propTypes = {
143
+ screenReaderLabel: _propTypes.default.string.isRequired,
144
+ title: _propTypes.default.string.isRequired,
145
+ subtitle: _propTypes.default.string,
146
+ body: _propTypes.default.string.isRequired
147
+ }, _class2.defaultProps = {
148
+ subtitle: ''
149
+ }, _temp)) || _class);
150
+ exports.MetricPopover = MetricPopover;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = generator;
7
+
8
+ function generator(_ref) {
9
+ var spacing = _ref.spacing;
10
+ return {
11
+ headerPaddingBottom: spacing.medium
12
+ };
13
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _presenter = require("./presenter.js");
9
+
10
+ var _default = _presenter.NewQuizAnalysis;
11
+ exports.default = _default;
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.NewQuizAnalysis = void 0;
11
+
12
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
+
14
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
15
+
16
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
17
+
18
+ var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
19
+
20
+ var _uiHeading = require("@instructure/ui-heading");
21
+
22
+ var _uiMetric = require("@instructure/ui-metric");
23
+
24
+ var _react = _interopRequireWildcard(require("react"));
25
+
26
+ var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
27
+
28
+ var _index = _interopRequireDefault(require("../../../../../common/components/shared/ExpandButton/index.js"));
29
+
30
+ var _uiText = require("@instructure/ui-text");
31
+
32
+ var _uiThemeable = require("@instructure/ui-themeable");
33
+
34
+ var _theme = _interopRequireDefault(require("./theme.js"));
35
+
36
+ var _utils = require("../utils.js");
37
+
38
+ var _index2 = _interopRequireDefault(require("../MetricPopover/index.js"));
39
+
40
+ var _formatTimespan = require("../../../../../common/util/formatTimespan.js");
41
+
42
+ var _propTypes = _interopRequireDefault(require("prop-types"));
43
+
44
+ var _index3 = _interopRequireDefault(require("../../../../../common/components/shared/Card/index.js"));
45
+
46
+ var _dec, _class, _class2, _temp;
47
+
48
+ var styles = {
49
+ componentId: 'bsfUh',
50
+ template: function template(theme) {
51
+ return "\n\n.bsfUh_eDnN{display:flex;justify-content:space-between;padding-bottom:".concat(theme.headingPadding || 'inherit', "}\n\n.bsfUh_eKXQ{padding:").concat(theme.cardWrapperPadding || 'inherit', ";position:relative}\n\n.bsfUh_crZr{padding-top:").concat(theme.metricGroupPaddingTop || 'inherit', "}\n\n.bsfUh_eckF{text-transform:uppercase}\n\n.bsfUh_dPzc,.bsfUh_cpZE{column-gap:").concat(theme.metricsColumnGap || 'inherit', ";display:flex;flex-wrap:wrap;justify-content:flex-start;row-gap:1.5rem}\n\n.bsfUh_dPzc{margin-left:-8px}\n\n.bsfUh_dqHR{padding-left:5px}\n\n.bsfUh_bTHH{position:absolute;right:").concat(theme.viewPadding || 'inherit', ";top:").concat(theme.viewPadding || 'inherit', "}");
52
+ },
53
+ 'heading': 'bsfUh_eDnN',
54
+ 'cardWrapper': 'bsfUh_eKXQ',
55
+ 'container': 'bsfUh_crZr',
56
+ 'metricLabel': 'bsfUh_eckF',
57
+ 'metricGroup': 'bsfUh_dPzc',
58
+ 'metricsWrapper': 'bsfUh_cpZE',
59
+ 'popoverContainer': 'bsfUh_dqHR',
60
+ 'expandButtonContainer': 'bsfUh_bTHH'
61
+ };
62
+ var stdDevPopoverTexts = {
63
+ metricLabel: 'standard deviation',
64
+ title: 'Lorem ipsum ',
65
+ subtitle: 'subtitle',
66
+ body: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor',
67
+ screenReaderLabel: 'standard deviation tooltip'
68
+ };
69
+ var cronbachsAlphaPopoverTexts = {
70
+ metricLabel: 'cronbach\'s alpha',
71
+ title: 'Lorem ipsum ',
72
+ subtitle: 'subtitle',
73
+ body: 'cronbach\'s alpha description',
74
+ screenReaderLabel: 'cronbach\'s alpha tooltip'
75
+ };
76
+
77
+ var _ref = /*#__PURE__*/_react.default.createElement("br", null);
78
+
79
+ var NewQuizAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
80
+ (0, _inherits2.default)(NewQuizAnalysis, _Component);
81
+
82
+ var _super = (0, _createSuper2.default)(NewQuizAnalysis);
83
+
84
+ function NewQuizAnalysis() {
85
+ var _this;
86
+
87
+ (0, _classCallCheck2.default)(this, NewQuizAnalysis);
88
+
89
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
90
+ args[_key] = arguments[_key];
91
+ }
92
+
93
+ _this = _super.call.apply(_super, [this].concat(args));
94
+ _this.state = {
95
+ expanded: false
96
+ };
97
+
98
+ _this.handleToggle = function () {
99
+ _this.setState({
100
+ expanded: !_this.state.expanded
101
+ });
102
+ };
103
+
104
+ _this.renderExpanded = function () {
105
+ var scores = _this.props.quizAnalysis.scores;
106
+ return /*#__PURE__*/_react.default.createElement("div", {
107
+ className: styles.container
108
+ }, /*#__PURE__*/_react.default.createElement("div", {
109
+ className: styles.metricGroup
110
+ }, _this.renderMetric('median_percentage', (0, _formatMessage.default)('median score'), _formatMessage.default.number(scores === null || scores === void 0 ? void 0 : scores.median_percentage), '%'), _this.renderMetricWithPopover('stddev', stdDevPopoverTexts, _formatMessage.default.number(scores === null || scores === void 0 ? void 0 : scores.stddev)), _this.renderMetricWithPopover('cronbachs_alpha', cronbachsAlphaPopoverTexts, _formatMessage.default.number(scores === null || scores === void 0 ? void 0 : scores.cronbachs_alpha))));
111
+ };
112
+
113
+ return _this;
114
+ }
115
+
116
+ (0, _createClass2.default)(NewQuizAnalysis, [{
117
+ key: "renderLabelWithPopover",
118
+ value: function renderLabelWithPopover(texts) {
119
+ return /*#__PURE__*/_react.default.createElement("span", {
120
+ className: styles.metricLabel
121
+ }, texts.metricLabel, /*#__PURE__*/_react.default.createElement("span", {
122
+ className: styles.popoverContainer
123
+ }, /*#__PURE__*/_react.default.createElement(_index2.default, texts)));
124
+ }
125
+ }, {
126
+ key: "renderMetric",
127
+ value: function renderMetric(key, label, value, suffix) {
128
+ return /*#__PURE__*/_react.default.createElement(_uiMetric.Metric, {
129
+ theme: {
130
+ valueFontWeight: 500
131
+ },
132
+ textAlign: "start",
133
+ key: key,
134
+ renderLabel: /*#__PURE__*/_react.default.createElement("span", {
135
+ className: styles.metricLabel
136
+ }, label),
137
+ renderValue: (0, _utils.getSanitizedMetricValue)(value, suffix)
138
+ });
139
+ }
140
+ }, {
141
+ key: "renderMetricWithPopover",
142
+ value: function renderMetricWithPopover(key, texts, value) {
143
+ return /*#__PURE__*/_react.default.createElement(_uiMetric.Metric, {
144
+ theme: {
145
+ valueFontWeight: 500
146
+ },
147
+ textAlign: "start",
148
+ key: key,
149
+ renderLabel: this.renderLabelWithPopover(texts),
150
+ renderValue: (0, _utils.getSanitizedMetricValue)(value)
151
+ });
152
+ }
153
+ }, {
154
+ key: "render",
155
+ value: function render() {
156
+ var quizAnalysis = this.props.quizAnalysis;
157
+ var scores = quizAnalysis.scores,
158
+ attempts = quizAnalysis.attempts,
159
+ metadata = quizAnalysis.metadata;
160
+ var expanded = this.state.expanded;
161
+ return /*#__PURE__*/_react.default.createElement(_index3.default, {
162
+ className: styles.cardWrapper
163
+ }, /*#__PURE__*/_react.default.createElement("div", {
164
+ className: styles.heading
165
+ }, /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
166
+ level: "h4",
167
+ color: "primary"
168
+ }, (0, _formatMessage.default)('Quiz summary:'), " ", metadata === null || metadata === void 0 ? void 0 : metadata.quiz_title)), /*#__PURE__*/_react.default.createElement("div", {
169
+ className: styles.metricGroup
170
+ }, /*#__PURE__*/_react.default.createElement("div", {
171
+ className: styles.metricsWrapper
172
+ }, this.renderMetric('highscore', (0, _formatMessage.default)('high score'), scores === null || scores === void 0 ? void 0 : scores.max_percentage, '%'), this.renderMetric('lowscore', (0, _formatMessage.default)('low score'), scores === null || scores === void 0 ? void 0 : scores.min_percentage, '%'), this.renderMetric('meanscore', (0, _formatMessage.default)('mean score'), scores === null || scores === void 0 ? void 0 : scores.mean_percentage, '%')), /*#__PURE__*/_react.default.createElement("div", {
173
+ className: styles.metricsWrapper
174
+ }, this.renderMetric('average_attempts', (0, _formatMessage.default)('average attempts'), _formatMessage.default.number(attempts === null || attempts === void 0 ? void 0 : attempts.average_attempts)), this.renderMetric('mean_elapsed_sec', (0, _formatMessage.default)('mean elapsed time'), (0, _formatTimespan.formatTimeToFullNumeric)(attempts === null || attempts === void 0 ? void 0 : attempts.mean_elapsed_sec))), /*#__PURE__*/_react.default.createElement("div", {
175
+ className: styles.expandButtonContainer
176
+ }, /*#__PURE__*/_react.default.createElement(_index.default, {
177
+ onClick: this.handleToggle,
178
+ title: expanded ? (0, _formatMessage.default)('collapse quiz analysis') : (0, _formatMessage.default)('expand quiz analysis'),
179
+ isExpanded: expanded
180
+ }))), expanded && this.renderExpanded(), /*#__PURE__*/_react.default.createElement(_uiText.Text, {
181
+ size: "x-small"
182
+ }, _ref, /*#__PURE__*/_react.default.createElement("b", null, (0, _formatMessage.default)('Data Last Updated:')), "\xA0", _formatMessage.default.date(Date.parse(quizAnalysis.created_timestamp), 'medium')));
183
+ }
184
+ }]);
185
+ NewQuizAnalysis.displayName = "NewQuizAnalysis";
186
+ return NewQuizAnalysis;
187
+ }(_react.Component), _class2.propTypes = {
188
+ quizAnalysis: _propTypes.default.shape({
189
+ created_timestamp: _propTypes.default.string,
190
+ metadata: _propTypes.default.shape({
191
+ quiz_title: _propTypes.default.string
192
+ }),
193
+ scores: _propTypes.default.shape({
194
+ decile_distribution: _propTypes.default.arrayOf(_propTypes.default.number),
195
+ cronbachs_alpha: _propTypes.default.number,
196
+ stddev: _propTypes.default.number,
197
+ median_percentage: _propTypes.default.number,
198
+ max_percentage: _propTypes.default.number,
199
+ min_percentage: _propTypes.default.number,
200
+ mean_percentage: _propTypes.default.number
201
+ }).isRequired,
202
+ attempts: _propTypes.default.shape({
203
+ mean_elapsed_sec: _propTypes.default.number,
204
+ students_completed: _propTypes.default.number,
205
+ students_not_finished: _propTypes.default.number,
206
+ students_without_attempt: _propTypes.default.number,
207
+ average_attempts: _propTypes.default.number
208
+ }).isRequired
209
+ }).isRequired
210
+ }, _temp)) || _class);
211
+ exports.NewQuizAnalysis = NewQuizAnalysis;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = generator;
7
+
8
+ function generator(_ref) {
9
+ var spacing = _ref.spacing;
10
+ return {
11
+ metricGroupPaddingTop: spacing.medium,
12
+ viewPadding: spacing.small,
13
+ headingPadding: spacing.medium,
14
+ cardWrapperPadding: spacing.medium,
15
+ metricsColumnGap: '82px'
16
+ };
17
+ }
@@ -25,10 +25,7 @@ var _uiMetric = require("@instructure/ui-metric");
25
25
 
26
26
  var _Spinner = _interopRequireDefault(require("../../../../common/components/shared/spinner/Spinner.js"));
27
27
 
28
- var _ref4 = /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
29
- level: "h3",
30
- color: "primary"
31
- }, "Quiz analysis");
28
+ var _index = _interopRequireDefault(require("./NewQuizAnalysis/index.js"));
32
29
 
33
30
  var _ref5 = /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
34
31
  level: "h3",
@@ -113,26 +110,15 @@ var NewQuizAndItemAnalysis = function NewQuizAndItemAnalysis(_ref) {
113
110
  fetch();
114
111
  }, []);
115
112
 
113
+ var _ref4 = /*#__PURE__*/_react.default.createElement(_index.default, {
114
+ quizAnalysis: quizAnalysis
115
+ });
116
+
116
117
  var renderContent = function renderContent() {
117
118
  /* eslint-disable react/jsx-no-literals */
118
119
  return /*#__PURE__*/_react.default.createElement("div", {
119
120
  className: "fs-mask"
120
- }, /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
121
- level: "h2",
122
- color: "primary"
123
- }, quizAnalysis.metadata.quiz_title), _ref4, /*#__PURE__*/_react.default.createElement(_uiMetric.MetricGroup, null, /*#__PURE__*/_react.default.createElement(_uiMetric.Metric, {
124
- key: "highscore",
125
- renderLabel: "HIGH SCORE",
126
- renderValue: quizAnalysis.scores.max_percentage
127
- }), /*#__PURE__*/_react.default.createElement(_uiMetric.Metric, {
128
- key: "lowscore",
129
- renderLabel: "LOW SCORE",
130
- renderValue: quizAnalysis.scores.min_percentage
131
- }), /*#__PURE__*/_react.default.createElement(_uiMetric.Metric, {
132
- key: "meanscore",
133
- renderLabel: "MEAN SCORE",
134
- renderValue: quizAnalysis.scores.mean_percentage
135
- })), _ref5, itemAnalyses === null || itemAnalyses === void 0 ? void 0 : itemAnalyses.map(function (itemAnalysis) {
121
+ }, _ref4, _ref5, itemAnalyses === null || itemAnalyses === void 0 ? void 0 : itemAnalyses.map(function (itemAnalysis) {
136
122
  return /*#__PURE__*/_react.default.createElement(_uiMetric.MetricGroup, {
137
123
  key: itemAnalysis.metadata.item_id
138
124
  }, /*#__PURE__*/_react.default.createElement(_uiMetric.Metric, {
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.getSanitizedMetricValue = void 0;
9
+
10
+ var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
11
+
12
+ var getSanitizedMetricValue = function getSanitizedMetricValue(value, suffix) {
13
+ if (value === null || value === void 0) {
14
+ return (0, _formatMessage.default)('N/A');
15
+ }
16
+
17
+ return value + (suffix ? suffix : '');
18
+ };
19
+
20
+ exports.getSanitizedMetricValue = getSanitizedMetricValue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instructure/quiz-core",
3
- "version": "17.56.1-rc.2+28040c2e3",
3
+ "version": "17.56.1-rc.3+1b3118f30",
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.56.1-rc.2+28040c2e3",
45
- "@instructure/quiz-i18n": "17.56.1-rc.2+28040c2e3",
46
- "@instructure/quiz-interactions": "17.56.1-rc.2+28040c2e3",
47
- "@instructure/quiz-number-input": "17.56.1-rc.2+28040c2e3",
48
- "@instructure/quiz-rce": "17.56.1-rc.2+28040c2e3",
44
+ "@instructure/quiz-common": "17.56.1-rc.3+1b3118f30",
45
+ "@instructure/quiz-i18n": "17.56.1-rc.3+1b3118f30",
46
+ "@instructure/quiz-interactions": "17.56.1-rc.3+1b3118f30",
47
+ "@instructure/quiz-number-input": "17.56.1-rc.3+1b3118f30",
48
+ "@instructure/quiz-rce": "17.56.1-rc.3+1b3118f30",
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,7 +106,7 @@
106
106
  "eventemitter3": "^3.1.0",
107
107
  "humps": "^2.0.0",
108
108
  "immutable": "^3.8.1",
109
- "instructure-validations": "17.56.1-rc.2+28040c2e3",
109
+ "instructure-validations": "17.56.1-rc.3+1b3118f30",
110
110
  "ipaddr.js": "^1.5.4",
111
111
  "isomorphic-fetch": "^2.2.0",
112
112
  "isuuid": "^0.1.0",
@@ -156,7 +156,7 @@
156
156
  "intl": "^1.2.4",
157
157
  "jquery": "^2.2.3",
158
158
  "most-subject": "^5.3.0",
159
- "quiz-presets": "17.56.1-rc.2+28040c2e3",
159
+ "quiz-presets": "17.56.1-rc.3+1b3118f30",
160
160
  "react": "^16.8.6",
161
161
  "react-addons-test-utils": "^15.6.2",
162
162
  "react-dom": "^16.8.6",
@@ -172,5 +172,5 @@
172
172
  "publishConfig": {
173
173
  "access": "public"
174
174
  },
175
- "gitHead": "28040c2e39df566c886cfaa89d82b7aa3f1841aa"
175
+ "gitHead": "1b3118f30d640f7b28562671c8a68cd6545680b1"
176
176
  }