@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.
- package/es/common/util/formatTimespan.js +9 -0
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/MetricPopover/index.js +2 -0
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/MetricPopover/presenter.js +125 -0
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/MetricPopover/theme.js +6 -0
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/index.js +2 -0
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/presenter.js +184 -0
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/theme.js +10 -0
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/presenter.js +6 -21
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/utils.js +11 -0
- package/lib/common/util/formatTimespan.js +11 -0
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/MetricPopover/index.js +11 -0
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/MetricPopover/presenter.js +150 -0
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/MetricPopover/theme.js +13 -0
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/index.js +11 -0
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/presenter.js +211 -0
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/theme.js +17 -0
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/presenter.js +6 -20
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/utils.js +20 -0
- 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,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,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
|
-
},
|
|
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,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;
|
package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/presenter.js
ADDED
|
@@ -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
|
|
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
|
-
},
|
|
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.
|
|
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.
|
|
45
|
-
"@instructure/quiz-i18n": "17.56.1-rc.
|
|
46
|
-
"@instructure/quiz-interactions": "17.56.1-rc.
|
|
47
|
-
"@instructure/quiz-number-input": "17.56.1-rc.
|
|
48
|
-
"@instructure/quiz-rce": "17.56.1-rc.
|
|
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.
|
|
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.
|
|
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": "
|
|
175
|
+
"gitHead": "1b3118f30d640f7b28562671c8a68cd6545680b1"
|
|
176
176
|
}
|