@instructure/quiz-core 18.7.0 → 18.7.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/es/reporting/api/getAnalysesExport.js +2 -2
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/ExportButton/index.js +40 -0
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/ReportCard/presenter.js +45 -12
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/exportFormats.js +1 -0
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/presenter.js +42 -12
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisState.js +3 -1
- package/lib/reporting/api/getAnalysesExport.js +5 -5
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/ExportButton/index.js +58 -0
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/ReportCard/presenter.js +47 -12
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/exportFormats.js +8 -0
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/presenter.js +44 -12
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisState.js +4 -1
- package/package.json +10 -10
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
2
2
|
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
3
3
|
import Fetcher from "../../common/util/Fetcher.js";
|
|
4
|
+
import { csvFormat } from "../components/resources/NewQuizAndItemAnalysis/exportFormats.js";
|
|
4
5
|
|
|
5
6
|
var getFetcher = function getFetcher(format) {
|
|
6
7
|
var mimeType = formatsToMimeTypes.get(format);
|
|
@@ -13,14 +14,13 @@ var getFetcher = function getFetcher(format) {
|
|
|
13
14
|
headers: {
|
|
14
15
|
'Accept': mimeType
|
|
15
16
|
},
|
|
16
|
-
|
|
17
|
+
injectMissingUserToken: true,
|
|
17
18
|
asyncResponseHandler: function asyncResponseHandler(response) {
|
|
18
19
|
return response;
|
|
19
20
|
}
|
|
20
21
|
});
|
|
21
22
|
};
|
|
22
23
|
|
|
23
|
-
export var csvFormat = 'csv';
|
|
24
24
|
var formatsToMimeTypes = new Map().set(csvFormat, 'text/csv');
|
|
25
25
|
export var getAnalysesExport = /*#__PURE__*/function () {
|
|
26
26
|
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(quizId, format) {
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import t from '@instructure/quiz-i18n/es/format-message';
|
|
4
|
+
import { quizAnalysisPropType } from "../propTypes.js";
|
|
5
|
+
import { Text } from '@instructure/ui-text';
|
|
6
|
+
import { Button } from '@instructure/ui-buttons';
|
|
7
|
+
export var ExportButton = function ExportButton(_ref) {
|
|
8
|
+
var quizAnalysis = _ref.quizAnalysis,
|
|
9
|
+
generationInProgress = _ref.generationInProgress,
|
|
10
|
+
handleExport = _ref.handleExport;
|
|
11
|
+
|
|
12
|
+
var renderExportButton = function renderExportButton(enabled) {
|
|
13
|
+
var interaction = enabled ? 'enabled' : 'disabled';
|
|
14
|
+
var color = enabled ? 'secondary' : 'primary-inverse';
|
|
15
|
+
return /*#__PURE__*/React.createElement(Button, {
|
|
16
|
+
color: color,
|
|
17
|
+
interaction: interaction,
|
|
18
|
+
onClick: handleExport,
|
|
19
|
+
theme: {
|
|
20
|
+
lineHeight: '24px'
|
|
21
|
+
}
|
|
22
|
+
}, /*#__PURE__*/React.createElement(Text, {
|
|
23
|
+
size: "medium"
|
|
24
|
+
}, t('Export CSV')));
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
if (generationInProgress || !quizAnalysis) {
|
|
28
|
+
return renderExportButton(false);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (quizAnalysis) {
|
|
32
|
+
return renderExportButton(true);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
ExportButton.propTypes = {
|
|
36
|
+
quizAnalysis: quizAnalysisPropType.isRequired,
|
|
37
|
+
generationInProgress: PropTypes.bool.isRequired,
|
|
38
|
+
handleExport: PropTypes.func.isRequired
|
|
39
|
+
};
|
|
40
|
+
export default ExportButton;
|
|
@@ -34,6 +34,8 @@ import AnalysisMetric from "../AnalysisMetric/index.js";
|
|
|
34
34
|
import Spinner from "../../../../../common/components/shared/spinner/Spinner.js";
|
|
35
35
|
import { AnalysisUpdateDate } from "../AnalysisUpdateDate/index.js";
|
|
36
36
|
import { itemAnalysisPropType, quizAnalysisPropType } from "../propTypes.js";
|
|
37
|
+
import { csvFormat } from "../exportFormats.js";
|
|
38
|
+
import { ExportButton } from "../ExportButton/index.js";
|
|
37
39
|
export var NewQuizAndItemAnalysisReportCardPresenter = (_dec = themeable(theme, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
|
|
38
40
|
_inherits(NewQuizAndItemAnalysisReportCardPresenter, _Component);
|
|
39
41
|
|
|
@@ -56,6 +58,13 @@ export var NewQuizAndItemAnalysisReportCardPresenter = (_dec = themeable(theme,
|
|
|
56
58
|
_this.props.generateReports(filter);
|
|
57
59
|
};
|
|
58
60
|
|
|
61
|
+
_this.handleExport = function (_event) {
|
|
62
|
+
var format = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : csvFormat;
|
|
63
|
+
var filter = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 'last_attempt';
|
|
64
|
+
|
|
65
|
+
_this.props.exportReports(format, filter);
|
|
66
|
+
};
|
|
67
|
+
|
|
59
68
|
_this.renderMetrics = function () {
|
|
60
69
|
var _quizAnalysis$scores, _quizAnalysis$scores2, _quizAnalysis$scores3;
|
|
61
70
|
|
|
@@ -151,26 +160,48 @@ export var NewQuizAndItemAnalysisReportCardPresenter = (_dec = themeable(theme,
|
|
|
151
160
|
}, generationInProgress ? _this.renderSpinner(t('Generation In Progress')) : _this.renderGenerateReportButton())));
|
|
152
161
|
};
|
|
153
162
|
|
|
163
|
+
_this.renderExport = function () {
|
|
164
|
+
var _this$props3 = _this.props,
|
|
165
|
+
quizAnalysis = _this$props3.quizAnalysis,
|
|
166
|
+
generationInProgress = _this$props3.generationInProgress;
|
|
167
|
+
return /*#__PURE__*/React.createElement(ExportButton, {
|
|
168
|
+
quizAnalysis: quizAnalysis,
|
|
169
|
+
generationInProgress: generationInProgress,
|
|
170
|
+
handleExport: _this.handleExport
|
|
171
|
+
});
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
_this.renderReportCardHeader = function () {
|
|
175
|
+
var _this$props4 = _this.props,
|
|
176
|
+
name = _this$props4.name,
|
|
177
|
+
exportEnabled = _this$props4.exportEnabled,
|
|
178
|
+
fetchInProgress = _this$props4.fetchInProgress;
|
|
179
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
180
|
+
className: styles.titleContainer
|
|
181
|
+
}, /*#__PURE__*/React.createElement(Flex, {
|
|
182
|
+
direction: "row",
|
|
183
|
+
wrap: "wrap",
|
|
184
|
+
justifyItems: "space-between"
|
|
185
|
+
}, /*#__PURE__*/React.createElement(Flex.Item, null, /*#__PURE__*/React.createElement(Text, {
|
|
186
|
+
size: "medium",
|
|
187
|
+
weight: "bold"
|
|
188
|
+
}, name)), exportEnabled && !fetchInProgress && /*#__PURE__*/React.createElement(Flex.Item, null, _this.renderExport())));
|
|
189
|
+
};
|
|
190
|
+
|
|
154
191
|
return _this;
|
|
155
192
|
}
|
|
156
193
|
|
|
157
194
|
_createClass(NewQuizAndItemAnalysisReportCardPresenter, [{
|
|
158
195
|
key: "render",
|
|
159
196
|
value: function render() {
|
|
160
|
-
var _this$
|
|
161
|
-
fetchInProgress = _this$
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
analysisError = _this$props3.analysisError;
|
|
197
|
+
var _this$props5 = this.props,
|
|
198
|
+
fetchInProgress = _this$props5.fetchInProgress,
|
|
199
|
+
quizAnalysis = _this$props5.quizAnalysis,
|
|
200
|
+
analysisError = _this$props5.analysisError;
|
|
165
201
|
var reportCardStyles = classnames(styles.reportCard, _defineProperty({}, styles.emptyReportCard, !quizAnalysis && !analysisError));
|
|
166
202
|
return /*#__PURE__*/React.createElement(Card, {
|
|
167
203
|
className: reportCardStyles
|
|
168
|
-
},
|
|
169
|
-
className: styles.titleContainer
|
|
170
|
-
}, /*#__PURE__*/React.createElement(Text, {
|
|
171
|
-
size: "medium",
|
|
172
|
-
weight: "bold"
|
|
173
|
-
}, name)), !fetchInProgress && quizAnalysis && this.renderQuizAnalysisSummary(), fetchInProgress && this.renderSpinner(), !fetchInProgress && this.renderReportCardFooter());
|
|
204
|
+
}, this.renderReportCardHeader(), !fetchInProgress && quizAnalysis && this.renderQuizAnalysisSummary(), fetchInProgress && this.renderSpinner(), !fetchInProgress && this.renderReportCardFooter());
|
|
174
205
|
}
|
|
175
206
|
}]);
|
|
176
207
|
|
|
@@ -184,7 +215,9 @@ export var NewQuizAndItemAnalysisReportCardPresenter = (_dec = themeable(theme,
|
|
|
184
215
|
fetchInProgress: PropTypes.bool.isRequired,
|
|
185
216
|
generationInProgress: PropTypes.bool.isRequired,
|
|
186
217
|
analysisError: PropTypes.string,
|
|
187
|
-
generateReports: PropTypes.func.isRequired
|
|
218
|
+
generateReports: PropTypes.func.isRequired,
|
|
219
|
+
exportReports: PropTypes.func.isRequired,
|
|
220
|
+
exportEnabled: PropTypes.bool.isRequired
|
|
188
221
|
}, _class2.defaultProps = {
|
|
189
222
|
name: void 0,
|
|
190
223
|
href: void 0,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export var csvFormat = 'csv';
|
|
@@ -19,6 +19,8 @@ import { getFailedToFetchReports } from "./errorMessages.js";
|
|
|
19
19
|
import { Img } from '@instructure/ui-img';
|
|
20
20
|
import errorImage from './downForRepair.svg';
|
|
21
21
|
import { PresentationContent, ScreenReaderContent } from '@instructure/ui-a11y-content';
|
|
22
|
+
import { csvFormat } from "./exportFormats.js";
|
|
23
|
+
import { ExportButton } from "./ExportButton/index.js";
|
|
22
24
|
|
|
23
25
|
var _ref = /*#__PURE__*/React.createElement(Flex.Item, {
|
|
24
26
|
align: "center"
|
|
@@ -130,6 +132,7 @@ export var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component)
|
|
|
130
132
|
};
|
|
131
133
|
|
|
132
134
|
_this.renderRightSide = function () {
|
|
135
|
+
var exportEnabled = _this.props.exportEnabled;
|
|
133
136
|
return /*#__PURE__*/React.createElement(Flex, {
|
|
134
137
|
alignItems: "center",
|
|
135
138
|
justifyItems: "space-between",
|
|
@@ -139,11 +142,24 @@ export var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component)
|
|
|
139
142
|
}, /*#__PURE__*/React.createElement(Flex.Item, {
|
|
140
143
|
padding: "0 small 0 0",
|
|
141
144
|
margin: "0 0 0 auto"
|
|
142
|
-
}, _this.renderUpdateDateWithError()), /*#__PURE__*/React.createElement(Flex.Item, {
|
|
145
|
+
}, _this.renderUpdateDateWithError()), exportEnabled && /*#__PURE__*/React.createElement(Flex.Item, {
|
|
146
|
+
margin: "0 small 0 auto"
|
|
147
|
+
}, _this.renderExport()), /*#__PURE__*/React.createElement(Flex.Item, {
|
|
143
148
|
margin: "0 0 0 auto"
|
|
144
149
|
}, _this.renderGenerationButton()));
|
|
145
150
|
};
|
|
146
151
|
|
|
152
|
+
_this.renderExport = function () {
|
|
153
|
+
var _this$props2 = _this.props,
|
|
154
|
+
quizAnalysis = _this$props2.quizAnalysis,
|
|
155
|
+
generationInProgress = _this$props2.generationInProgress;
|
|
156
|
+
return /*#__PURE__*/React.createElement(ExportButton, {
|
|
157
|
+
quizAnalysis: quizAnalysis,
|
|
158
|
+
generationInProgress: generationInProgress,
|
|
159
|
+
handleExport: _this.handleExport
|
|
160
|
+
});
|
|
161
|
+
};
|
|
162
|
+
|
|
147
163
|
_this.renderTop = function () {
|
|
148
164
|
return /*#__PURE__*/React.createElement(Flex, {
|
|
149
165
|
justifyItems: "space-between",
|
|
@@ -156,12 +172,17 @@ export var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component)
|
|
|
156
172
|
};
|
|
157
173
|
|
|
158
174
|
_this.renderTopOnFailedFetch = function () {
|
|
175
|
+
var exportEnabled = _this.props.exportEnabled;
|
|
159
176
|
return /*#__PURE__*/React.createElement(Flex, {
|
|
160
|
-
|
|
161
|
-
|
|
177
|
+
justifyItems: "end",
|
|
178
|
+
wrap: "wrap",
|
|
179
|
+
width: "auto",
|
|
162
180
|
margin: "auto",
|
|
163
|
-
direction: "
|
|
164
|
-
}, /*#__PURE__*/React.createElement(Flex.Item, {
|
|
181
|
+
direction: "row"
|
|
182
|
+
}, exportEnabled && /*#__PURE__*/React.createElement(Flex.Item, {
|
|
183
|
+
margin: "small",
|
|
184
|
+
overflowY: "visible"
|
|
185
|
+
}, _this.renderExport()), /*#__PURE__*/React.createElement(Flex.Item, {
|
|
165
186
|
overflowY: "visible"
|
|
166
187
|
}, _this.renderGenerationButton()));
|
|
167
188
|
};
|
|
@@ -200,9 +221,9 @@ export var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component)
|
|
|
200
221
|
};
|
|
201
222
|
|
|
202
223
|
_this.renderBody = function () {
|
|
203
|
-
var _this$
|
|
204
|
-
fetchInProgress = _this$
|
|
205
|
-
quizAnalysis = _this$
|
|
224
|
+
var _this$props3 = _this.props,
|
|
225
|
+
fetchInProgress = _this$props3.fetchInProgress,
|
|
226
|
+
quizAnalysis = _this$props3.quizAnalysis; // TODO need to refactor the NewQuizAnalysis to move out spinner logic
|
|
206
227
|
|
|
207
228
|
return /*#__PURE__*/React.createElement(React.Fragment, null, (fetchInProgress || quizAnalysis) && /*#__PURE__*/React.createElement(NewQuizAnalysis, {
|
|
208
229
|
quizAnalysis: quizAnalysis,
|
|
@@ -216,15 +237,22 @@ export var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component)
|
|
|
216
237
|
_this.props.generateReports(filter);
|
|
217
238
|
};
|
|
218
239
|
|
|
240
|
+
_this.handleExport = function (_event) {
|
|
241
|
+
var format = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : csvFormat;
|
|
242
|
+
var filter = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 'last_attempt';
|
|
243
|
+
|
|
244
|
+
_this.props.exportReports(format, filter);
|
|
245
|
+
};
|
|
246
|
+
|
|
219
247
|
return _this;
|
|
220
248
|
}
|
|
221
249
|
|
|
222
250
|
_createClass(NewQuizAndItemAnalysisPresenter, [{
|
|
223
251
|
key: "render",
|
|
224
252
|
value: function render() {
|
|
225
|
-
var _this$
|
|
226
|
-
analysisFetchError = _this$
|
|
227
|
-
fetchInProgress = _this$
|
|
253
|
+
var _this$props4 = this.props,
|
|
254
|
+
analysisFetchError = _this$props4.analysisFetchError,
|
|
255
|
+
fetchInProgress = _this$props4.fetchInProgress;
|
|
228
256
|
return /*#__PURE__*/React.createElement("div", {
|
|
229
257
|
className: "fs-mask"
|
|
230
258
|
}, !fetchInProgress && (analysisFetchError ? this.renderTopOnFailedFetch() : this.renderTop()), analysisFetchError ? this.renderErrorBody() : this.renderBody());
|
|
@@ -241,7 +269,9 @@ NewQuizAndItemAnalysisPresenter.propTypes = {
|
|
|
241
269
|
generationInProgress: PropTypes.bool.isRequired,
|
|
242
270
|
analysisFetchError: PropTypes.bool.isRequired,
|
|
243
271
|
analysisError: PropTypes.string,
|
|
244
|
-
generateReports: PropTypes.func.isRequired
|
|
272
|
+
generateReports: PropTypes.func.isRequired,
|
|
273
|
+
exportReports: PropTypes.func.isRequired,
|
|
274
|
+
exportEnabled: PropTypes.bool.isRequired
|
|
245
275
|
};
|
|
246
276
|
NewQuizAndItemAnalysisPresenter.defaultProps = {
|
|
247
277
|
analysisError: void 0,
|
|
@@ -9,6 +9,7 @@ import { connect } from "../../../../common/react-redux.js";
|
|
|
9
9
|
import { compose } from 'redux';
|
|
10
10
|
import { getActiveQuizId } from "../../../../common/selectors/quizzes.js";
|
|
11
11
|
import { addError } from "../../../../common/actions/alerts.js";
|
|
12
|
+
import { featureOn } from "../../../../common/util/featureCheck.js";
|
|
12
13
|
var DEFAULT_POLLING_INTERVAL = 3000;
|
|
13
14
|
export function mapStateToProps(state, ownProps) {
|
|
14
15
|
return {
|
|
@@ -23,7 +24,8 @@ export function mapStateToProps(state, ownProps) {
|
|
|
23
24
|
fetchItemAnalyses: fetchItemAnalyses,
|
|
24
25
|
fetchAnalysesStatus: fetchAnalysesStatus,
|
|
25
26
|
getAnalysesExport: getAnalysesExport,
|
|
26
|
-
pollingInterval: ownProps.pollingInterval || DEFAULT_POLLING_INTERVAL
|
|
27
|
+
pollingInterval: ownProps.pollingInterval || DEFAULT_POLLING_INTERVAL,
|
|
28
|
+
exportEnabled: featureOn('item_analysis_csv')
|
|
27
29
|
};
|
|
28
30
|
}
|
|
29
31
|
var mapDispatchToProps = {
|
|
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.getAnalysesExport =
|
|
8
|
+
exports.getAnalysesExport = void 0;
|
|
9
9
|
|
|
10
10
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
11
11
|
|
|
@@ -13,6 +13,8 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/
|
|
|
13
13
|
|
|
14
14
|
var _Fetcher = _interopRequireDefault(require("../../common/util/Fetcher.js"));
|
|
15
15
|
|
|
16
|
+
var _exportFormats = require("../components/resources/NewQuizAndItemAnalysis/exportFormats.js");
|
|
17
|
+
|
|
16
18
|
var getFetcher = function getFetcher(format) {
|
|
17
19
|
var mimeType = formatsToMimeTypes.get(format);
|
|
18
20
|
|
|
@@ -24,16 +26,14 @@ var getFetcher = function getFetcher(format) {
|
|
|
24
26
|
headers: {
|
|
25
27
|
'Accept': mimeType
|
|
26
28
|
},
|
|
27
|
-
|
|
29
|
+
injectMissingUserToken: true,
|
|
28
30
|
asyncResponseHandler: function asyncResponseHandler(response) {
|
|
29
31
|
return response;
|
|
30
32
|
}
|
|
31
33
|
});
|
|
32
34
|
};
|
|
33
35
|
|
|
34
|
-
var
|
|
35
|
-
exports.csvFormat = csvFormat;
|
|
36
|
-
var formatsToMimeTypes = new Map().set(csvFormat, 'text/csv');
|
|
36
|
+
var formatsToMimeTypes = new Map().set(_exportFormats.csvFormat, 'text/csv');
|
|
37
37
|
|
|
38
38
|
var getAnalysesExport = /*#__PURE__*/function () {
|
|
39
39
|
var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(quizId, format) {
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = exports.ExportButton = void 0;
|
|
9
|
+
|
|
10
|
+
var _react = _interopRequireDefault(require("react"));
|
|
11
|
+
|
|
12
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
13
|
+
|
|
14
|
+
var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
|
|
15
|
+
|
|
16
|
+
var _propTypes2 = require("../propTypes.js");
|
|
17
|
+
|
|
18
|
+
var _uiText = require("@instructure/ui-text");
|
|
19
|
+
|
|
20
|
+
var _uiButtons = require("@instructure/ui-buttons");
|
|
21
|
+
|
|
22
|
+
var ExportButton = function ExportButton(_ref) {
|
|
23
|
+
var quizAnalysis = _ref.quizAnalysis,
|
|
24
|
+
generationInProgress = _ref.generationInProgress,
|
|
25
|
+
handleExport = _ref.handleExport;
|
|
26
|
+
|
|
27
|
+
var renderExportButton = function renderExportButton(enabled) {
|
|
28
|
+
var interaction = enabled ? 'enabled' : 'disabled';
|
|
29
|
+
var color = enabled ? 'secondary' : 'primary-inverse';
|
|
30
|
+
return /*#__PURE__*/_react.default.createElement(_uiButtons.Button, {
|
|
31
|
+
color: color,
|
|
32
|
+
interaction: interaction,
|
|
33
|
+
onClick: handleExport,
|
|
34
|
+
theme: {
|
|
35
|
+
lineHeight: '24px'
|
|
36
|
+
}
|
|
37
|
+
}, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
|
|
38
|
+
size: "medium"
|
|
39
|
+
}, (0, _formatMessage.default)('Export CSV')));
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
if (generationInProgress || !quizAnalysis) {
|
|
43
|
+
return renderExportButton(false);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (quizAnalysis) {
|
|
47
|
+
return renderExportButton(true);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
exports.ExportButton = ExportButton;
|
|
52
|
+
ExportButton.propTypes = {
|
|
53
|
+
quizAnalysis: _propTypes2.quizAnalysisPropType.isRequired,
|
|
54
|
+
generationInProgress: _propTypes.default.bool.isRequired,
|
|
55
|
+
handleExport: _propTypes.default.func.isRequired
|
|
56
|
+
};
|
|
57
|
+
var _default = ExportButton;
|
|
58
|
+
exports.default = _default;
|
|
@@ -49,6 +49,10 @@ var _index3 = require("../AnalysisUpdateDate/index.js");
|
|
|
49
49
|
|
|
50
50
|
var _propTypes2 = require("../propTypes.js");
|
|
51
51
|
|
|
52
|
+
var _exportFormats = require("../exportFormats.js");
|
|
53
|
+
|
|
54
|
+
var _index4 = require("../ExportButton/index.js");
|
|
55
|
+
|
|
52
56
|
var _dec, _class, _class2, _temp;
|
|
53
57
|
|
|
54
58
|
var styles = {
|
|
@@ -86,6 +90,13 @@ var NewQuizAndItemAnalysisReportCardPresenter = (_dec = (0, _uiThemeable.themeab
|
|
|
86
90
|
_this.props.generateReports(filter);
|
|
87
91
|
};
|
|
88
92
|
|
|
93
|
+
_this.handleExport = function (_event) {
|
|
94
|
+
var format = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : _exportFormats.csvFormat;
|
|
95
|
+
var filter = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 'last_attempt';
|
|
96
|
+
|
|
97
|
+
_this.props.exportReports(format, filter);
|
|
98
|
+
};
|
|
99
|
+
|
|
89
100
|
_this.renderMetrics = function () {
|
|
90
101
|
var _quizAnalysis$scores, _quizAnalysis$scores2, _quizAnalysis$scores3;
|
|
91
102
|
|
|
@@ -181,26 +192,48 @@ var NewQuizAndItemAnalysisReportCardPresenter = (_dec = (0, _uiThemeable.themeab
|
|
|
181
192
|
}, generationInProgress ? _this.renderSpinner((0, _formatMessage.default)('Generation In Progress')) : _this.renderGenerateReportButton())));
|
|
182
193
|
};
|
|
183
194
|
|
|
195
|
+
_this.renderExport = function () {
|
|
196
|
+
var _this$props3 = _this.props,
|
|
197
|
+
quizAnalysis = _this$props3.quizAnalysis,
|
|
198
|
+
generationInProgress = _this$props3.generationInProgress;
|
|
199
|
+
return /*#__PURE__*/_react.default.createElement(_index4.ExportButton, {
|
|
200
|
+
quizAnalysis: quizAnalysis,
|
|
201
|
+
generationInProgress: generationInProgress,
|
|
202
|
+
handleExport: _this.handleExport
|
|
203
|
+
});
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
_this.renderReportCardHeader = function () {
|
|
207
|
+
var _this$props4 = _this.props,
|
|
208
|
+
name = _this$props4.name,
|
|
209
|
+
exportEnabled = _this$props4.exportEnabled,
|
|
210
|
+
fetchInProgress = _this$props4.fetchInProgress;
|
|
211
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
212
|
+
className: styles.titleContainer
|
|
213
|
+
}, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
|
|
214
|
+
direction: "row",
|
|
215
|
+
wrap: "wrap",
|
|
216
|
+
justifyItems: "space-between"
|
|
217
|
+
}, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, null, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
|
|
218
|
+
size: "medium",
|
|
219
|
+
weight: "bold"
|
|
220
|
+
}, name)), exportEnabled && !fetchInProgress && /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, null, _this.renderExport())));
|
|
221
|
+
};
|
|
222
|
+
|
|
184
223
|
return _this;
|
|
185
224
|
}
|
|
186
225
|
|
|
187
226
|
(0, _createClass2.default)(NewQuizAndItemAnalysisReportCardPresenter, [{
|
|
188
227
|
key: "render",
|
|
189
228
|
value: function render() {
|
|
190
|
-
var _this$
|
|
191
|
-
fetchInProgress = _this$
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
analysisError = _this$props3.analysisError;
|
|
229
|
+
var _this$props5 = this.props,
|
|
230
|
+
fetchInProgress = _this$props5.fetchInProgress,
|
|
231
|
+
quizAnalysis = _this$props5.quizAnalysis,
|
|
232
|
+
analysisError = _this$props5.analysisError;
|
|
195
233
|
var reportCardStyles = (0, _classnames2.default)(styles.reportCard, (0, _defineProperty2.default)({}, styles.emptyReportCard, !quizAnalysis && !analysisError));
|
|
196
234
|
return /*#__PURE__*/_react.default.createElement(_index.default, {
|
|
197
235
|
className: reportCardStyles
|
|
198
|
-
},
|
|
199
|
-
className: styles.titleContainer
|
|
200
|
-
}, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
|
|
201
|
-
size: "medium",
|
|
202
|
-
weight: "bold"
|
|
203
|
-
}, name)), !fetchInProgress && quizAnalysis && this.renderQuizAnalysisSummary(), fetchInProgress && this.renderSpinner(), !fetchInProgress && this.renderReportCardFooter());
|
|
236
|
+
}, this.renderReportCardHeader(), !fetchInProgress && quizAnalysis && this.renderQuizAnalysisSummary(), fetchInProgress && this.renderSpinner(), !fetchInProgress && this.renderReportCardFooter());
|
|
204
237
|
}
|
|
205
238
|
}]);
|
|
206
239
|
NewQuizAndItemAnalysisReportCardPresenter.displayName = "NewQuizAndItemAnalysisReportCardPresenter";
|
|
@@ -213,7 +246,9 @@ var NewQuizAndItemAnalysisReportCardPresenter = (_dec = (0, _uiThemeable.themeab
|
|
|
213
246
|
fetchInProgress: _propTypes.default.bool.isRequired,
|
|
214
247
|
generationInProgress: _propTypes.default.bool.isRequired,
|
|
215
248
|
analysisError: _propTypes.default.string,
|
|
216
|
-
generateReports: _propTypes.default.func.isRequired
|
|
249
|
+
generateReports: _propTypes.default.func.isRequired,
|
|
250
|
+
exportReports: _propTypes.default.func.isRequired,
|
|
251
|
+
exportEnabled: _propTypes.default.bool.isRequired
|
|
217
252
|
}, _class2.defaultProps = {
|
|
218
253
|
name: void 0,
|
|
219
254
|
href: void 0,
|
|
@@ -51,6 +51,10 @@ var _downForRepair = _interopRequireDefault(require("./downForRepair.svg"));
|
|
|
51
51
|
|
|
52
52
|
var _uiA11yContent = require("@instructure/ui-a11y-content");
|
|
53
53
|
|
|
54
|
+
var _exportFormats = require("./exportFormats.js");
|
|
55
|
+
|
|
56
|
+
var _index4 = require("./ExportButton/index.js");
|
|
57
|
+
|
|
54
58
|
var _ref = /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
|
|
55
59
|
align: "center"
|
|
56
60
|
}, /*#__PURE__*/_react.default.createElement(_uiA11yContent.PresentationContent, null, /*#__PURE__*/_react.default.createElement(_uiImg.Img, {
|
|
@@ -161,6 +165,7 @@ var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component) {
|
|
|
161
165
|
};
|
|
162
166
|
|
|
163
167
|
_this.renderRightSide = function () {
|
|
168
|
+
var exportEnabled = _this.props.exportEnabled;
|
|
164
169
|
return /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
|
|
165
170
|
alignItems: "center",
|
|
166
171
|
justifyItems: "space-between",
|
|
@@ -170,11 +175,24 @@ var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component) {
|
|
|
170
175
|
}, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
|
|
171
176
|
padding: "0 small 0 0",
|
|
172
177
|
margin: "0 0 0 auto"
|
|
173
|
-
}, _this.renderUpdateDateWithError()), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
|
|
178
|
+
}, _this.renderUpdateDateWithError()), exportEnabled && /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
|
|
179
|
+
margin: "0 small 0 auto"
|
|
180
|
+
}, _this.renderExport()), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
|
|
174
181
|
margin: "0 0 0 auto"
|
|
175
182
|
}, _this.renderGenerationButton()));
|
|
176
183
|
};
|
|
177
184
|
|
|
185
|
+
_this.renderExport = function () {
|
|
186
|
+
var _this$props2 = _this.props,
|
|
187
|
+
quizAnalysis = _this$props2.quizAnalysis,
|
|
188
|
+
generationInProgress = _this$props2.generationInProgress;
|
|
189
|
+
return /*#__PURE__*/_react.default.createElement(_index4.ExportButton, {
|
|
190
|
+
quizAnalysis: quizAnalysis,
|
|
191
|
+
generationInProgress: generationInProgress,
|
|
192
|
+
handleExport: _this.handleExport
|
|
193
|
+
});
|
|
194
|
+
};
|
|
195
|
+
|
|
178
196
|
_this.renderTop = function () {
|
|
179
197
|
return /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
|
|
180
198
|
justifyItems: "space-between",
|
|
@@ -187,12 +205,17 @@ var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component) {
|
|
|
187
205
|
};
|
|
188
206
|
|
|
189
207
|
_this.renderTopOnFailedFetch = function () {
|
|
208
|
+
var exportEnabled = _this.props.exportEnabled;
|
|
190
209
|
return /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
|
|
191
|
-
|
|
192
|
-
|
|
210
|
+
justifyItems: "end",
|
|
211
|
+
wrap: "wrap",
|
|
212
|
+
width: "auto",
|
|
193
213
|
margin: "auto",
|
|
194
|
-
direction: "
|
|
195
|
-
}, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
|
|
214
|
+
direction: "row"
|
|
215
|
+
}, exportEnabled && /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
|
|
216
|
+
margin: "small",
|
|
217
|
+
overflowY: "visible"
|
|
218
|
+
}, _this.renderExport()), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
|
|
196
219
|
overflowY: "visible"
|
|
197
220
|
}, _this.renderGenerationButton()));
|
|
198
221
|
};
|
|
@@ -231,9 +254,9 @@ var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component) {
|
|
|
231
254
|
};
|
|
232
255
|
|
|
233
256
|
_this.renderBody = function () {
|
|
234
|
-
var _this$
|
|
235
|
-
fetchInProgress = _this$
|
|
236
|
-
quizAnalysis = _this$
|
|
257
|
+
var _this$props3 = _this.props,
|
|
258
|
+
fetchInProgress = _this$props3.fetchInProgress,
|
|
259
|
+
quizAnalysis = _this$props3.quizAnalysis; // TODO need to refactor the NewQuizAnalysis to move out spinner logic
|
|
237
260
|
|
|
238
261
|
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (fetchInProgress || quizAnalysis) && /*#__PURE__*/_react.default.createElement(_index2.default, {
|
|
239
262
|
quizAnalysis: quizAnalysis,
|
|
@@ -247,15 +270,22 @@ var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component) {
|
|
|
247
270
|
_this.props.generateReports(filter);
|
|
248
271
|
};
|
|
249
272
|
|
|
273
|
+
_this.handleExport = function (_event) {
|
|
274
|
+
var format = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : _exportFormats.csvFormat;
|
|
275
|
+
var filter = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 'last_attempt';
|
|
276
|
+
|
|
277
|
+
_this.props.exportReports(format, filter);
|
|
278
|
+
};
|
|
279
|
+
|
|
250
280
|
return _this;
|
|
251
281
|
}
|
|
252
282
|
|
|
253
283
|
(0, _createClass2.default)(NewQuizAndItemAnalysisPresenter, [{
|
|
254
284
|
key: "render",
|
|
255
285
|
value: function render() {
|
|
256
|
-
var _this$
|
|
257
|
-
analysisFetchError = _this$
|
|
258
|
-
fetchInProgress = _this$
|
|
286
|
+
var _this$props4 = this.props,
|
|
287
|
+
analysisFetchError = _this$props4.analysisFetchError,
|
|
288
|
+
fetchInProgress = _this$props4.fetchInProgress;
|
|
259
289
|
return /*#__PURE__*/_react.default.createElement("div", {
|
|
260
290
|
className: "fs-mask"
|
|
261
291
|
}, !fetchInProgress && (analysisFetchError ? this.renderTopOnFailedFetch() : this.renderTop()), analysisFetchError ? this.renderErrorBody() : this.renderBody());
|
|
@@ -273,7 +303,9 @@ NewQuizAndItemAnalysisPresenter.propTypes = {
|
|
|
273
303
|
generationInProgress: _propTypes2.default.bool.isRequired,
|
|
274
304
|
analysisFetchError: _propTypes2.default.bool.isRequired,
|
|
275
305
|
analysisError: _propTypes2.default.string,
|
|
276
|
-
generateReports: _propTypes2.default.func.isRequired
|
|
306
|
+
generateReports: _propTypes2.default.func.isRequired,
|
|
307
|
+
exportReports: _propTypes2.default.func.isRequired,
|
|
308
|
+
exportEnabled: _propTypes2.default.bool.isRequired
|
|
277
309
|
};
|
|
278
310
|
NewQuizAndItemAnalysisPresenter.defaultProps = {
|
|
279
311
|
analysisError: void 0,
|
|
@@ -28,6 +28,8 @@ var _quizzes = require("../../../../common/selectors/quizzes.js");
|
|
|
28
28
|
|
|
29
29
|
var _alerts = require("../../../../common/actions/alerts.js");
|
|
30
30
|
|
|
31
|
+
var _featureCheck = require("../../../../common/util/featureCheck.js");
|
|
32
|
+
|
|
31
33
|
var DEFAULT_POLLING_INTERVAL = 3000;
|
|
32
34
|
|
|
33
35
|
function mapStateToProps(state, ownProps) {
|
|
@@ -43,7 +45,8 @@ function mapStateToProps(state, ownProps) {
|
|
|
43
45
|
fetchItemAnalyses: _getItemAnalyses.getItemAnalyses,
|
|
44
46
|
fetchAnalysesStatus: _getAnalysesStatus.getAnalysesStatus,
|
|
45
47
|
getAnalysesExport: _getAnalysesExport.getAnalysesExport,
|
|
46
|
-
pollingInterval: ownProps.pollingInterval || DEFAULT_POLLING_INTERVAL
|
|
48
|
+
pollingInterval: ownProps.pollingInterval || DEFAULT_POLLING_INTERVAL,
|
|
49
|
+
exportEnabled: (0, _featureCheck.featureOn)('item_analysis_csv')
|
|
47
50
|
};
|
|
48
51
|
}
|
|
49
52
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@instructure/quiz-core",
|
|
3
|
-
"version": "18.7.0",
|
|
3
|
+
"version": "18.7.1-rc.0+1d4875e9a",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "The Quiz React SDK by Instructure Inc.",
|
|
6
6
|
"author": "Instructure, Inc. Engineering and Product Design",
|
|
@@ -43,11 +43,11 @@
|
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@instructure/grading-utils": "^1.0.0",
|
|
45
45
|
"@instructure/outcomes-ui": "^2.1.9",
|
|
46
|
-
"@instructure/quiz-common": "
|
|
47
|
-
"@instructure/quiz-i18n": "
|
|
48
|
-
"@instructure/quiz-interactions": "
|
|
49
|
-
"@instructure/quiz-number-input": "
|
|
50
|
-
"@instructure/quiz-rce": "
|
|
46
|
+
"@instructure/quiz-common": "18.7.1-rc.0+1d4875e9a",
|
|
47
|
+
"@instructure/quiz-i18n": "18.7.1-rc.0+1d4875e9a",
|
|
48
|
+
"@instructure/quiz-interactions": "18.7.1-rc.0+1d4875e9a",
|
|
49
|
+
"@instructure/quiz-number-input": "18.7.1-rc.0+1d4875e9a",
|
|
50
|
+
"@instructure/quiz-rce": "18.7.1-rc.0+1d4875e9a",
|
|
51
51
|
"@instructure/ui-a11y-content": "^7.22.1",
|
|
52
52
|
"@instructure/ui-alerts": "^7.22.1",
|
|
53
53
|
"@instructure/ui-avatar": "^7.22.1",
|
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
"file-saver": "~2.0.5",
|
|
110
110
|
"humps": "^2.0.0",
|
|
111
111
|
"immutable": "^3.8.1",
|
|
112
|
-
"instructure-validations": "
|
|
112
|
+
"instructure-validations": "18.7.1-rc.0+1d4875e9a",
|
|
113
113
|
"ipaddr.js": "^1.5.4",
|
|
114
114
|
"isomorphic-fetch": "^2.2.0",
|
|
115
115
|
"isuuid": "^0.1.0",
|
|
@@ -141,7 +141,7 @@
|
|
|
141
141
|
"uuid": "^3.2.1"
|
|
142
142
|
},
|
|
143
143
|
"devDependencies": {
|
|
144
|
-
"@instructure/quiz-scripts": "
|
|
144
|
+
"@instructure/quiz-scripts": "18.7.0",
|
|
145
145
|
"@instructure/ui-axe-check": "^7.22.1",
|
|
146
146
|
"@instructure/ui-babel-preset": "^7.22.1",
|
|
147
147
|
"@instructure/ui-karma-config": "^7.22.1",
|
|
@@ -160,7 +160,7 @@
|
|
|
160
160
|
"intl": "^1.2.4",
|
|
161
161
|
"jquery": "^2.2.3",
|
|
162
162
|
"most-subject": "^5.3.0",
|
|
163
|
-
"quiz-presets": "
|
|
163
|
+
"quiz-presets": "18.7.1-rc.0+1d4875e9a",
|
|
164
164
|
"react": "^16.8.6",
|
|
165
165
|
"react-addons-test-utils": "^15.6.2",
|
|
166
166
|
"react-dom": "^16.8.6",
|
|
@@ -176,5 +176,5 @@
|
|
|
176
176
|
"publishConfig": {
|
|
177
177
|
"access": "public"
|
|
178
178
|
},
|
|
179
|
-
"gitHead": "
|
|
179
|
+
"gitHead": "1d4875e9a6d81b08b142fbade051b72b2aa7ad46"
|
|
180
180
|
}
|